From: hansonr Date: Sun, 22 Jul 2018 22:58:16 +0000 (-0500) Subject: JAL-3032 upgrade to Jmol 14.29.17; clearing of src2 directory X-Git-Tag: Release_2_11_4_0~45^2~18^2~512 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=a1225b9392dc7657d5cef12907385b07527d6122;p=jalview.git JAL-3032 upgrade to Jmol 14.29.17; clearing of src2 directory probably should put .gitignore on src2. Sorry about that. --- diff --git a/src2/fr/orsay/lri/varna/README_SWINGJS.txt b/src2/fr/orsay/lri/varna/README_SWINGJS.txt deleted file mode 100644 index 32f0ad6..0000000 --- a/src2/fr/orsay/lri/varna/README_SWINGJS.txt +++ /dev/null @@ -1,163 +0,0 @@ - -Status -====== - -7/3/2018 - -VARNA is running in Jalview in a browser. - -The only capability not enabled is the "duplicate" menu item. -This is because SwingJS does not implement serialization. - -1/10/2018 - -fixes VueUI handling of JFileChooser and JColorChooser callbacks not using revised SelectedFile and SelectedColor property names -implements blinking iterator when dragging to reposition RNA blob -implements annotations - -1/7/2018 - -JTable implemented, including editing; needs better efficiency -Modal dialogs are working, including file open. -Drag-and-drop of Files is working - - note that the dropped File object has bytes field with data -Animated interpolation working; switched to simple JTimer mechanism for Java and JavaScript - -1/2/2018 - -Varna is running. -modal JOptionPane implemented fully -JColorChooser implemented fully -JTable implemented; still some minor issues - - -Modal dialogs are working, except for FileOpen. -Popup menu is working. - - -Issues -====== - -- JTable has minor issues: - - Headings are not shaded - - needs attention to higher efficiency - -- DnD only implemented for files. - - probably x,y coord are off - untested - - needs checking for isolated frames (works in applet) - - -Modifications for SwingJS -========================= - -Search for "@j2sNative", "BH", or "SwingJS" - - -VARNA.java ----------- - -moved to fr.orsay.lri.varna (all SwingJS project files must be in packages) - -adds default RNA JavaScript: - - if (!thisApplet.__Info.sequenceDBN) { - thisApplet.__Info.sequenceDBN = "GGGGCCAAUAUGGCCAUCC"; - thisApplet.__Info.structureDBN = "((((((.....))))..))"; - thisApplet.__Info.title = prompt("Title?","Hello RNA world, from SwingJS!"); - } - - - -fr.orsay.lri.varna.factories.RNAFactory ---------------------------------------- - -Cannot depend upon Java ArrayIndexOutOfBounds for trapping when testing formats - -JAVA fix: Removing unnecessary exception print stack traces during testing for formats -JAVA fix: RNAFactory was not closing file reader - - - -fr.orsay.lri.varna.applications.VARNAEditor -------------------------------------------- - -switched to RNAFactory.loadSecStr((File) o) for drag-drop allows passing byte data - - -fr.orsay.lri.varna.applications.VARNAGUI ----------------------------------------- - -switched to RNAFactory.loadSecStr((File) o) for drag-drop allows passing byte data - - - -fr.orsay.lri.varna.controlers.ControleurBaseSpecialColorEditor --------------------------------------------------------------- - -Since the editor is not modal, we have to catch the window hiding event -before closing the editor. - - - -fr.orsay.lri.varna.controlers.ControleurInterpolator ----------------------------------------------------- - -switch to JTimer for interpolation -JavaScript uses 2-second delay; Java uses 15-second delay - - - -fr.orsay.lri.varna.views.PrinterTest.java ------------------------------------------ - -simpler test that does not use java.awt.font.TextLayout, which is not implemented. - - - -fr.orsay.lri.varna.VarnaPanel.java ----------------------------------- - -now implements PropertyChangeListener for asynchronous callback. - - - -fr.orsay.lri.varna.views.VueUI.java ------------------------------------- - -All JOptionPane, JFileChooser, and JColorChooser action made asynchronous. -Basically, the results OK, CANCEL, YES, NO, CLOSED, and custom button index -are delivered to instances of runnable via a PropertyChangeListener callback -to the indicated parent frame. - -Simple ERROR_OPTION and WARN_OPTION messages are handled via JavaScript Alert; -fall back options for simple showConfirmDialog and showInputDialog are used -automatically if the parent frame does not implement PropertyChangeListener. - -Initial JavaScript-only return is: - - for int-returning methods, NaN, - testable as value != Math.floor(value), where value is an int, and - for Object-returning methods, an Object that implements UIResource, - testable as event.getNewValue() instanceof UIResource. - -This allows full compatibility in Java and JavaScript. - - -See notes in fr.orsay.lri.varna.views.VueUI.java. - - - -fr.orsay.lri.varna.views.VueMenu.java -------------------------------------- - -changes JLabel to JMenuItem - not 100% sure why that is necessary. -changes JSeparator to JPopupMenu.Separator - - - -fr.orsay.lri.varna.views.VueAbout.java --------------------------------------- - -added simple JTimer for asynchronous animation -added asynchronous callback modal option for JavaScript - diff --git a/src2/fr/orsay/lri/varna/VARNA.java b/src2/fr/orsay/lri/varna/VARNA.java deleted file mode 100644 index 1f98d50..0000000 --- a/src2/fr/orsay/lri/varna/VARNA.java +++ /dev/null @@ -1,260 +0,0 @@ -package fr.orsay.lri.varna; -/* - 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. - */ -import java.awt.Component; -import java.awt.GridLayout; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; -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.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JApplet; -import javax.swing.JOptionPane; - -import fr.orsay.lri.varna.controlers.ControleurScriptParser; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionModeleStyleBaseSyntaxError; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionParameterError; -import fr.orsay.lri.varna.interfaces.InterfaceParameterLoader; -import fr.orsay.lri.varna.models.VARNAConfigLoader; -import fr.orsay.lri.varna.models.rna.RNA; - - -// @j2s issues -- see README_SWINGJS.txt - -public class VARNA extends JApplet implements InterfaceParameterLoader,DropTargetListener { - ArrayList _vpl = null; - static{ - /** - * - * @j2sNative - * - * - * if (!thisApplet.__Info.sequenceDBN) { - * thisApplet.__Info.sequenceDBN = "GGGGCCAAUAUGGCCAUCC"; - * thisApplet.__Info.structureDBN = "((((((.....))))..))"; - * thisApplet.__Info.title = "Hello RNA world, from SwingJS!";//prompt("Title?","Hello RNA world!"); - * } - * - * - * - */ - } - - -// private static final_long serialVersionUID = -2598221520127067670L; - - public VARNA() { - super(); - } - - public void init() { - try { - VARNAConfigLoader VARNAcfg = new VARNAConfigLoader(this); - - try { - _vpl = VARNAcfg.createVARNAPanels(); - for (int i=0;i<_vpl.size();i++) - { - new DropTarget(_vpl.get(i), this); - } - } catch (IOException e) { - JOptionPane.showMessageDialog(this, e.getMessage(), - "VARNA Error", JOptionPane.ERROR_MESSAGE); - } catch (ExceptionFileFormatOrSyntax e) { - JOptionPane.showMessageDialog(this, e.getMessage(), - "VARNA Error", JOptionPane.ERROR_MESSAGE); - } catch (ExceptionLoadingFailed e) { - JOptionPane.showMessageDialog(this, e.getMessage(), - "VARNA Error", JOptionPane.ERROR_MESSAGE); - } - setLayout(new GridLayout(VARNAcfg.getNbColumns(), VARNAcfg - .getNbRows())); - for (int i = 0; i < _vpl.size(); i++) { - getContentPane().add(_vpl.get(i)); - } - } catch (ExceptionParameterError e) { - VARNAPanel.errorDialogStatic(e, this); - } catch (ExceptionModeleStyleBaseSyntaxError e) { - VARNAPanel.errorDialogStatic(e, this); - } catch (ExceptionNonEqualLength e) { - VARNAPanel.errorDialogStatic(e, this); - } - - } - - public void start() { - //setVisible(true); - //repaint(); - //getContentPane().setVisible(true); - //getContentPane().repaint(); - } - - public void update() { - System.out.println("update"); - } - - public String getParameterValue(String key, String def) { - if (getParameter(key) == null) { - return def; - } else { - return getParameter(key); - } - } - - public String[][] getParameterInfo() { - return VARNAConfigLoader.getParameterInfo(); - } - - public ArrayList getPanels() - { - return _vpl; - } - - public String getSelection() - { - return getSelection(0); - } - - public String getSelection(int panel) - { - String result = "["; - VARNAPanel v = _vpl.get(panel); - List l = v.getSelectionIndices(); - for(int i=0;i0) - {result += ",";} - result += n; - - } - result += "]"; - return result; - } - - public void runScript(String script) - { - if (_vpl.size()>0) - { - VARNAPanel _vp = _vpl.get(0); - try { - ControleurScriptParser.executeScript(_vp, script); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - - public void setRNA(String seq, String str) - { - if (_vpl.size()>0) - { - try { - _vpl.get(0).drawRNA(seq, str); - } catch (ExceptionNonEqualLength e) { - e.printStackTrace(); - } - } - } - - public void setSmoothedRNA(String seq, String str) - { - if (_vpl.size()>0) - { - try { - - _vpl.get(0).drawRNAInterpolated(seq, str); - _vpl.get(0).repaint(); - } catch (ExceptionNonEqualLength e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - public void dragEnter(DropTargetDragEvent arg0) { - } - - public void dragExit(DropTargetEvent arg0) { - } - - public void dragOver(DropTargetDragEvent arg0) { - } - - public void drop(DropTargetDropEvent dtde) - { - try - { - Transferable tr = dtde.getTransferable(); - DataFlavor[] flavors = tr.getTransferDataFlavors(); - for (int i = 0; i < flavors.length; i++) - { - if (flavors[i].isFlavorJavaFileListType()) - { - dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - List list = (List) tr.getTransferData(flavors[i]); - for (int j = 0; j < list.size(); j++) - { - Object o = list.get(j); - if (dtde.getSource() instanceof DropTarget) - { - DropTarget dt = (DropTarget) dtde.getSource(); - Component c = dt.getComponent(); - if (c instanceof VARNAPanel) - { - VARNAPanel vp = (VARNAPanel) c; - // BH -- in JavaScript, the File object has a .bytes - // property that we need to maintain. - //String path = o.toString(); - vp.loadFile((File) o,true); - //vp.repaint(); BH unnecessary - } - } - } - dtde.dropComplete(true); - return; - } - } - dtde.rejectDrop(); - } - catch (Exception e) - { - e.printStackTrace(); - dtde.rejectDrop(); - } - } - - public void dropActionChanged(DropTargetDragEvent arg0) { - } - - -} - diff --git a/src2/fr/orsay/lri/varna/VARNAPanel.java b/src2/fr/orsay/lri/varna/VARNAPanel.java deleted file mode 100644 index 3ab14b7..0000000 --- a/src2/fr/orsay/lri/varna/VARNAPanel.java +++ /dev/null @@ -1,4528 +0,0 @@ -/* - 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) 2012 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.9. - VARNA version 3.9 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.9 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. - */ - -/* - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for - software and other kinds of works. - - The licenses for most software and other practical works are designed - to take away your freedom to share and change the works. By contrast, - the GNU General Public License is intended to guarantee your freedom to - share and change all versions of a program--to make sure it remains free - software for all its users. We, the Free Software Foundation, use the - GNU General Public License for most of our software; it applies also to - any other work released this way by its authors. You can apply it to - your programs, too. - - When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - them if you wish), that you receive source code or can get it if you - want it, that you can change the software or use pieces of it in new - free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you - these rights or asking you to surrender the rights. Therefore, you have - certain responsibilities if you distribute copies of the software, or if - you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether - gratis or for a fee, you must pass on to the recipients the same - freedoms that you received. You must make sure that they, too, receive - or can get the source code. And you must show them these terms so they - know their rights. - - Developers that use the GNU GPL protect your rights with two steps: - (1) assert copyright on the software, and (2) offer you this License - giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains - that there is no warranty for this free software. For both users' and - authors' sake, the GPL requires that modified versions be marked as - changed, so that their problems will not be attributed erroneously to - authors of previous versions. - - Some devices are designed to deny users access to install or run - modified versions of the software inside them, although the manufacturer - can do so. This is fundamentally incompatible with the aim of - protecting users' freedom to change the software. The systematic - pattern of such abuse occurs in the area of products for individuals to - use, which is precisely where it is most unacceptable. Therefore, we - have designed this version of the GPL to prohibit the practice for those - products. If such problems arise substantially in other domains, we - stand ready to extend this provision to those domains in future versions - of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. - States should not allow patents to restrict development and use of - software on general-purpose computers, but in those that do, we wish to - avoid the special danger that patents applied to a free program could - make it effectively proprietary. To prevent this, the GPL assures that - patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and - modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of - works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this - License. Each licensee is addressed as "you". "Licensees" and - "recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work - in a fashion requiring copyright permission, other than the making of an - exact copy. The resulting work is called a "modified version" of the - earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based - on the Program. - - To "propagate" a work means to do anything with it that, without - permission, would make you directly or secondarily liable for - infringement under applicable copyright law, except executing it on a - computer or modifying a private copy. Propagation includes copying, - distribution (with or without modification), making available to the - public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other - parties to make or receive copies. Mere interaction with a user through - a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" - to the extent that it includes a convenient and prominently visible - feature that (1) displays an appropriate copyright notice, and (2) - tells the user that there is no warranty for the work (except to the - extent that warranties are provided), that licensees may convey the - work under this License, and how to view a copy of this License. If - the interface presents a list of user commands or options, such as a - menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work - for making modifications to it. "Object code" means any non-source - form of a work. - - A "Standard Interface" means an interface that either is an official - standard defined by a recognized standards body, or, in the case of - interfaces specified for a particular programming language, one that - is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other - than the work as a whole, that (a) is included in the normal form of - packaging a Major Component, but which is not part of that Major - Component, and (b) serves only to enable use of the work with that - Major Component, or to implement a Standard Interface for which an - implementation is available to the public in source code form. A - "Major Component", in this context, means a major essential component - (kernel, window system, and so on) of the specific operating system - (if any) on which the executable work runs, or a compiler used to - produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all - the source code needed to generate, install, and (for an executable - work) run the object code and to modify the work, including scripts to - control those activities. However, it does not include the work's - System Libraries, or general-purpose tools or generally available free - programs which are used unmodified in performing those activities but - which are not part of the work. For example, Corresponding Source - includes interface definition files associated with source files for - the work, and the source code for shared libraries and dynamically - linked subprograms that the work is specifically designed to require, - such as by intimate data communication or control flow between those - subprograms and other parts of the work. - - The Corresponding Source need not include anything that users - can regenerate automatically from other parts of the Corresponding - Source. - - The Corresponding Source for a work in source code form is that - same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of - copyright on the Program, and are irrevocable provided the stated - conditions are met. This License explicitly affirms your unlimited - permission to run the unmodified Program. The output from running a - covered work is covered by this License only if the output, given its - content, constitutes a covered work. This License acknowledges your - rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not - convey, without conditions so long as your license otherwise remains - in force. You may convey covered works to others for the sole purpose - of having them make modifications exclusively for you, or provide you - with facilities for running those works, provided that you comply with - the terms of this License in conveying all material for which you do - not control copyright. Those thus making or running the covered works - for you must do so exclusively on your behalf, under your direction - and control, on terms that prohibit them from making any copies of - your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under - the conditions stated below. Sublicensing is not allowed; section 10 - makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological - measure under any applicable law fulfilling obligations under article - 11 of the WIPO copyright treaty adopted on 20 December 1996, or - similar laws prohibiting or restricting circumvention of such - measures. - - When you convey a covered work, you waive any legal power to forbid - circumvention of technological measures to the extent such circumvention - is effected by exercising rights under this License with respect to - the covered work, and you disclaim any intention to limit operation or - modification of the work as a means of enforcing, against the work's - users, your or third parties' legal rights to forbid circumvention of - technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you - receive it, in any medium, provided that you conspicuously and - appropriately publish on each copy an appropriate copyright notice; - keep intact all notices stating that this License and any - non-permissive terms added in accord with section 7 apply to the code; - keep intact all notices of the absence of any warranty; and give all - recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, - and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to - produce it from the Program, in the form of source code under the - terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent - works, which are not by their nature extensions of the covered work, - and which are not combined with it such as to form a larger program, - in or on a volume of a storage or distribution medium, is called an - "aggregate" if the compilation and its resulting copyright are not - used to limit the access or legal rights of the compilation's users - beyond what the individual works permit. Inclusion of a covered work - in an aggregate does not cause this License to apply to the other - parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms - of sections 4 and 5, provided that you also convey the - machine-readable Corresponding Source under the terms of this License, - in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded - from the Corresponding Source as a System Library, need not be - included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any - tangible personal property which is normally used for personal, family, - or household purposes, or (2) anything designed or sold for incorporation - into a dwelling. In determining whether a product is a consumer product, - doubtful cases shall be resolved in favor of coverage. For a particular - product received by a particular user, "normally used" refers to a - typical or common use of that class of product, regardless of the status - of the particular user or of the way in which the particular user - actually uses, or expects or is expected to use, the product. A product - is a consumer product regardless of whether the product has substantial - commercial, industrial or non-consumer uses, unless such uses represent - the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, - procedures, authorization keys, or other information required to install - and execute modified versions of a covered work in that User Product from - a modified version of its Corresponding Source. The information must - suffice to ensure that the continued functioning of the modified object - code is in no case prevented or interfered with solely because - modification has been made. - - If you convey an object code work under this section in, or with, or - specifically for use in, a User Product, and the conveying occurs as - part of a transaction in which the right of possession and use of the - User Product is transferred to the recipient in perpetuity or for a - fixed term (regardless of how the transaction is characterized), the - Corresponding Source conveyed under this section must be accompanied - by the Installation Information. But this requirement does not apply - if neither you nor any third party retains the ability to install - modified object code on the User Product (for example, the work has - been installed in ROM). - - The requirement to provide Installation Information does not include a - requirement to continue to provide support service, warranty, or updates - for a work that has been modified or installed by the recipient, or for - the User Product in which it has been modified or installed. Access to a - network may be denied when the modification itself materially and - adversely affects the operation of the network or violates the rules and - protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, - in accord with this section must be in a format that is publicly - documented (and with an implementation available to the public in - source code form), and must require no special password or key for - unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this - License by making exceptions from one or more of its conditions. - Additional permissions that are applicable to the entire Program shall - be treated as though they were included in this License, to the extent - that they are valid under applicable law. If additional permissions - apply only to part of the Program, that part may be used separately - under those permissions, but the entire Program remains governed by - this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option - remove any additional permissions from that copy, or from any part of - it. (Additional permissions may be written to require their own - removal in certain cases when you modify the work.) You may place - additional permissions on material, added by you to a covered work, - for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you - add to a covered work, you may (if authorized by the copyright holders of - that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further - restrictions" within the meaning of section 10. If the Program as you - received it, or any part of it, contains a notice stating that it is - governed by this License along with a term that is a further - restriction, you may remove that term. If a license document contains - a further restriction but permits relicensing or conveying under this - License, you may add to a covered work material governed by the terms - of that license document, provided that the further restriction does - not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you - must place, in the relevant source files, a statement of the - additional terms that apply to those files, or a notice indicating - where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the - form of a separately written license, or stated as exceptions; - the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly - provided under this License. Any attempt otherwise to propagate or - modify it is void, and will automatically terminate your rights under - this License (including any patent licenses granted under the third - paragraph of section 11). - - However, if you cease all violation of this License, then your - license from a particular copyright holder is reinstated (a) - provisionally, unless and until the copyright holder explicitly and - finally terminates your license, and (b) permanently, if the copyright - holder fails to notify you of the violation by some reasonable means - prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is - reinstated permanently if the copyright holder notifies you of the - violation by some reasonable means, this is the first time you have - received notice of violation of this License (for any work) from that - copyright holder, and you cure the violation prior to 30 days after - your receipt of the notice. - - Termination of your rights under this section does not terminate the - licenses of parties who have received copies or rights from you under - this License. If your rights have been terminated and not permanently - reinstated, you do not qualify to receive new licenses for the same - material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or - run a copy of the Program. Ancillary propagation of a covered work - occurring solely as a consequence of using peer-to-peer transmission - to receive a copy likewise does not require acceptance. However, - nothing other than this License grants you permission to propagate or - modify any covered work. These actions infringe copyright if you do - not accept this License. Therefore, by modifying or propagating a - covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically - receives a license from the original licensors, to run, modify and - propagate that work, subject to this License. You are not responsible - for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an - organization, or substantially all assets of one, or subdividing an - organization, or merging organizations. If propagation of a covered - work results from an entity transaction, each party to that - transaction who receives a copy of the work also receives whatever - licenses to the work the party's predecessor in interest had or could - give under the previous paragraph, plus a right to possession of the - Corresponding Source of the work from the predecessor in interest, if - the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the - rights granted or affirmed under this License. For example, you may - not impose a license fee, royalty, or other charge for exercise of - rights granted under this License, and you may not initiate litigation - (including a cross-claim or counterclaim in a lawsuit) alleging that - any patent claim is infringed by making, using, selling, offering for - sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this - License of the Program or a work on which the Program is based. The - work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims - owned or controlled by the contributor, whether already acquired or - hereafter acquired, that would be infringed by some manner, permitted - by this License, of making, using, or selling its contributor version, - but do not include claims that would be infringed only as a - consequence of further modification of the contributor version. For - purposes of this definition, "control" includes the right to grant - patent sublicenses in a manner consistent with the requirements of - this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free - patent license under the contributor's essential patent claims, to - make, use, sell, offer for sale, import and otherwise run, modify and - propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express - agreement or commitment, however denominated, not to enforce a patent - (such as an express permission to practice a patent or covenant not to - sue for patent infringement). To "grant" such a patent license to a - party means to make such an agreement or commitment not to enforce a - patent against the party. - - If you convey a covered work, knowingly relying on a patent license, - and the Corresponding Source of the work is not available for anyone - to copy, free of charge and under the terms of this License, through a - publicly available network server or other readily accessible means, - then you must either (1) cause the Corresponding Source to be so - available, or (2) arrange to deprive yourself of the benefit of the - patent license for this particular work, or (3) arrange, in a manner - consistent with the requirements of this License, to extend the patent - license to downstream recipients. "Knowingly relying" means you have - actual knowledge that, but for the patent license, your conveying the - covered work in a country, or your recipient's use of the covered work - in a country, would infringe one or more identifiable patents in that - country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or - arrangement, you convey, or propagate by procuring conveyance of, a - covered work, and grant a patent license to some of the parties - receiving the covered work authorizing them to use, propagate, modify - or convey a specific copy of the covered work, then the patent license - you grant is automatically extended to all recipients of the covered - work and works based on it. - - A patent license is "discriminatory" if it does not include within - the scope of its coverage, prohibits the exercise of, or is - conditioned on the non-exercise of one or more of the rights that are - specifically granted under this License. You may not convey a covered - work if you are a party to an arrangement with a third party that is - in the business of distributing software, under which you make payment - to the third party based on the extent of your activity of conveying - the work, and under which the third party grants, to any of the - parties who would receive the covered work from you, a discriminatory - patent license (a) in connection with copies of the covered work - conveyed by you (or copies made from those copies), or (b) primarily - for and in connection with specific products or compilations that - contain the covered work, unless you entered into that arrangement, - or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting - any implied license or other defenses to infringement that may - otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or - otherwise) that contradict the conditions of this License, they do not - excuse you from the conditions of this License. If you cannot convey a - covered work so as to satisfy simultaneously your obligations under this - License and any other pertinent obligations, then as a consequence you may - not convey it at all. For example, if you agree to terms that obligate you - to collect a royalty for further conveying from those to whom you convey - the Program, the only way you could satisfy both those terms and this - License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have - permission to link or combine any covered work with a work licensed - under version 3 of the GNU Affero General Public License into a single - combined work, and to convey the resulting work. The terms of this - License will continue to apply to the part which is the covered work, - but the special requirements of the GNU Affero General Public License, - section 13, concerning interaction through a network will apply to the - combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of - the GNU General Public License from time to time. Such new versions will - be similar in spirit to the present version, but may differ in detail to - address new problems or concerns. - - Each version is given a distinguishing version number. If the - Program specifies that a certain numbered version of the GNU General - Public License "or any later version" applies to it, you have the - option of following the terms and conditions either of that numbered - version or of any later version published by the Free Software - Foundation. If the Program does not specify a version number of the - GNU General Public License, you may choose any version ever published - by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future - versions of the GNU General Public License can be used, that proxy's - public statement of acceptance of a version permanently authorizes you - to choose that version for the Program. - - Later license versions may give you additional or different - permissions. However, no additional obligations are imposed on any - author or copyright holder as a result of your choosing to follow a - later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY - APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY - OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM - IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF - ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING - WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS - THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY - GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE - USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF - DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD - PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), - EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF - SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided - above cannot be given local legal effect according to their terms, - reviewing courts shall apply local law that most closely approximates - an absolute waiver of all civil liability in connection with the - Program, unless a warranty or assumption of liability accompanies a - copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - */ - -package fr.orsay.lri.varna; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.Stroke; -import java.awt.event.MouseEvent; -import java.awt.geom.AffineTransform; -import java.awt.geom.GeneralPath; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.awt.print.PrinterException; -import java.awt.print.PrinterJob; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.io.Reader; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Hashtable; -import java.util.Set; - -import javax.print.attribute.HashPrintRequestAttributeSet; -import javax.print.attribute.PrintRequestAttributeSet; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.undo.UndoManager; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.sax.SAXTransformerFactory; -import javax.xml.transform.sax.TransformerHandler; -import javax.xml.transform.stream.StreamResult; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.controlers.ControleurBlinkingThread; -import fr.orsay.lri.varna.controlers.ControleurClicMovement; -import fr.orsay.lri.varna.controlers.ControleurDraggedMolette; -import fr.orsay.lri.varna.controlers.ControleurInterpolator; -import fr.orsay.lri.varna.controlers.ControleurMolette; -import fr.orsay.lri.varna.controlers.ControleurVARNAPanelKeys; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.interfaces.InterfaceVARNABasesListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNARNAListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNASelectionListener; -import fr.orsay.lri.varna.models.BaseList; -import fr.orsay.lri.varna.models.FullBackup; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation; -import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; -import fr.orsay.lri.varna.models.export.SwingGraphics; -import fr.orsay.lri.varna.models.export.VueVARNAGraphics; -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModeleBackbone; -import fr.orsay.lri.varna.models.rna.ModeleBackboneElement.BackboneType; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; -import fr.orsay.lri.varna.models.rna.ModeleBasesComparison; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; -import fr.orsay.lri.varna.models.rna.RNA; -import fr.orsay.lri.varna.utils.VARNASessionParser; -import fr.orsay.lri.varna.views.VueMenu; -import fr.orsay.lri.varna.views.VueUI; - -/** - * - * BH j2s SwingJS Added PropertyChangeListener for returns from VueUI. - * - * - * - * - * The RNA 2D Panel is a lightweight component that allows for an automatic - * basic drawing of an RNA secondary structures. The drawing algorithms do not - * ensure a non-overlapping drawing of helices, thus it is possible to "spin the - * helices" through a click-and-drag approach. A typical usage of the class from - * within the constructor of a JFrame would be the following:
- * - *   VARNAPanel _rna = new VARNAPanel("CCCCAUAUGGGGACC","((((....))))...");
- *   this.getContentPane().add(_rna); - *
- * - * @version 3.4 - * @author Yann Ponty & Kevin Darty - * - */ - -public class VARNAPanel extends JPanel implements PropertyChangeListener { - - /** - * SwingJS uses a PropertyChangeEvent to signal that a pseudo-modal dialog has been closed. - * - * @param event - */ - @Override - public void propertyChange(PropertyChangeEvent event) { - Object val = event.getNewValue(); - switch (event.getPropertyName()) { - case "value": - _UI.onDialogReturn(val == null ? JOptionPane.CLOSED_OPTION : ((Integer) val).intValue()); - return; - case "SelectedFile": - case "SelectedColor": - case "inputValue": - _UI.onDialogReturn(val); - break; - } - } - - - - private static final long serialVersionUID = 8194421570308956001L; - - private RNA _RNA = new RNA(); - - private boolean _debug = false; - - private VARNAConfig _conf = new VARNAConfig(); - - private ArrayList _VARNAListeners = new ArrayList(); - private ArrayList _selectionListeners = new ArrayList(); - private ArrayList _RNAListeners = new ArrayList(); - private ArrayList _basesListeners = new ArrayList(); - - UndoManager _manager; - - // private boolean _foldMode = true; - - private Point2D.Double[] _realCoords = new Point2D.Double[0]; - private Point2D.Double[] _realCenters = new Point2D.Double[0]; - private double _scaleFactor = 1.0; - private Point2D.Double _offsetPanel = new Point2D.Double(); - private Point2D.Double _offsetRNA = new Point2D.Double(); - - private double _offX; - private double _offY; - - private ControleurBlinkingThread _blink; - private BaseList _selectedBases = new BaseList("selection"); - private ArrayList _backupSelection = new ArrayList(); - private Integer _nearestBase = null; - private Point2D.Double _lastSelectedCoord = new Point2D.Double(0.0, 0.0); - - private Point2D.Double _linkOrigin = null; - private Point2D.Double _linkDestination = null; - - private Rectangle _selectionRectangle = null; - - private boolean _highlightAnnotation = false; - - private int _titleHeight; - private Dimension _border = new Dimension(0, 0); - - private boolean _drawBBox = false; - private boolean _drawBorder = false; - - // private Point _positionRelativeSouris; - private Point _translation; - private boolean _horsCadre; - private boolean _premierAffichage; - - private ControleurInterpolator _interpolator; - /** - * If comparison mode is TRUE (ON), then the application will be used to - * display a super-structure resulting on an RNA secondary structure - * comparison. Else, the application is used by default. - */ - - private VueMenu _popup = new VueMenu(this); - - private VueUI _UI = new VueUI(this); - - private TextAnnotation _selectedAnnotation; - - /** - * Creates an RNA 2D panel with initially displays the empty structure. - * - * @throws ExceptionNonEqualLength - * - */ - public VARNAPanel() { - init(); - drawRNA(); - } - - /** - * Creates an RNA 2D panel, and creates and displays an RNA coupled with its - * secondary structure formatted as a well-balanced parenthesis with dots - * word (DBN format). - * - * @param seq - * The raw nucleotide sequence - * @param str - * The secondary structure in DBN format - * @throws ExceptionNonEqualLength - */ - - public VARNAPanel(String seq, String str) throws ExceptionNonEqualLength { - this(seq, str, RNA.DRAW_MODE_RADIATE); - } - - /** - * Creates a VARNAPanel instance, and creates and displays an RNA coupled - * with its secondary structure formatted as a well-balanced parenthesis - * with dots word (DBN format). Allows the user to choose the drawing - * algorithm to be used. - * - * @param seq - * The raw nucleotide sequence - * @param str - * The secondary structure in DBN format - * @param drawMode - * The drawing mode - * @throws ExceptionNonEqualLength - * @see RNA#DRAW_MODE_RADIATE - * @see RNA#DRAW_MODE_CIRCULAR - * @see RNA#DRAW_MODE_NAVIEW - */ - public VARNAPanel(String seq, String str, int drawMode) - throws ExceptionNonEqualLength { - this(seq, str, drawMode, ""); - } - - public VARNAPanel(Reader r) throws ExceptionNonEqualLength, - ExceptionFileFormatOrSyntax { - this(r, RNA.DRAW_MODE_RADIATE); - } - - public VARNAPanel(Reader r, int drawMode) throws ExceptionNonEqualLength, - ExceptionFileFormatOrSyntax { - this(r, drawMode, ""); - } - - public VARNAPanel(Reader r, int drawMode, String title) - throws ExceptionNonEqualLength, ExceptionFileFormatOrSyntax { - init(); - drawRNA(r, drawMode); - setTitle(title); - } - - public void setOriginLink(Point2D.Double p) { - _linkOrigin = (p); - } - - public void setDestinationLink(Point2D.Double p) { - _linkDestination = (p); - } - - public void removeLink() { - _linkOrigin = null; - _linkDestination = null; - } - - /** - * Creates a VARNAPanel instance, and displays an RNA. - * - * @param r - * The RNA to be displayed within this panel - */ - - public VARNAPanel(RNA r) { - showRNA(r); - init(); - } - - /** - * Creates a VARNAPanel instance, and creates and displays an RNA coupled - * with its secondary structure formatted as a well-balanced parenthesis - * with dots word (DBN format). Allows the user to choose the drawing - * algorithm to be used. Additionally, sets the panel's title. - * - * @param seq - * The raw nucleotide sequence - * @param str - * The secondary structure in DBN format - * @param drawMode - * The drawing mode - * @param title - * The panel title - * @throws ExceptionNonEqualLength - * @see RNA#DRAW_MODE_CIRCULAR - * @see RNA#DRAW_MODE_RADIATE - * @see RNA#DRAW_MODE_NAVIEW - */ - - public VARNAPanel(String seq, String str, int drawMode, String title) - throws ExceptionNonEqualLength { - drawRNA(seq, str, drawMode); - init(); - setTitle(title); - // VARNASecDraw._vp = this; - } - - public VARNAPanel(String seq1, String struct1, String seq2, String struct2, - int drawMode, String title) { - _conf._comparisonMode = true; - drawRNA(seq1, struct1, seq2, struct2, drawMode); - init(); - setTitle(title); - } - - private void init() { - setBackground(VARNAConfig.DEFAULT_BACKGROUND_COLOR); - _manager = new UndoManager(); - _manager.setLimit(10000); - _UI.addUndoableEditListener(_manager); - - _blink = new ControleurBlinkingThread(this, - ControleurBlinkingThread.DEFAULT_FREQUENCY, 0, 1.0, 0.0, 0.2); - _blink.start(); - - _premierAffichage = true; - _translation = new Point(0, 0); - - _horsCadre = false; - this.setFont(_conf._fontBasesGeneral); - - // ajout des controleurs au VARNAPanel - ControleurClicMovement controleurClicMovement = new ControleurClicMovement( - this); - this.addMouseListener(controleurClicMovement); - this.addMouseMotionListener(controleurClicMovement); - this.addMouseWheelListener(new ControleurMolette(this)); - - ControleurDraggedMolette ctrlDraggedMolette = new ControleurDraggedMolette( - this); - this.addMouseMotionListener(ctrlDraggedMolette); - this.addMouseListener(ctrlDraggedMolette); - - ControleurVARNAPanelKeys ctrlKey = new ControleurVARNAPanelKeys(this); - this.addKeyListener(ctrlKey); - this.addFocusListener(ctrlKey); - - _interpolator = new ControleurInterpolator(this); - /** - * - * BH SwingJS do not start this thread - * - * @j2sNative - */ - { - _interpolator.start(); - } - - } - - public void undo() { - if (_manager.canUndo()) - _manager.undo(); - } - - public void redo() { - if (_manager.canRedo()) - _manager.redo(); - } - - /** - * Sets the new style of the title font. - * - * @param newStyle - * An int that describes the new font style ("PLAIN","BOLD", - * "BOLDITALIC", or "ITALIC") - */ - public void setTitleFontStyle(int newStyle) { - _conf._titleFont = _conf._titleFont.deriveFont(newStyle); - updateTitleHeight(); - } - - /** - * Sets the new size of the title font. - * - * @param newSize - * The new size of the title font - */ - public void setTitleFontSize(float newSize) { - //System.err.println("Applying title size "+newSize); - _conf._titleFont = _conf._titleFont.deriveFont(newSize); - updateTitleHeight(); - } - - /** - * Sets the new font family to be used for the title. Available fonts are - * system-specific, yet it seems that "Arial", "Dialog", and "MonoSpaced" - * are almost always available. - * - * @param newFamily - * New font family used for the title - */ - public void setTitleFontFamily(String newFamily) { - _conf._titleFont = new Font(newFamily, _conf._titleFont.getStyle(), - _conf._titleFont.getSize()); - updateTitleHeight(); - } - - /** - * Sets the color to be used for the title. - * - * @param newColor - * A color used to draw the title - */ - public void setTitleFontColor(Color newColor) { - _conf._titleColor = newColor; - updateTitleHeight(); - } - - /** - * Sets the font size for displaying bases - * - * @param size - * Font size for base caption - */ - - public void setBaseFontSize(Float size) { - _conf._fontBasesGeneral = _conf._fontBasesGeneral.deriveFont(size); - } - - /** - * Sets the font size for displaying base numbers - * - * @param size - * Font size for base numbers - */ - - public void setNumbersFontSize(Float size) { - _conf._numbersFont = _conf._numbersFont.deriveFont(size); - } - - /** - * Sets the font style for displaying bases - * - * @param style - * An int that describes the new font style ("PLAIN","BOLD", - * "BOLDITALIC", or "ITALIC") - */ - - public void setBaseFontStyle(int style) { - _conf._fontBasesGeneral = _conf._fontBasesGeneral.deriveFont(style); - } - - private void updateTitleHeight() { - if (!getTitle().equals("")) { - _titleHeight = (int) (_conf._titleFont.getSize() * 1.5); - } else { - _titleHeight = 0; - } - if (Math.abs(this.getZoom() - 1) < .02) { - _translation.y = (int) (-getTitleHeight() / 2.0); - } - } - - /** - * Sets the panel's title, giving a short description of the RNA secondary - * structure. - * - * @param title - * The new title - */ - public void setTitle(String title) { - _RNA.setName(title); - updateTitleHeight(); - } - - /** - * Sets the distance between consecutive base numbers. Please notice that : - *
    - *
  • The first and last base are always numbered
  • - *
  • The numbering is based on the base numbers, not on the indices. So - * base numbers may appear more frequently than expected if bases are - * skipped
  • - *
  • The periodicity is measured starting from 0. This means that for a - * period of 10 and bases numbered from 1 to 52, the base numbers - * [1,10,20,30,40,50,52] will be drawn.
  • - *
- * - * @param n - * New numbering period - */ - public void setNumPeriod(int n) { - _conf._numPeriod = n; - } - - /** - * Returns the current numbering period. Please notice that : - *
    - *
  • The first and last base are always numbered
  • - *
  • The numbering is based on the base numbers, not on the indices. So - * base numbers may appear more frequently than expected if bases are - * skipped
  • - *
  • The periodicity is measured starting from 0. This means that for a - * period of 10 and bases numbered from 1 to 52, the base numbers - * [1,10,20,30,40,50,52] will be drawn.
  • - *
- * - * @return Current numbering period - */ - public int getNumPeriod() { - return _conf._numPeriod; - } - - private void setScaleFactor(double d) { - _scaleFactor = d; - } - - private double getScaleFactor() { - return _scaleFactor; - } - - private void setAutoFit(boolean fit) { - _conf._autoFit = fit; - repaint(); - } - - public void lockScrolling() { - setAutoFit(false); - setAutoCenter(false); - } - - public void unlockScrolling() { - setAutoFit(true); - setAutoCenter(true); - } - - private void drawStringOutline(VueVARNAGraphics g2D, String res, double x, - double y, double margin) { - Dimension d = g2D.getStringDimension(res); - x -= (double) d.width / 2.0; - y += (double) d.height / 2.0; - g2D.setColor(Color.GRAY); - g2D.setSelectionStroke(); - g2D.drawRect((x - margin), (y - d.height - margin), - (d.width + 2.0 * margin), (d.height + 2.0 * margin)); - } - - private void drawSymbol(VueVARNAGraphics g2D, double posx, double posy, - double normx, double normy, double radius, boolean isCIS, - ModeleBP.Edge e) { - Color bck = g2D.getColor(); - switch (e) { - case WC: - if (isCIS) { - g2D.setColor(bck); - g2D.fillCircle((posx - (radius) / 2.0), - (posy - (radius) / 2.0), radius); - g2D.drawCircle((posx - (radius) / 2.0), - (posy - (radius) / 2.0), radius); - } else { - g2D.setColor(Color.white); - g2D.fillCircle(posx - (radius) / 2.0, (posy - (radius) / 2.0), - (radius)); - g2D.setColor(bck); - g2D.drawCircle((posx - (radius) / 2.0), - (posy - (radius) / 2.0), (radius)); - } - break; - case HOOGSTEEN: { - GeneralPath p2 = new GeneralPath(); - radius /= 1.05; - p2.moveTo((float) (posx - radius * normx / 2.0 - radius * normy - / 2.0), (float) (posy - radius * normy / 2.0 + radius - * normx / 2.0)); - p2.lineTo((float) (posx + radius * normx / 2.0 - radius * normy - / 2.0), (float) (posy + radius * normy / 2.0 + radius - * normx / 2.0)); - p2.lineTo((float) (posx + radius * normx / 2.0 + radius * normy - / 2.0), (float) (posy + radius * normy / 2.0 - radius - * normx / 2.0)); - p2.lineTo((float) (posx - radius * normx / 2.0 + radius * normy - / 2.0), (float) (posy - radius * normy / 2.0 - radius - * normx / 2.0)); - p2.closePath(); - - if (isCIS) { - g2D.setColor(bck); - g2D.fill(p2); - g2D.draw(p2); - } else { - g2D.setColor(Color.white); - g2D.fill(p2); - g2D.setColor(bck); - g2D.draw(p2); - } - } - break; - case SUGAR: { - double ix = radius * normx / 2.0; - double iy = radius * normy / 2.0; - double jx = radius * normy / 2.0; - double jy = -radius * normx / 2.0; - - GeneralPath p2 = new GeneralPath(); - p2.moveTo((float) (posx - ix + jx), (float) (posy - iy + jy)); - p2.lineTo((float) (posx + ix + jx), (float) (posy + iy + jy)); - p2.lineTo((float) (posx - jx), (float) (posy - jy)); - p2.closePath(); - - if (isCIS) { - g2D.setColor(bck); - g2D.fill(p2); - g2D.draw(p2); - } else { - g2D.setColor(Color.white); - g2D.fill(p2); - g2D.setColor(bck); - g2D.draw(p2); - } - } - break; - } - g2D.setColor(bck); - } - - private void drawBasePairArc(VueVARNAGraphics g2D, int i, int j, - Point2D.Double orig, Point2D.Double dest, double scaleFactor, - ModeleBP style, double newRadius) { - double distance, coef; - if (j - i == 1) - coef = getBPHeightIncrement() * 1.75; - else - coef = getBPHeightIncrement(); - distance = dest.x - orig.x; - switch (_conf._mainBPStyle) { - case LW: { - double radiusCircle = ((RNA.BASE_PAIR_DISTANCE - _RNA.BASE_RADIUS) / 5.0) - * scaleFactor; - if (style.isCanonical()) { - if (style.isCanonicalGC()) { - if ((orig.x != dest.x) || (orig.y != dest.y)) { - g2D.drawArc((dest.x + orig.x) / 2., dest.y - - scaleFactor * _RNA.BASE_RADIUS / 2.0, - (distance - scaleFactor * _RNA.BASE_RADIUS - / 3.0), (distance * coef - scaleFactor - * _RNA.BASE_RADIUS / 3.0), 0, 180); - g2D.drawArc((dest.x + orig.x) / 2., dest.y - - scaleFactor * _RNA.BASE_RADIUS / 2.0, - (distance + scaleFactor * _RNA.BASE_RADIUS - / 3.0), (distance * coef + scaleFactor - * _RNA.BASE_RADIUS / 3.0), 0, 180); - } - } else if (style.isCanonicalAU()) { - g2D.drawArc((dest.x + orig.x) / 2., dest.y - scaleFactor - * _RNA.BASE_RADIUS / 2.0, (distance), - (distance * coef), 0, 180); - } else if (style.isWobbleUG()) { - Point2D.Double midtop = new Point2D.Double( - (dest.x + orig.x) / 2., dest.y - distance * coef - / 2. - scaleFactor * _RNA.BASE_RADIUS / 2.0); - g2D.drawArc(midtop.x, dest.y - scaleFactor - * _RNA.BASE_RADIUS / 2.0, (distance), - (distance * coef), 0, 180); - drawSymbol(g2D, midtop.x, midtop.y, 1., 0., radiusCircle, - false, ModeleBP.Edge.WC); - } else { - Point2D.Double midtop = new Point2D.Double( - (dest.x + orig.x) / 2., dest.y - distance * coef - / 2. - scaleFactor * _RNA.BASE_RADIUS / 2.0); - g2D.drawArc(midtop.x, dest.y - scaleFactor - * _RNA.BASE_RADIUS / 2.0, (distance), - (distance * coef), 0, 180); - drawSymbol(g2D, midtop.x, midtop.y, 1., 0., radiusCircle, - style.isCIS(), style.getEdgePartner5()); - } - } else { - ModeleBP.Edge p1 = style.getEdgePartner5(); - ModeleBP.Edge p2 = style.getEdgePartner3(); - Point2D.Double midtop = new Point2D.Double( - (dest.x + orig.x) / 2., dest.y - distance * coef / 2. - - scaleFactor * _RNA.BASE_RADIUS / 2.0); - g2D.drawArc(midtop.x, dest.y - scaleFactor * _RNA.BASE_RADIUS - / 2.0, (distance), (distance * coef), 0, 180); - if (p1 == p2) { - drawSymbol(g2D, midtop.x, midtop.y, 1., 0., radiusCircle, - false, style.getEdgePartner5()); - } else { - drawSymbol(g2D, midtop.x - scaleFactor * _RNA.BASE_RADIUS, - midtop.y, 1., 0., radiusCircle, style.isCIS(), p1); - drawSymbol(g2D, midtop.x + scaleFactor * _RNA.BASE_RADIUS, - midtop.y, -1., 0., radiusCircle, style.isCIS(), p2); - } - } - } - break; - case LW_ALT: { - double radiusCircle = ((RNA.BASE_PAIR_DISTANCE - _RNA.BASE_RADIUS) / 5.0) - * scaleFactor; - double distFromBaseCenter = DISTANCE_FACT*scaleFactor; - orig = new Point2D.Double(orig.x,orig.y-(distFromBaseCenter+newRadius)); - dest = new Point2D.Double(dest.x,dest.y-(distFromBaseCenter+newRadius)); - if (style.isCanonical()) { - if (style.isCanonicalGC()) { - if ((orig.x != dest.x) || (orig.y != dest.y)) { - g2D.drawArc((dest.x + orig.x) / 2., dest.y - - scaleFactor * _RNA.BASE_RADIUS / 2.0, - (distance - scaleFactor * _RNA.BASE_RADIUS - / 3.0), (distance * coef - scaleFactor - * _RNA.BASE_RADIUS / 3.0), 0, 180); - g2D.drawArc((dest.x + orig.x) / 2., dest.y - - scaleFactor * _RNA.BASE_RADIUS / 2.0, - (distance + scaleFactor * _RNA.BASE_RADIUS - / 3.0), (distance * coef + scaleFactor - * _RNA.BASE_RADIUS / 3.0), 0, 180); - } - } else if (style.isCanonicalAU()) { - g2D.drawArc((dest.x + orig.x) / 2., dest.y - scaleFactor - * _RNA.BASE_RADIUS / 2.0, (distance), - (distance * coef), 0, 180); - } - } else { - ModeleBP.Edge p1 = style.getEdgePartner5(); - ModeleBP.Edge p2 = style.getEdgePartner3(); - Point2D.Double midtop = new Point2D.Double( - (dest.x + orig.x) / 2., dest.y - distance * coef / 2. - - scaleFactor * _RNA.BASE_RADIUS / 2.0); - g2D.drawArc(midtop.x, dest.y - scaleFactor * _RNA.BASE_RADIUS - / 2.0, (distance), (distance * coef), 0, 180); - drawSymbol(g2D, orig.x, - orig.y-radiusCircle*.95, 1., 0., radiusCircle, style.isCIS(), p1); - drawSymbol(g2D, dest.x, - dest.y-radiusCircle*.95, -1., 0., radiusCircle, style.isCIS(), p2); - } - } - break; - default: - g2D.drawArc((dest.x + orig.x) / 2., dest.y - scaleFactor - * _RNA.BASE_RADIUS / 2.0, (distance), (distance * coef), 0, - 180); - break; - } - - } - - public static double DISTANCE_FACT = 2.; - - - private void drawBasePair(VueVARNAGraphics g2D, Point2D.Double orig, - Point2D.Double dest, ModeleBP style, double newRadius, - double scaleFactor) { - - double dx = dest.x - orig.x; - double dy = dest.y - orig.y; - double dist = Math.sqrt((dest.x - orig.x) * (dest.x - orig.x) - + (dest.y - orig.y) * (dest.y - orig.y)); - dx /= dist; - dy /= dist; - double nx = -dy; - double ny = dx; - orig = new Point2D.Double(orig.x + newRadius * dx, orig.y + newRadius - * dy); - dest = new Point2D.Double(dest.x - newRadius * dx, dest.y - newRadius - * dy); - switch (_conf._mainBPStyle) { - case LW: { - double radiusCircle = ((RNA.BASE_PAIR_DISTANCE - _RNA.BASE_RADIUS) / 5.0) - * scaleFactor; - if (style.isCanonical()) { - if (style.isCanonicalGC()) { - if ((orig.x != dest.x) || (orig.y != dest.y)) { - nx *= scaleFactor * _RNA.BASE_RADIUS / 4.0; - ny *= scaleFactor * _RNA.BASE_RADIUS / 4.0; - g2D.drawLine((orig.x + nx), (orig.y + ny), - (dest.x + nx), (dest.y + ny)); - g2D.drawLine((orig.x - nx), (orig.y - ny), - (dest.x - nx), (dest.y - ny)); - } - } else if (style.isCanonicalAU()) { - g2D.drawLine(orig.x, orig.y, dest.x, dest.y); - } else if (style.isWobbleUG()) { - double cx = (dest.x + orig.x) / 2.0; - double cy = (dest.y + orig.y) / 2.0; - g2D.drawLine(orig.x, orig.y, dest.x, dest.y); - drawSymbol(g2D, cx, cy, nx, ny, radiusCircle, false, - ModeleBP.Edge.WC); - } else { - double cx = (dest.x + orig.x) / 2.0; - double cy = (dest.y + orig.y) / 2.0; - g2D.drawLine(orig.x, orig.y, dest.x, dest.y); - drawSymbol(g2D, cx, cy, nx, ny, radiusCircle, - style.isCIS(), style.getEdgePartner5()); - } - } else { - ModeleBP.Edge p1 = style.getEdgePartner5(); - ModeleBP.Edge p2 = style.getEdgePartner3(); - double cx = (dest.x + orig.x) / 2.0; - double cy = (dest.y + orig.y) / 2.0; - g2D.drawLine(orig.x, orig.y, dest.x, dest.y); - if (p1 == p2) { - drawSymbol(g2D, cx, cy, nx, ny, radiusCircle, - style.isCIS(), p1); - - } else { - double vdx = (dest.x - orig.x); - double vdy = (dest.y - orig.y); - vdx /= 6.0; - vdy /= 6.0; - drawSymbol(g2D, cx + vdx, cy + vdy, -nx, -ny, radiusCircle, - style.isCIS(), p2); - drawSymbol(g2D, cx - vdx, cy - vdy, nx, ny, radiusCircle, - style.isCIS(), p1); - } - } - } - break; - case LW_ALT: { - double radiusCircle = ((RNA.BASE_PAIR_DISTANCE - _RNA.BASE_RADIUS) / 5.0) - * scaleFactor; - double distFromBaseCenter = DISTANCE_FACT*scaleFactor; - Point2D.Double norig = new Point2D.Double(orig.x+(distFromBaseCenter+.5*newRadius)*dx,orig.y+(distFromBaseCenter+.5*newRadius)*dy); - Point2D.Double ndest = new Point2D.Double(dest.x-(distFromBaseCenter+.5*newRadius)*dx,dest.y-(distFromBaseCenter+.5*newRadius)*dy); - if (style.isCanonical()) { - if (style.isCanonicalGC()) { - if ((norig.x != ndest.x) || (norig.y != ndest.y)) { - nx *= scaleFactor * _RNA.BASE_RADIUS / 4.0; - ny *= scaleFactor * _RNA.BASE_RADIUS / 4.0; - g2D.drawLine((norig.x + nx), (norig.y + ny), - (ndest.x + nx), (ndest.y + ny)); - g2D.drawLine((norig.x - nx), (norig.y - ny), - (ndest.x - nx), (ndest.y - ny)); - } - } else if (style.isCanonicalAU()) { - g2D.drawLine(norig.x, norig.y, ndest.x, ndest.y); - } else if (style.isWobbleUG()) { - double cx = (ndest.x + norig.x) / 2.0; - double cy = (ndest.y + norig.y) / 2.0; - g2D.drawLine(norig.x, norig.y, ndest.x, ndest.y); - drawSymbol(g2D, cx, cy, nx, ny, radiusCircle, false, - ModeleBP.Edge.WC); - } else { - double cx = (ndest.x + norig.x) / 2.0; - double cy = (ndest.y + norig.y) / 2.0; - g2D.drawLine(norig.x, norig.y, ndest.x, ndest.y); - drawSymbol(g2D, cx, cy, nx, ny, radiusCircle, - style.isCIS(), style.getEdgePartner5()); - } - } else { - ModeleBP.Edge p1 = style.getEdgePartner5(); - ModeleBP.Edge p2 = style.getEdgePartner3(); - double cx = (ndest.x + norig.x) / 2.0; - double cy = (ndest.y + norig.y) / 2.0; - g2D.drawLine(norig.x, norig.y, ndest.x, ndest.y); - if (p1 == p2) { - drawSymbol(g2D, cx, cy, nx, ny, radiusCircle, - style.isCIS(), p1); - - } else { - double fac = .4; - drawSymbol(g2D, ndest.x - fac*radiusCircle*dx, ndest.y - fac*radiusCircle*dy, -nx, -ny, radiusCircle, - style.isCIS(), p2); - drawSymbol(g2D, norig.x + fac*radiusCircle*dx, norig.y + fac*radiusCircle*dy, nx, ny, radiusCircle, - style.isCIS(), p1); - } - } - } - break; - case SIMPLE: - g2D.drawLine(orig.x, orig.y, dest.x, dest.y); - break; - case RNAVIZ: - double xcenter = (orig.x + dest.x) / 2.0; - double ycenter = (orig.y + dest.y) / 2.0; - double radius = Math.max(4.0 * scaleFactor, 1.0); - g2D.fillCircle((xcenter - radius), (ycenter - radius), - (2.0 * radius)); - break; - case NONE: - break; - } - } - - private Color getHighlightedVersion(Color c1, Color c2) { - int r1 = c1.getRed(); - int g1 = c1.getGreen(); - int b1 = c1.getBlue(); - int r2 = c2.getRed(); - int g2 = c2.getGreen(); - int b2 = c2.getBlue(); - double val = _blink.getVal(); - int nr = Math.max(0, - Math.min((int) ((r1 * val + r2 * (1.0 - val))), 255)); - int ng = Math.max(0, - Math.min((int) ((g1 * val + g2 * (1.0 - val))), 255)); - int nb = Math.max(0, - Math.min((int) ((b1 * val + b2 * (1.0 - val))), 255)); - return new Color(nr, ng, nb); - } - - private Color highlightFilter(int index, Color initialColor, Color c1, - Color c2, boolean localView) { - if (_selectedBases.contains(_RNA.getBaseAt(index)) && localView) { - return getHighlightedVersion(c1, c2); - } else - return initialColor; - } - - public static Point2D.Double computeExcentricUnitVector(int i, - Point2D.Double[] points, Point2D.Double[] centers) { - double dist = points[i].distance(centers[i]); - Point2D.Double byCenter = new Point2D.Double( - (points[i].x - centers[i].x) / dist, - (points[i].y - centers[i].y) / dist); - if ((i > 0) && (i < points.length - 1)) { - Point2D.Double p0 = points[i - 1]; - Point2D.Double p1 = points[i]; - Point2D.Double p2 = points[i + 1]; - double dist1 = p2.distance(p1); - Point2D.Double v1 = new Point2D.Double((p2.x - p1.x) / dist1, - (p2.y - p1.y) / dist1); - Point2D.Double vn1 = new Point2D.Double(v1.y, -v1.x); - double dist2 = p1.distance(p0); - Point2D.Double v2 = new Point2D.Double((p1.x - p0.x) / dist2, - (p1.y - p0.y) / dist2); - Point2D.Double vn2 = new Point2D.Double(v2.y, -v2.x); - Point2D.Double vn = new Point2D.Double((vn1.x + vn2.x) / 2.0, - (vn1.y + vn2.y) / 2.0); - double D = vn.distance(new Point2D.Double(0.0, 0.0)); - vn.x /= D; - vn.y /= D; - if (byCenter.x * vn.x + byCenter.y * vn.y < 0) { - vn.x = -vn.x; - vn.y = -vn.y; - } - return vn; - } - else if (((i==0) || (i==points.length-1)) && (points.length>1)) { - int a = (i==0)?0:points.length-1; - int b = (i==0)?1:points.length-2; - double D = points[a].distance(points[b]); - return new Point2D.Double( - (points[a].x - points[b].x) / D, - (points[a].y - points[b].y) / D); - } - else { - return byCenter; - } - } - - private void drawBase(VueVARNAGraphics g2D, int i, Point2D.Double[] points, - Point2D.Double[] centers, double newRadius, double _scaleFactor, - boolean localView) { - Point2D.Double p = points[i]; - ModeleBase mb = _RNA.get_listeBases().get(i); - g2D.setFont(_conf._fontBasesGeneral); - Color baseInnerColor = highlightFilter(i, - _RNA.getBaseInnerColor(i, _conf), Color.white, - _RNA.getBaseInnerColor(i, _conf), localView); - Color baseOuterColor = highlightFilter(i, - _RNA.getBaseOuterColor(i, _conf), - _RNA.getBaseOuterColor(i, _conf), Color.white, localView); - Color baseNameColor = highlightFilter(i, - _RNA.getBaseNameColor(i, _conf), - _RNA.getBaseNameColor(i, _conf), Color.white, localView); - if ( RNA.whiteLabelPreferrable(baseInnerColor)) - { - baseNameColor=Color.white; - } - - if (mb instanceof ModeleBaseNucleotide) { - ModeleBaseNucleotide mbn = (ModeleBaseNucleotide) mb; - String res = mbn.getBase(); - if (_hoveredBase == mb && localView && isModifiable()) { - g2D.setColor(_conf._hoverColor); - g2D.fillCircle(p.getX() - 1.5 * newRadius, p.getY() - 1.5 - * newRadius, 3.0 * newRadius); - g2D.setColor(_conf._hoverColor.darker()); - g2D.drawCircle(p.getX() - 1.5 * newRadius, p.getY() - 1.5 - * newRadius, 3.0 * newRadius); - g2D.setPlainStroke(); - } - if (_conf._fillBases) { - // Filling inner circle - g2D.setColor(baseInnerColor); - g2D.fillCircle(p.getX() - newRadius, p.getY() - newRadius, - 2.0 * newRadius); - } - - if (_conf._drawOutlineBases) { - // Drawing outline - g2D.setColor(baseOuterColor); - g2D.setStrokeThickness(_conf._baseThickness * _scaleFactor); - g2D.drawCircle(p.getX() - newRadius, p.getY() - newRadius, - 2.0 * newRadius); - } - // Drawing label - g2D.setColor(baseNameColor); - g2D.drawStringCentered(String.valueOf(res), p.getX(), p.getY()); - } else if (mb instanceof ModeleBasesComparison) { - - ModeleBasesComparison mbc = (ModeleBasesComparison) mb; - - // On lui donne l'aspect voulue (on a un trait droit) - g2D.setPlainStroke(); // On doit avoir un trait droit, sans arrondit - g2D.setStrokeThickness(_conf._baseThickness * _scaleFactor); - - // On dessine l'étiquette, rectangle aux bords arrondies. - g2D.setColor(baseInnerColor); - g2D.fillRoundRect((p.getX() - 1.5 * newRadius), - (p.getY() - newRadius), (3.0 * newRadius), - (2.0 * newRadius), 10 * _scaleFactor, 10 * _scaleFactor); - - /* Dessin du rectangle exterieur (bords) */ - g2D.setColor(baseOuterColor); - g2D.drawRoundRect((p.getX() - 1.5 * newRadius), - (p.getY() - newRadius), (3 * newRadius), (2 * newRadius), - 10 * _scaleFactor, 10 * _scaleFactor); - - // On le dessine au centre de l'étiquette. - g2D.drawLine((p.getX()), (p.getY() + newRadius) - 1, (p.getX()), - (p.getY() - newRadius) + 1); - - /* Dessin du nom de la base (A,C,G,U,etc...) */ - // On créer le texte des étiquettes - String label1 = String.valueOf(mbc.getBase1()); - String label2 = String.valueOf(mbc.getBase2()); - - // On leur donne une couleur - g2D.setColor(getRNA().get_listeBases().get(i).getStyleBase() - .getBaseNameColor()); - - // Et on les dessine. - g2D.drawStringCentered(label1, p.getX() - (.75 * newRadius), - p.getY()); - g2D.drawStringCentered(label2, p.getX() + (.75 * newRadius), - p.getY()); - } - - // Drawing base number - if (_RNA.isNumberDrawn(mb, getNumPeriod())) { - - Point2D.Double vn = computeExcentricUnitVector(i, points, centers); - g2D.setColor(mb.getStyleBase().getBaseNumberColor()); - g2D.setFont(_conf._numbersFont); - double factorMin = Math.min(.5, _conf._distNumbers); - double factorMax = Math.min(_conf._distNumbers - 1.5, - _conf._distNumbers); - g2D.drawLine(p.x + vn.x * ((1 + factorMin) * newRadius), p.y + vn.y - * ((1 + factorMin) * newRadius), p.x + vn.x - * ((1 + factorMax) * newRadius), p.y + vn.y - * ((1 + factorMax) * newRadius)); - g2D.drawStringCentered(mb.getLabel(), p.x + vn.x - * ((1 + _conf._distNumbers) * newRadius), p.y + vn.y - * ((1 + _conf._distNumbers) * newRadius)); - - } - } - - void drawChemProbAnnotation(VueVARNAGraphics g2D, ChemProbAnnotation cpa, - Point2D.Double anchor, double scaleFactor) { - g2D.setColor(cpa.getColor()); - g2D.setStrokeThickness(RNA.CHEM_PROB_ARROW_THICKNESS * scaleFactor - * cpa.getIntensity()); - g2D.setPlainStroke(); - Point2D.Double v = cpa.getDirVector(); - Point2D.Double vn = cpa.getNormalVector(); - Point2D.Double base = new Point2D.Double( - (anchor.x + _RNA.CHEM_PROB_DIST * scaleFactor * v.x), - (anchor.y + _RNA.CHEM_PROB_DIST * scaleFactor * v.y)); - Point2D.Double edge = new Point2D.Double( - (base.x + _RNA.CHEM_PROB_BASE_LENGTH * cpa.getIntensity() - * scaleFactor * v.x), - (base.y + _RNA.CHEM_PROB_BASE_LENGTH * cpa.getIntensity() - * scaleFactor * v.y)); - switch (cpa.getType()) { - case ARROW: { - Point2D.Double arrowTip1 = new Point2D.Double( - (base.x + cpa.getIntensity() - * scaleFactor - * (_RNA.CHEM_PROB_ARROW_WIDTH * vn.x + _RNA.CHEM_PROB_ARROW_HEIGHT - * v.x)), - (base.y + cpa.getIntensity() - * scaleFactor - * (_RNA.CHEM_PROB_ARROW_WIDTH * vn.y + _RNA.CHEM_PROB_ARROW_HEIGHT - * v.y))); - Point2D.Double arrowTip2 = new Point2D.Double( - (base.x + cpa.getIntensity() - * scaleFactor - * (-_RNA.CHEM_PROB_ARROW_WIDTH * vn.x + _RNA.CHEM_PROB_ARROW_HEIGHT - * v.x)), - (base.y + cpa.getIntensity() - * scaleFactor - * (-_RNA.CHEM_PROB_ARROW_WIDTH * vn.y + _RNA.CHEM_PROB_ARROW_HEIGHT - * v.y))); - g2D.drawLine(base.x, base.y, edge.x, edge.y); - g2D.drawLine(base.x, base.y, arrowTip1.x, arrowTip1.y); - g2D.drawLine(base.x, base.y, arrowTip2.x, arrowTip2.y); - } - break; - case PIN: { - Point2D.Double side1 = new Point2D.Double( - (edge.x - cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_PIN_SEMIDIAG * v.x)), - (edge.y - cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_PIN_SEMIDIAG * v.y))); - Point2D.Double side2 = new Point2D.Double( - (edge.x - cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_PIN_SEMIDIAG * vn.x)), - (edge.y - cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_PIN_SEMIDIAG * vn.y))); - Point2D.Double side3 = new Point2D.Double( - (edge.x + cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_PIN_SEMIDIAG * v.x)), - (edge.y + cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_PIN_SEMIDIAG * v.y))); - Point2D.Double side4 = new Point2D.Double( - (edge.x + cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_PIN_SEMIDIAG * vn.x)), - (edge.y + cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_PIN_SEMIDIAG * vn.y))); - GeneralPath p2 = new GeneralPath(); - p2.moveTo((float) side1.x, (float) side1.y); - p2.lineTo((float) side2.x, (float) side2.y); - p2.lineTo((float) side3.x, (float) side3.y); - p2.lineTo((float) side4.x, (float) side4.y); - p2.closePath(); - g2D.fill(p2); - g2D.drawLine(base.x, base.y, edge.x, edge.y); - } - break; - case TRIANGLE: { - Point2D.Double arrowTip1 = new Point2D.Double( - (edge.x + cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_TRIANGLE_WIDTH * vn.x)), - (edge.y + cpa.getIntensity() * scaleFactor - * (_RNA.CHEM_PROB_TRIANGLE_WIDTH * vn.y))); - Point2D.Double arrowTip2 = new Point2D.Double( - (edge.x + cpa.getIntensity() * scaleFactor - * (-_RNA.CHEM_PROB_TRIANGLE_WIDTH * vn.x)), - (edge.y + cpa.getIntensity() * scaleFactor - * (-_RNA.CHEM_PROB_TRIANGLE_WIDTH * vn.y))); - GeneralPath p2 = new GeneralPath(); - p2.moveTo((float) base.x, (float) base.y); - p2.lineTo((float) arrowTip1.x, (float) arrowTip1.y); - p2.lineTo((float) arrowTip2.x, (float) arrowTip2.y); - p2.closePath(); - g2D.fill(p2); - } - break; - case DOT: { - Double radius = scaleFactor * _RNA.CHEM_PROB_DOT_RADIUS - * cpa.getIntensity(); - Point2D.Double center = new Point2D.Double((base.x + radius * v.x), - (base.y + radius * v.y)); - g2D.fillCircle((center.x - radius), (center.y - radius), - (2 * radius)); - } - break; - } - } - - Point2D.Double buildCaptionPosition(ModeleBase mb, double scaleFactor, - double heightEstimate) { - double radius = 2.0; - if (_RNA.isNumberDrawn(mb, getNumPeriod())) { - radius += _conf._distNumbers; - } - Point2D.Double center = mb.getCenter(); - Point2D.Double p = mb.getCoords(); - double realDistance = _RNA.BASE_RADIUS * radius + heightEstimate; - return new Point2D.Double(center.getX() + (p.getX() - center.getX()) - * ((p.distance(center) + realDistance) / p.distance(center)), - center.getY() - + (p.getY() - center.getY()) - * ((p.distance(center) + realDistance) / p - .distance(center))); - } - - private void renderAnnotations(VueVARNAGraphics g2D, double offX, - double offY, double rnaBBoxX, double rnaBBoxY, double scaleFactor) { - for (TextAnnotation textAnnotation : _RNA.getAnnotations()) { - g2D.setColor(textAnnotation.getColor()); - g2D.setFont(textAnnotation - .getFont() - .deriveFont( - (float) (2.0 * textAnnotation.getFont().getSize() * scaleFactor))); - Point2D.Double position = textAnnotation.getCenterPosition(); - if (textAnnotation.getType() == TextAnnotation.AnchorType.BASE) { - ModeleBase mb = (ModeleBase) textAnnotation.getAncrage(); - double fontHeight = Math.ceil(textAnnotation.getFont() - .getSize()); - position = buildCaptionPosition(mb, scaleFactor, fontHeight); - } - position = transformCoord(position, offX, offY, rnaBBoxX, rnaBBoxY, - scaleFactor); - g2D.drawStringCentered(textAnnotation.getTexte(), position.x, - position.y); - if ((_selectedAnnotation == textAnnotation) - && (_highlightAnnotation)) { - drawStringOutline(g2D, textAnnotation.getTexte(), position.x, - position.y, 5); - } - } - for (ChemProbAnnotation cpa : _RNA.getChemProbAnnotations()) { - Point2D.Double anchor = transformCoord(cpa.getAnchorPosition(), - offX, offY, rnaBBoxX, rnaBBoxY, scaleFactor); - drawChemProbAnnotation(g2D, cpa, anchor, scaleFactor); - } - - } - - public Rectangle2D.Double getExtendedRNABBox() { - // We get the logical bounding box - Rectangle2D.Double rnabbox = _RNA.getBBox(); - rnabbox.y -= _conf._distNumbers * _RNA.BASE_RADIUS; - rnabbox.height += 2.0 * _conf._distNumbers * _RNA.BASE_RADIUS; - rnabbox.x -= _conf._distNumbers * _RNA.BASE_RADIUS; - rnabbox.width += 2.0 * _conf._distNumbers * _RNA.BASE_RADIUS; - if (_RNA.hasVirtualLoops()) { - rnabbox.y -= RNA.VIRTUAL_LOOP_RADIUS; - rnabbox.height += 2.0 * RNA.VIRTUAL_LOOP_RADIUS; - rnabbox.x -= RNA.VIRTUAL_LOOP_RADIUS; - rnabbox.width += 2.0 * RNA.VIRTUAL_LOOP_RADIUS; - } - return rnabbox; - } - - public void drawBackbone(VueVARNAGraphics g2D, Point2D.Double[] newCoords, - double newRadius, double _scaleFactor) { - // Drawing backbone - if (getDrawBackbone()) { - g2D.setStrokeThickness(1.5 * _scaleFactor); - g2D.setColor(_conf._backboneColor); - - ModeleBackbone bck = _RNA.getBackbone(); - - - for (int i = 1; i < _RNA.get_listeBases().size(); i++) { - Point2D.Double p1 = newCoords[i - 1]; - Point2D.Double p2 = newCoords[i]; - double dist = p1.distance(p2); - int a = _RNA.getBaseAt(i - 1).getElementStructure(); - int b = _RNA.getBaseAt(i).getElementStructure(); - boolean consecutivePair = (a == i) && (b == i - 1); - - if ((dist > 0)) { - Point2D.Double vbp = new Point2D.Double(); - vbp.x = (p2.x - p1.x) / dist; - vbp.y = (p2.y - p1.y) / dist; - - BackboneType bt = bck.getTypeBefore(i); - if (bt!=BackboneType.DISCONTINUOUS_TYPE) - { - if (bt==BackboneType.MISSING_PART_TYPE) { - g2D.setSelectionStroke(); - } else { - g2D.setPlainStroke(); - } - g2D.setColor(bck.getColorBefore(i, _conf._backboneColor)); - - if (consecutivePair - && (_RNA.getDrawMode() != RNA.DRAW_MODE_LINEAR) - && (_RNA.getDrawMode() != RNA.DRAW_MODE_CIRCULAR)) { - int dir = 0; - if (i + 1 < newCoords.length) { - dir = (_RNA.testDirectionality(i - 1, i, i + 1) ? -1 - : 1); - } else if (i - 2 >= 0) { - dir = (_RNA.testDirectionality(i - 2, i - 1, i) ? -1 - : 1); - } - Point2D.Double vn = new Point2D.Double(dir * vbp.y, - -dir * vbp.x); - Point2D.Double centerSeg = new Point2D.Double( - (p1.x + p2.x) / 2.0, (p1.y + p2.y) / 2.0); - double distp1CenterSeq = p1.distance(centerSeg); - double centerDist = Math - .sqrt((RNA.VIRTUAL_LOOP_RADIUS * _scaleFactor - * RNA.VIRTUAL_LOOP_RADIUS * _scaleFactor) - - distp1CenterSeq * distp1CenterSeq); - Point2D.Double centerLoop = new Point2D.Double( - centerSeg.x + centerDist * vn.x, centerSeg.y - + centerDist * vn.y); - double radius = centerLoop.distance(p1); - double a1 = 360. - * (Math.atan2(-(p1.y - centerLoop.y), - (p1.x - centerLoop.x))) - / (2. * Math.PI); - double a2 = 360. - * (Math.atan2(-(p2.y - centerLoop.y), - (p2.x - centerLoop.x))) - / (2. * Math.PI); - double angle = (a2 - a1); - if (-dir * angle < 0) { - angle += -dir * 360.; - } - // if (angle<0.) angle += 360.; - // angle = -dir*(360-dir*angle); - g2D.drawArc(centerLoop.x + .8 * newRadius * vn.x, - centerLoop.y + .8 * newRadius * vn.y, - 2 * radius, 2 * radius, a1, angle); - } else { - g2D.drawLine((newCoords[i - 1].x + newRadius * vbp.x), - (newCoords[i - 1].y + newRadius * vbp.y), - (newCoords[i].x - newRadius * vbp.x), - (newCoords[i].y - newRadius * vbp.y)); - } - } - } - } - } - } - - public Point2D.Double logicToPanel(Point2D.Double logicPoint) { - return new Point2D.Double(_offX - + (getScaleFactor() * (logicPoint.x - _offsetRNA.x)), _offY - + (getScaleFactor() * (logicPoint.y - _offsetRNA.y))); - - } - - public Rectangle2D.Double renderRNA(VueVARNAGraphics g2D, - Rectangle2D.Double bbox) { - return renderRNA(g2D, bbox, false, true); - } - - private double computeScaleFactor(Rectangle2D.Double bbox, - boolean localView, boolean autoCenter) { - Rectangle2D.Double rnabbox = getExtendedRNABBox(); - double scaleFactor = Math.min((double) bbox.width - / (double) rnabbox.width, (double) bbox.height - / (double) rnabbox.height); - - // Use it to get an estimate of the font size for numbers ... - float newFontSize = Math.max(1, - (int) ((1.7 * _RNA.BASE_RADIUS) * scaleFactor)); - // ... and increase bounding box accordingly - rnabbox.y -= newFontSize; - rnabbox.height += newFontSize; - if (_conf._drawColorMap) { - rnabbox.height += getColorMapHeight(); - } - rnabbox.x -= newFontSize; - rnabbox.width += newFontSize; - - // Now, compute the final scaling factor and corresponding font size - scaleFactor = Math.min((double) bbox.width / (double) rnabbox.width, - (double) bbox.height / (double) rnabbox.height); - if (localView) { - if (_conf._autoFit) - setScaleFactor(scaleFactor); - scaleFactor = getScaleFactor(); - } - return scaleFactor; - } - - public synchronized Rectangle2D.Double renderRNA(VueVARNAGraphics g2D, - Rectangle2D.Double bbox, boolean localView, boolean autoCenter) { - Rectangle2D.Double rnaMultiBox = new Rectangle2D.Double(0, 0, 1, 1); - double scaleFactor = computeScaleFactor(bbox, localView, autoCenter); - float newFontSize = Math.max(1, - (int) ((1.7 * _RNA.BASE_RADIUS) * scaleFactor)); - double newRadius = Math.max(1.0, (scaleFactor * _RNA.BASE_RADIUS)); - setBaseFontSize(newFontSize); - setNumbersFontSize(newFontSize); - double offX = bbox.x; - double offY = bbox.y; - Rectangle2D.Double rnabbox = getExtendedRNABBox(); - - if (_RNA.getSize() != 0) { - - Point2D.Double offsetRNA = new Point2D.Double(rnabbox.x, rnabbox.y); - - if (autoCenter) { - offX = (bbox.x + (bbox.width - Math.round(rnabbox.width - * scaleFactor)) / 2.0); - offY = (bbox.y + (bbox.height - Math.round(rnabbox.height - * scaleFactor)) / 2.0); - if (localView) { - _offX = offX; - _offY = offY; - _offsetPanel = new Point2D.Double(_offX, _offY); - _offsetRNA = new Point2D.Double(rnabbox.x, rnabbox.y); - } - } - - if (localView) { - offX = _offX; - offY = _offY; - offsetRNA = _offsetRNA; - } - - // Re-scaling once and for all - Point2D.Double[] newCoords = new Point2D.Double[_RNA - .get_listeBases().size()]; - Point2D.Double[] newCenters = new Point2D.Double[_RNA - .get_listeBases().size()]; - for (int i = 0; i < _RNA.get_listeBases().size(); i++) { - ModeleBase mb = _RNA.getBaseAt(i); - newCoords[i] = new Point2D.Double(offX - + (scaleFactor * (mb.getCoords().x - offsetRNA.x)), - offY + (scaleFactor * (mb.getCoords().y - offsetRNA.y))); - - Point2D.Double centerBck = _RNA.getCenter(i); - // si la base est dans un angle entre une boucle et une helice - if (_RNA.get_drawMode() == RNA.DRAW_MODE_NAVIEW - || _RNA.get_drawMode() == RNA.DRAW_MODE_RADIATE) { - if ((mb.getElementStructure() != -1) - && i < _RNA.get_listeBases().size() - 1 && i > 1) { - ModeleBase b1 = _RNA.get_listeBases().get(i - 1); - ModeleBase b2 = _RNA.get_listeBases().get(i + 1); - int j1 = b1.getElementStructure(); - int j2 = b2.getElementStructure(); - if ((j1 == -1) ^ (j2 == -1)) { - // alors la position du nombre associé doit etre - Point2D.Double a1 = b1.getCoords(); - Point2D.Double a2 = b2.getCoords(); - Point2D.Double c1 = b1.getCenter(); - Point2D.Double c2 = b2.getCenter(); - - centerBck.x = mb.getCoords().x + (c1.x - a1.x) - / c1.distance(a1) + (c2.x - a2.x) - / c2.distance(a2); - centerBck.y = mb.getCoords().y + (c1.y - a1.y) - / c1.distance(a1) + (c2.y - a2.y) - / c2.distance(a2); - } - } - } - newCenters[i] = new Point2D.Double(offX - + (scaleFactor * (centerBck.x - offsetRNA.x)), offY - + (scaleFactor * (centerBck.y - offsetRNA.y))); - } - // Keep track of coordinates for mouse interactions - if (localView) { - _realCoords = newCoords; - _realCenters = newCenters; - } - - g2D.setStrokeThickness(1.5 * scaleFactor); - g2D.setPlainStroke(); - g2D.setFont(_conf._fontBasesGeneral); - - // Drawing region highlights Annotation - drawRegionHighlightsAnnotation(g2D, _realCoords, _realCenters, - scaleFactor); - drawBackbone(g2D, newCoords, newRadius, scaleFactor); - - // Drawing base-pairs - // pour chaque base - for (int i = 0; i < _RNA.get_listeBases().size(); i++) { - int j = _RNA.get_listeBases().get(i).getElementStructure(); - // si c'est une parenthese ouvrante (premiere base du - // couple) - if (j > i) { - ModeleBP msbp = _RNA.get_listeBases().get(i).getStyleBP(); - // System.err.println(msbp); - if (msbp.isCanonical() || _conf._drawnNonCanonicalBP) { - if (_RNA.get_drawMode() == RNA.DRAW_MODE_LINEAR) { - g2D.setStrokeThickness(_RNA.getBasePairThickness( - msbp, _conf) - * 2.0 - * scaleFactor - * _conf._bpThickness); - } else { - g2D.setStrokeThickness(_RNA.getBasePairThickness( - msbp, _conf) * 1.5 * scaleFactor); - } - g2D.setColor(_RNA.getBasePairColor(msbp, _conf)); - - if (_RNA.get_drawMode() == RNA.DRAW_MODE_LINEAR) { - drawBasePairArc(g2D, i, j, newCoords[i], - newCoords[j], scaleFactor, msbp, newRadius); - } else { - drawBasePair(g2D, newCoords[i], newCoords[j], msbp, - newRadius, scaleFactor); - } - } - } - } - - // Liaisons additionelles (non planaires) - if (_conf._drawnNonPlanarBP) { - ArrayList bpaux = _RNA.getStructureAux(); - for (int k = 0; k < bpaux.size(); k++) { - ModeleBP msbp = bpaux.get(k); - if (msbp.isCanonical() || _conf._drawnNonCanonicalBP) { - int i = msbp.getPartner5().getIndex(); - int j = msbp.getPartner3().getIndex(); - if (_RNA.get_drawMode() == RNA.DRAW_MODE_LINEAR) { - g2D.setStrokeThickness(_RNA.getBasePairThickness( - msbp, _conf) - * 2.5 - * scaleFactor - * _conf._bpThickness); - g2D.setPlainStroke(); - } else { - g2D.setStrokeThickness(_RNA.getBasePairThickness( - msbp, _conf) * 1.5 * scaleFactor); - g2D.setPlainStroke(); - } - - g2D.setColor(_RNA.getBasePairColor(msbp, _conf)); - if (j > i) { - if (_RNA.get_drawMode() == RNA.DRAW_MODE_LINEAR) { - drawBasePairArc(g2D, i, j, newCoords[i], - newCoords[j], scaleFactor, msbp, newRadius); - } else { - drawBasePair(g2D, newCoords[i], newCoords[j], - msbp, newRadius, scaleFactor); - } - } - } - } - } - - // Drawing bases - g2D.setPlainStroke(); - for (int i = 0; i < Math.min(_RNA.get_listeBases().size(), - newCoords.length); i++) { - drawBase(g2D, i, newCoords, newCenters, newRadius, scaleFactor, - localView); - } - - rnaMultiBox = new Rectangle2D.Double(offX, offY, - (scaleFactor * rnabbox.width) - 1, - (scaleFactor * rnabbox.height) - 1); - - if (localView) { - // Drawing bbox - if (_debug || _drawBBox) { - g2D.setColor(Color.RED); - g2D.setSelectionStroke(); - g2D.drawRect(rnaMultiBox.x, rnaMultiBox.y, - rnaMultiBox.width, rnaMultiBox.height); - } - - // Draw color map - if (_conf._drawColorMap) { - drawColorMap(g2D, scaleFactor, rnabbox); - } - - if (_debug || _drawBBox) { - g2D.setColor(Color.GRAY); - g2D.setSelectionStroke(); - g2D.drawRect(0, 0, getWidth() - 1, getHeight() - - getTitleHeight() - 1); - } - } - // Draw annotations - renderAnnotations(g2D, offX, offY, offsetRNA.x, offsetRNA.y, - scaleFactor); - // Draw additional debug shape - if (_RNA._debugShape != null) { - Color c = new Color(255, 0, 0, 50); - g2D.setColor(c); - AffineTransform at = new AffineTransform(); - at.translate(offX - scaleFactor * rnabbox.x, offY - scaleFactor - * rnabbox.y); - at.scale(scaleFactor, scaleFactor); - Shape s = at.createTransformedShape(_RNA._debugShape); - if (s instanceof GeneralPath) { - g2D.fill((GeneralPath) s); - } - } - } else { - g2D.setColor(VARNAConfig.DEFAULT_MESSAGE_COLOR); - g2D.setFont(VARNAConfig.DEFAULT_MESSAGE_FONT); - rnaMultiBox = new Rectangle2D.Double(0,0,10,10); - g2D.drawStringCentered("No RNA here", bbox.getCenterX(),bbox.getCenterY()); - } - return rnaMultiBox; - } - - public void centerViewOn(double x, double y) { - Rectangle2D.Double r = _RNA.getBBox(); - _target = new Point2D.Double(x, y); - Point2D.Double q = logicToPanel(_target); - Point p = new Point((int) (-q.x), (int) (-q.y)); - setTranslation(p); - repaint(); - } - - Point2D.Double _target = new Point2D.Double(0, 0); - Point2D.Double _target2 = new Point2D.Double(0, 0); - - public ModeleBase getBaseAt(Point2D.Double po) { - ModeleBase mb = null; - Point2D.Double p = panelToLogicPoint(po); - double dist = Double.MAX_VALUE; - for (ModeleBase tmp : _RNA.get_listeBases()) { - double ndist = tmp.getCoords().distance(p); - if (dist > ndist) { - mb = tmp; - dist = ndist; - } - } - return mb; - } - - public void setColorMapValues(Double[] values) { - _RNA.setColorMapValues(values, _conf._cm, true); - _conf._drawColorMap = true; - repaint(); - } - - public void setColorMapMaxValue(double d) { - _conf._cm.setMaxValue(d); - } - - public void setColorMapMinValue(double d) { - _conf._cm.setMinValue(d); - } - - public ModeleColorMap getColorMap() { - return _conf._cm; - } - - public void setColorMap(ModeleColorMap cm) { - //_RNA.adaptColorMapToValues(cm); - _conf._cm = cm; - repaint(); - } - - public void setColorMapCaption(String caption) { - _conf._colorMapCaption = caption; - repaint(); - } - - public String getColorMapCaption() { - return _conf._colorMapCaption; - } - - public void drawColorMap(boolean draw) { - _conf._drawColorMap = draw; - } - - private double getColorMapHeight() { - double result = VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE - + _conf._colorMapHeight; - if (!_conf._colorMapCaption.equals("")) - result += VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE; - return result; - } - - private void drawColorMap(VueVARNAGraphics g2D, double scaleFactor, - Rectangle2D.Double rnabbox) { - double v1 = _conf._cm.getMinValue(); - double v2 = _conf._cm.getMaxValue(); - double x, y; - g2D.setPlainStroke(); - - double xSpaceAvail = 0; - double ySpaceAvail = Math - .min((getHeight() - rnabbox.height * scaleFactor - getTitleHeight()) / 2.0, - scaleFactor - * (_conf._colorMapHeight + VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE)); - if ((int) ySpaceAvail == 0) { - xSpaceAvail = Math.min( - (getWidth() - rnabbox.width * scaleFactor) / 2, scaleFactor - * (_conf._colorMapWidth) - + VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH); - } - double xBase = (xSpaceAvail + _offX + scaleFactor - * (rnabbox.width - _conf._colorMapWidth - _conf._colorMapXOffset)); - double hcaption = VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE; - double yBase = (ySpaceAvail + _offY + scaleFactor - * (rnabbox.height - _conf._colorMapHeight - - _conf._colorMapYOffset - hcaption)); - - for (int i = 0; i < _conf._colorMapWidth; i++) { - double ratio = (((double) i) / ((double) _conf._colorMapWidth)); - double val = v1 + (v2 - v1) * ratio; - g2D.setColor(_conf._cm.getColorForValue(val)); - x = (xBase + scaleFactor * i); - y = yBase; - g2D.fillRect(x, y, scaleFactor - * VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH, - (scaleFactor * _conf._colorMapHeight)); - } - g2D.setColor(VARNAConfig.DEFAULT_COLOR_MAP_OUTLINE); - g2D.drawRect(xBase, yBase, - (VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH - 1 + scaleFactor - * _conf._colorMapWidth), - ((scaleFactor * _conf._colorMapHeight))); - g2D.setFont(getFont() - .deriveFont( - (float) (scaleFactor * VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE))); - g2D.setColor(VARNAConfig.DEFAULT_COLOR_MAP_FONT_COLOR); - NumberFormat nf = NumberFormat.getInstance(); - nf.setMaximumFractionDigits(2); - nf.setMinimumFractionDigits(0); - g2D.drawStringCentered(nf.format(_conf._cm.getMinValue()), xBase, - yBase - + scaleFactor * (_conf._colorMapHeight+(VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE / 1.7))); - g2D.drawStringCentered(nf.format(_conf._cm.getMaxValue()), xBase - + VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH + scaleFactor - * _conf._colorMapWidth, - yBase - + scaleFactor * (_conf._colorMapHeight+(VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE / 1.7))); - if (!_conf._colorMapCaption.equals("")) - g2D.drawStringCentered( - "" + _conf._colorMapCaption, - xBase + scaleFactor * _conf._colorMapWidth / 2.0, - yBase - + scaleFactor - * (VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE / 1.7 + _conf._colorMapHeight)); - - } - - public Point2D.Double panelToLogicPoint(Point2D.Double p) { - return new Point2D.Double( - ((p.x - getOffsetPanel().x) / getScaleFactor()) - + getRNAOffset().x, - ((p.y - getOffsetPanel().y) / getScaleFactor()) - + getRNAOffset().y); - } - - public Point2D.Double transformCoord(Point2D.Double coordDebut, - double offX, double offY, double rnaBBoxX, double rnaBBoxY, - double scaleFactor) { - return new Point2D.Double(offX - + (scaleFactor * (coordDebut.x - rnaBBoxX)), offY - + (scaleFactor * (coordDebut.y - rnaBBoxY))); - } - - public void eraseSequence() { - _RNA.eraseSequence(); - } - - public Point2D.Double transformCoord(Point2D.Double coordDebut) { - Rectangle2D.Double rnabbox = getExtendedRNABBox(); - return new Point2D.Double(_offX - + (getScaleFactor() * (coordDebut.x - rnabbox.x)), _offY - + (getScaleFactor() * (coordDebut.y - rnabbox.y))); - } - - public void paintComponent(Graphics g) { - paintComponent(g, false); - } - - public void paintComponent(Graphics g, boolean transparentBackground) { - if (_premierAffichage) { - // _border = new Dimension(0, 0); - _translation.x = 0; - _translation.y = (int) (-getTitleHeight() / 2.0); - _popup.buildPopupMenu(); - this.add(_popup); - _premierAffichage = false; - } - - Graphics2D g2 = (Graphics2D) g; - Stroke dflt = g2.getStroke(); - VueVARNAGraphics g2D = new SwingGraphics(g2); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - this.removeAll(); - super.paintComponent(g2); - renderComponent(g2D, transparentBackground, getScaleFactor()); - if (isFocusOwner()) { - g2.setStroke(new BasicStroke(1.5f)); - g2.setColor(Color.decode("#C0C0C0")); - g2.drawRect(0, 0, getWidth() - 1, getHeight() - 1); - - } - g2.setStroke(dflt); - /* - * PSExport e = new PSExport(); SecStrProducerGraphics export = new - * SecStrProducerGraphics(e); renderRNA(export, getExtendedRNABBox()); - * try { export.saveToDisk("./out.ps"); } catch - * (ExceptionWritingForbidden e1) { e1.printStackTrace(); } - */ - } - - /** - * Draws current RNA structure in a given Graphics "device". - * - * @param g2D - * A graphical device - * @param transparentBackground - * Whether the background should be transparent, or drawn. - */ - public synchronized void renderComponent(VueVARNAGraphics g2D, - boolean transparentBackground, double scaleFactor) { - - updateTitleHeight(); - - if (_debug || _drawBorder) { - g2D.setColor(Color.BLACK); - g2D.setPlainStroke(); - g2D.drawRect(getLeftOffset(), getTopOffset(), getInnerWidth(), - getInnerHeight()); - - } - - - if (!transparentBackground) { - super.setBackground(_conf._backgroundColor); - } else { - super.setBackground(new Color(0, 0, 0, 120)); - } - - // BH 2018 was lt, not lteq here - // SwingJS sets the minimum panel size -- probably incorrectly -- to the size for VARNAPanel - if (getMinimumSize().height <= getSize().height - && getMinimumSize().width <= getSize().width) { - // Draw Title - if (!getTitle().equals("")) { - g2D.setColor(_conf._titleColor); - g2D.setFont(_conf._titleFont); - g2D.drawStringCentered(getTitle(), this.getWidth() / 2, - this.getHeight() - getTitleHeight() / 2.0); - } - // Draw RNA - renderRNA(g2D, getClip(), true, _conf._autoCenter); - } - if (_selectionRectangle != null) { - g2D.setColor(Color.BLACK); - g2D.setSelectionStroke(); - g2D.drawRect(_selectionRectangle.x, _selectionRectangle.y, - _selectionRectangle.width, _selectionRectangle.height); - } - if ((_linkOrigin != null) && (_linkDestination != null)) { - g2D.setColor(_conf._bondColor); - g2D.setPlainStroke(); - g2D.setStrokeThickness(3.0 * scaleFactor); - Point2D.Double linkOrigin = (_linkOrigin); - Point2D.Double linkDestination = (_linkDestination); - g2D.drawLine(linkOrigin.x, linkOrigin.y, linkDestination.x, - linkDestination.y); - for (int i : getSelection().getIndices()) - drawBase(g2D, i, _realCoords, _realCenters, scaleFactor - * _RNA.BASE_RADIUS, scaleFactor, true); - } - - if (_debug) { - g2D.setStrokeThickness(3.0 * scaleFactor); - g2D.setColor(Color.black); - Point2D.Double t = this.logicToPanel(_target); - g2D.drawLine(t.x - 3, t.y - 3, t.x + 3, t.y + 3); - g2D.drawLine(t.x - 3, t.y + 3, t.x + 3, t.y - 3); - g2D.setColor(Color.red); - t = this.logicToPanel(_target2); - g2D.drawLine(t.x - 3, t.y - 3, t.x + 3, t.y + 3); - g2D.drawLine(t.x - 3, t.y + 3, t.x + 3, t.y - 3); - } - } - - public void drawRegionHighlightsAnnotation(VueVARNAGraphics g2D, - Point2D.Double[] realCoords, Point2D.Double[] realCenters, - double scaleFactor) { - g2D.setStrokeThickness(2.0 * scaleFactor); - g2D.setPlainStroke(); - for (HighlightRegionAnnotation r : _RNA.getHighlightRegion()) { - GeneralPath s = r.getShape(realCoords, realCenters, scaleFactor); - g2D.setColor(r.getFillColor()); - g2D.fill(s); - g2D.setColor(r.getOutlineColor()); - g2D.draw(s); - } - } - - private Rectangle2D.Double getClip() { - return new Rectangle2D.Double(getLeftOffset(), getTopOffset(), - this.getInnerWidth(), this.getInnerHeight()); - } - - public Rectangle2D.Double getViewClip() { - return new Rectangle2D.Double(this.getLeftOffset(), - this.getTopOffset(), this.getInnerWidth(), - this.getInnerHeight()); - } - - /** - * Returns the color used to draw backbone bounds. - * - * @return The color used to draw backbone bounds - */ - public Color getBackboneColor() { - return _conf._backboneColor; - } - - /** - * Sets the color to be used for drawing backbone interactions. - * - * @param backbone_color - * The new color for the backbone bounds - */ - public void setBackboneColor(Color backbone_color) { - _conf._backboneColor = backbone_color; - } - - /** - * Returns the color used to display hydrogen bonds (base pairings) - * - * @return The color of hydrogen bonds - */ - public Color getBondColor() { - return _conf._bondColor; - } - - /** - * Returns the title of this panel - * - * @return The title - */ - public String getTitle() { - return _RNA.getName(); - } - - /** - * Sets the new color to be used for hydrogen bonds (base pairings) - * - * @param bond_color - * The new color for hydrogen bonds - */ - public void setDefaultBPColor(Color bond_color) { - _conf._bondColor = bond_color; - } - - /** - * Sets the size of the border, i.e. the empty space between the end of the - * drawing area and the actual border. - * - * @param b - * The new border size - */ - public void setBorderSize(Dimension b) { - _border = b; - } - - /** - * Returns the size of the border, i.e. the empty space between the end of - * the drawing area - * - * @return The border size - */ - public Dimension getBorderSize() { - return _border; - } - - /** - * Sets the RNA to be displayed within this Panel. This method does not use - * a drawing algorithm to reassigns base coordinates, rather assuming that - * the RNA was previously drawn. - * - * @param r - * An already drawn RNA to display in this panel - */ - public synchronized void showRNA(RNA r) { - fireUINewStructure(r); - _RNA = r; - } - - /** - * Sets the RNA secondary structure to be drawn in this panel, using the - * default layout algorithm. In addition to the raw nucleotides sequence, - * the secondary structure is given in the so-called "Dot-bracket notation" - * (DBN) format. This format is a well-parenthesized word over the alphabet - * '(',')','.'.
- * Ex:((((((((....))))..(((((...))).))))))
- * Returns true if the sequence/structure couple could be - * parsed into a valid secondary structure, and false - * otherwise. - * - * @param seq - * The raw nucleotides sequence - * @param str - * The secondary structure - * @throws ExceptionNonEqualLength - */ - public void drawRNA(String seq, String str) throws ExceptionNonEqualLength { - drawRNA(seq, str, _RNA.get_drawMode()); - } - - /** - * Sets the RNA secondary structure to be drawn in this panel, using a given - * layout algorithm. - * - * @param r - * The new secondary structure - * @param drawMode - * The drawing algorithm - */ - public void drawRNA(RNA r, int drawMode) { - r.setDrawMode(drawMode); - drawRNA(r); - } - - /** - * Redraws the current RNA. This reassigns base coordinates to their default - * value using the current drawing algorithm. - */ - - public void drawRNA() { - try { - _RNA.drawRNA(_RNA.get_drawMode(), _conf); - } catch (ExceptionNAViewAlgorithm e) { - errorDialog(e); - e.printStackTrace(); - } - repaint(); - } - - /** - * Sets the RNA secondary structure to be drawn in this panel, using the - * current drawing algorithm. - * - * @param r - * The new secondary structure - */ - public void drawRNA(RNA r) { - if (r != null) { - _RNA = r; - drawRNA(); - } - } - - /** - * Sets the RNA secondary structure to be drawn in this panel, using a given - * layout algorithm. In addition to the raw nucleotides sequence, the - * secondary structure is given in the so-called "Dot-bracket notation" - * (DBN) format. This format is a well-parenthesized word over the alphabet - * '(',')','.'.
- * Ex: ((((((((....))))..(((((...))).))))))
- * Returns true if the sequence/structure couple could be - * parsed into a valid secondary structure, and false - * otherwise. - * - * @param seq - * The raw nucleotides sequence - * @param str - * The secondary structure - * @param drawMode - * The drawing algorithm - * @throws ExceptionNonEqualLength - */ - public void drawRNA(String seq, String str, int drawMode) - throws ExceptionNonEqualLength { - _RNA.setDrawMode(drawMode); - try { - _RNA.setRNA(seq, str); - drawRNA(); - } catch (ExceptionUnmatchedClosingParentheses e) { - errorDialog(e); - } catch (ExceptionFileFormatOrSyntax e1) { - errorDialog(e1); - } - } - - public void drawRNA(Reader r, int drawMode) throws ExceptionNonEqualLength, - ExceptionFileFormatOrSyntax { - _RNA.setDrawMode(drawMode); - Collection rnas = RNAFactory.loadSecStr(r); - if (rnas.isEmpty()) { - throw new ExceptionFileFormatOrSyntax( - "No RNA could be parsed from that source."); - } - _RNA = rnas.iterator().next(); - drawRNA(); - } - - /** - * Draws a secondary structure of RNA using the default drawing algorithm - * and displays it, using an interpolated transition between the previous - * one and the new one. Extra bases, resulting from a size difference - * between the two successive RNAs, are assumed to initiate from the middle - * of the sequence. In other words, both prefixes and suffixes of the RNAs - * are assumed to match, and what remains is an insertion. - * - * @param seq - * Sequence - * @param str - * Structure in dot bracket notation - * @throws ExceptionNonEqualLength - * If len(seq)!=len(str) - */ - public void drawRNAInterpolated(String seq, String str) - throws ExceptionNonEqualLength { - drawRNAInterpolated(seq, str, _RNA.get_drawMode()); - } - - /** - * Draws a secondary structure of RNA using a given algorithm and displays - * it, using an interpolated transition between the previous one and the new - * one. Extra bases, resulting from a size difference between the two - * successive RNAs, are assumed to initiate from the middle of the sequence. - * In other words, both prefixes and suffixes of the RNAs are assumed to - * match, and what remains is an insertion. - * - * @param seq - * Sequence - * @param str - * Structure in dot bracket notation - * @param drawMode - * The drawing algorithm to be used for the initial placement - * @throws ExceptionNonEqualLength - * If len(seq)!=len(str) - */ - public void drawRNAInterpolated(String seq, String str, int drawMode) { - drawRNAInterpolated(seq, str, drawMode, - Mapping.DefaultOutermostMapping(_RNA.get_listeBases().size(), - str.length())); - } - - /** - * Draws a secondary structure of RNA using the default drawing algorithm - * and displays it, using an interpolated transition between the previous - * one and the new one. Here, a mapping between those bases of the new - * structure and the previous one is explicitly provided. - * - * @param seq - * Sequence - * @param str - * Structure in dot bracket notation - * @param m - * A mapping between the currently rendered structure and its - * successor (seq,str) - * @throws ExceptionNonEqualLength - * If len(seq)!=len(str) - */ - public void drawRNAInterpolated(String seq, String str, Mapping m) { - drawRNAInterpolated(seq, str, _RNA.get_drawMode(), m); - } - - /** - * Draws a secondary structure of RNA using a given drawing algorithm and - * displays it, using an interpolated transition between the previous one - * and the new one. Here, a mapping between those bases of the new structure - * and the previous one is provided. - * - * @param seq - * Sequence - * @param str - * Structure in dot bracket notation - * @param drawMode - * The drawing algorithm to be used for the initial placement - * @param m - * A mapping between the currently rendered structure and its - * successor (seq,str) - */ - public void drawRNAInterpolated(String seq, String str, int drawMode, - Mapping m) { - RNA target = new RNA(); - try { - target.setRNA(seq, str); - drawRNAInterpolated(target, drawMode, m); - } catch (ExceptionUnmatchedClosingParentheses e) { - errorDialog(e); - } catch (ExceptionFileFormatOrSyntax e) { - errorDialog(e); - } - } - - /** - * Draws a secondary structure of RNA using the default drawing algorithm - * and displays it, using an interpolated transition between the previous - * one and the new one. Here, a mapping between those bases of the new - * structure and the previous one is explicitly provided. - * - * @param target - * Secondary structure - */ - public void drawRNAInterpolated(RNA target) { - drawRNAInterpolated(target, target.get_drawMode(), - Mapping.DefaultOutermostMapping(_RNA.get_listeBases().size(), - target.getSize())); - } - - /** - * Draws a secondary structure of RNA using the default drawing algorithm - * and displays it, using an interpolated transition between the previous - * one and the new one. Here, a mapping between those bases of the new - * structure and the previous one is explicitly provided. - * - * @param target - * Secondary structure - * @param m - * A mapping between the currently rendered structure and its - * successor (seq,str) - */ - public void drawRNAInterpolated(RNA target, Mapping m) { - drawRNAInterpolated(target, target.get_drawMode(), m); - } - - /** - * Draws a secondary structure of RNA using a given drawing algorithm and - * displays it, using an interpolated transition between the previous one - * and the new one. Here, a mapping between those bases of the new structure - * and the previous one is provided. - * - * @param target - * Secondary structure of RNA - * @param drawMode - * The drawing algorithm to be used for the initial placement - * @param m - * A mapping between the currently rendered structure and its - * successor (seq,str) - */ - public void drawRNAInterpolated(RNA target, int drawMode, Mapping m) { - try { - target.drawRNA(drawMode, _conf); - _conf._drawColorMap = false; - _interpolator.addTarget(target, m); - } catch (ExceptionNAViewAlgorithm e) { - errorDialog(e); - e.printStackTrace(); - } - } - - /** - * Returns the current algorithm used for drawing the structure - * - * @return The current drawing algorithm - */ - public int getDrawMode() { - return this._RNA.getDrawMode(); - } - - public void showRNA(RNA t, VARNAConfig cfg) { - showRNA(t); - if (cfg != null) { - this.setConfig(cfg); - } - repaint(); - } - - /** - * Checks whether an interpolated transition bewteen two RNAs is occurring. - * - * @return True if an interpolated transition is occurring, false otherwise - */ - - public boolean isInterpolationInProgress() { - if (_interpolator == null) { - return false; - } else - return _interpolator.isInterpolationInProgress(); - } - - /** - * Simply displays (does not redraw) a secondary structure , using an - * interpolated transition between the previous one and the new one. A - * default mapping between those bases of the new structure and the previous - * one is used. - * - * @param target - * Secondary structure of RNA - */ - public void showRNAInterpolated(RNA target) { - showRNAInterpolated(target, Mapping.DefaultOutermostMapping(_RNA - .get_listeBases().size(), target.getSize())); - } - - /** - * Simply displays (does not redraw) a secondary structure , using an - * interpolated transition between the previous one and the new one. Here, a - * mapping between bases of the new structure and the previous one is given. - * - * @param target - * Secondary structure of RNA - * @param m - * A mapping between the currently rendered structure and its - * successor (seq,str) - * @throws ExceptionNonEqualLength - * If len(seq)!=len(str) - */ - public void showRNAInterpolated(RNA target, Mapping m) { - showRNAInterpolated(target, null, m); - } - - public void showRNAInterpolated(RNA target, VARNAConfig cfg, Mapping m) { - _interpolator.addTarget(target, cfg, m); - } - - /** - * When comparison mode is ON, sets the two RNA secondary structure to be - * drawn in this panel, using a given layout algorithm. In addition to the - * raw nucleotides sequence, the secondary structure is given in the - * so-called "Dot-bracket notation" (DBN) format. This format is a - * well-parenthesized word over the alphabet '(',')','.'.
- * Ex: ((((((((....))))..(((((...))).))))))
- * - * @param firstSeq - * The first RNA raw nucleotides sequence - * @param firstStruct - * The first RNA secondary structure - * @param secondSeq - * The second RNA raw nucleotides sequence - * @param secondStruct - * The second RNA secondary structure - * @param drawMode - * The drawing algorithm - */ - public void drawRNA(String firstSeq, String firstStruct, String secondSeq, - String secondStruct, int drawMode) { - _RNA.setDrawMode(drawMode); - /** - * Checking the sequences and structures validities... - */ - - // This is a comparison, so the two RNA alignment past in parameters - // must - // have the same sequence and structure length. - if (firstSeq.length() == secondSeq.length() - && firstStruct.length() == secondStruct.length()) { - // First RNA - if (firstSeq.length() != firstStruct.length()) { - if (_conf._showWarnings) { - emitWarning("First sequence length " + firstSeq.length() - + " differs from that of it's secondary structure " - + firstStruct.length() - + ". \nAdapting first sequence length ..."); - } - if (firstSeq.length() < firstStruct.length()) { - while (firstSeq.length() < firstStruct.length()) { - firstSeq += " "; - } - } else { - firstSeq = firstSeq.substring(0, firstStruct.length()); - } - } - - // Second RNA - if (secondSeq.length() != secondStruct.length()) { - if (_conf._showWarnings) { - emitWarning("Second sequence length " + secondSeq.length() - + " differs from that of it's secondary structure " - + secondStruct.length() - + ". \nAdapting second sequence length ..."); - } - if (secondSeq.length() < secondStruct.length()) { - while (secondSeq.length() < secondStruct.length()) { - secondSeq += " "; - } - } else { - secondSeq = secondSeq.substring(0, secondStruct.length()); - } - } - - int RNALength = firstSeq.length(); - String string_superStruct = new String(""); - String string_superSeq = new String(""); - /** - * In this array, we'll have for each indexes of each characters of - * the final super-structure, the RNA number which is own it. - */ - ArrayList array_rnaOwn = new ArrayList(); - - /** - * Generating super-structure sequences and structures... - */ - - firstStruct = firstStruct.replace('-', '.'); - secondStruct = secondStruct.replace('-', '.'); - // First of all, we make the structure - for (int i = 0; i < RNALength; i++) { - // If both characters are the same, so it'll be in the super - // structure - if (firstStruct.charAt(i) == secondStruct.charAt(i)) { - string_superStruct = string_superStruct - + firstStruct.charAt(i); - array_rnaOwn.add(0); - } - // Else if one of the characters is an opening parenthese, so - // it'll be an opening parenthese in the super structure - else if (firstStruct.charAt(i) == '(' - || secondStruct.charAt(i) == '(') { - string_superStruct = string_superStruct + '('; - array_rnaOwn.add((firstStruct.charAt(i) == '(') ? 1 : 2); - } - // Else if one of the characters is a closing parenthese, so - // it'll be a closing parenthese in the super structure - else if (firstStruct.charAt(i) == ')' - || secondStruct.charAt(i) == ')') { - string_superStruct = string_superStruct + ')'; - array_rnaOwn.add((firstStruct.charAt(i) == ')') ? 1 : 2); - } else { - string_superStruct = string_superStruct + '.'; - array_rnaOwn.add(-1); - } - } - - // Next, we make the sequence taking the characters at the same - // index in the first and second sequence - for (int i = 0; i < RNALength; i++) { - string_superSeq = string_superSeq + firstSeq.charAt(i) - + secondSeq.charAt(i); - } - - // Now, we need to create the super-structure RNA with the owning - // bases array - // in order to color bases outer depending on the owning statement - // of each bases. - if (!string_superSeq.equals("") && !string_superStruct.equals("")) { - try { - _RNA.setRNA(string_superSeq, string_superStruct, - array_rnaOwn); - } catch (ExceptionUnmatchedClosingParentheses e) { - errorDialog(e); - } catch (ExceptionFileFormatOrSyntax e) { - errorDialog(e); - } - } else { - emitWarning("ERROR : The super-structure is NULL."); - } - - switch (_RNA.get_drawMode()) { - case RNA.DRAW_MODE_RADIATE: - _RNA.drawRNARadiate(_conf); - break; - case RNA.DRAW_MODE_CIRCULAR: - _RNA.drawRNACircle(_conf); - break; - case RNA.DRAW_MODE_LINEAR: - _RNA.drawRNALine(_conf); - break; - case RNA.DRAW_MODE_NAVIEW: - try { - _RNA.drawRNANAView(_conf); - } catch (ExceptionNAViewAlgorithm e) { - errorDialog(e); - } - break; - default: - break; - } - - } - } - - /** - * Returns the currently selected base index, obtained through a mouse-left - * click - * - * @return Selected base - * - * public int getSelectedBaseIndex() { return _selectedBase; } - * - * /** Returns the currently selected base, obtained through a - * mouse-left click - * - * @return Selected base - * - * public ModeleBase getSelectedBase() { return - * _RNA.get_listeBases().get(_selectedBase); } - * - * /** Sets the selected base index - * - * @param base - * New selected base index - * - * public void setSelectedBase(int base) { _selectedBase = base; - * } - */ - - /** - * Returns the coordinates of the currently displayed RNA - * - * @return Coordinates array - */ - public Point2D.Double[] getRealCoords() { - return _realCoords; - } - - /** - * Sets the coordinates of the currently displayed RNA - * - * @param coords - * New coordinates - */ - public void setRealCoords(Point2D.Double[] coords) { - _realCoords = coords; - } - - /** - * Returns the popup menu used for user mouse iteractions - * - * @return Popup menu - */ - public VueMenu getPopup() { - return _popup; - } - - /** - * Sets the color used to display hydrogen bonds (base pairings) - * - * @param bond_color - * The color of hydrogen bonds - */ - public void setBondColor(Color bond_color) { - _conf._bondColor = bond_color; - } - - /** - * Returns the color used to draw the title - * - * @return The color used to draw the title - */ - public Color getTitleColor() { - return _conf._titleColor; - } - - /** - * Sets the color used to draw the title - * - * @param title_color - * The new color used to draw the title - */ - public void setTitleColor(Color title_color) { - _conf._titleColor = title_color; - } - - /** - * Returns the height taken by the title - * - * @return The height taken by the title - */ - private int getTitleHeight() { - return _titleHeight; - } - - /** - * Sets the height taken by the title - * - * @param title_height - * The height taken by the title - */ - @SuppressWarnings("unused") - private void setTitleHeight(int title_height) { - _titleHeight = title_height; - } - - /** - * Returns the current state of auto centering mode. - * - * @return True if autocentered, false otherwise - */ - public boolean isAutoCentered() { - return _conf._autoCenter; - } - - /** - * Sets the current state of auto centering mode. - * - * @param center - * New auto-centered state - */ - public void setAutoCenter(boolean center) { - _conf._autoCenter = center; - } - - /** - * Returns the font currently used for rendering the title. - * - * @return Current title font - */ - public Font getTitleFont() { - return _conf._titleFont; - } - - /** - * Sets the font used for rendering the title. - * - * @param font - * New title font - */ - public void setTitleFont(Font font) { - _conf._titleFont = font; - updateTitleHeight(); - } - - /** - * For the LINE_MODE drawing algorithm, sets the base pair height increment, - * i.e. the vertical distance between two nested arcs. - * - * @return The current base pair increment - */ - public double getBPHeightIncrement() { - return _RNA._bpHeightIncrement; - } - - /** - * Sets the base pair height increment, i.e. the vertical distance between - * two arcs to be used in LINE_MODE. - * - * @param inc - * New height increment - */ - public void setBPHeightIncrement(double inc) { - _RNA._bpHeightIncrement = inc; - } - - /** - * Returns the shifting of the origin of the Panel in zoom mode - * - * @return The logical coordinate of the top-left panel point - */ - public Point2D.Double getOffsetPanel() { - return _offsetPanel; - } - - /** - * Returns the vector bringing the logical coordinate of left-top-most point - * in the panel to the left-top-most point of the RNA. - * - * @return The logical coordinate of the top-left panel point - */ - private Point2D.Double getRNAOffset() { - return _offsetRNA; - } - - /** - * Returns this panel's UI menu - * - * @return Applet's UI popupmenu - */ - public VueMenu getPopupMenu() { - return _popup; - } - - /** - * Returns the atomic zoom factor step, or increment. - * - * @return Atomic zoom factor increment - */ - public double getZoomIncrement() { - return _conf._zoomAmount; - } - - /** - * Sets the atomic zoom factor step, or increment. - * - * @param amount - * Atomic zoom factor increment - */ - public void setZoomIncrement(Object amount) { - setZoomIncrement(Float.valueOf(amount.toString())); - } - - /** - * Sets the atomic zoom factor step, or increment. - * - * @param amount - * Atomic zoom factor increment - */ - public void setZoomIncrement(double amount) { - _conf._zoomAmount = amount; - } - - /** - * Returns the current zoom factor - * - * @return Current zoom factor - */ - public double getZoom() { - return _conf._zoom; - } - - /** - * Sets the current zoom factor - * - * @param _zoom - * New zoom factor - */ - public void setZoom(Object _zoom) { - double d = Float.valueOf(_zoom.toString()); - if (_conf._zoom != d) { - _conf._zoom = d; - fireZoomLevelChanged(d); - } - } - - /** - * Returns the translation used for zooming in and out - * - * @return A vector describing the translation - */ - public Point getTranslation() { - return _translation; - } - - /** - * Sets the translation used for zooming in and out - * - * @param trans - * A vector describing the new translation - */ - public void setTranslation(Point trans) { - _translation = trans; - checkTranslation(); - fireTranslationChanged(); - } - - /** - * Returns the current RNA model - * - * @return Current RNA model - */ - public RNA getRNA() { - return _RNA; - } - - /** - * Checks whether the drawn RNA is too large to be displayed, allowing for - * shifting mouse interactions. - * - * @return true if the RNA is too large to be displayed, false otherwise - */ - public boolean isOutOfFrame() { - return _horsCadre; - } - - /** - * Pops up an error Dialog displaying an exception in an human-readable way. - * - * @param error - * The exception to display within the Dialog - */ - public void errorDialog(Exception error) { - errorDialog(error, this); - } - - /** - * Pops up an error Dialog displaying an exception in an human-readable way - * if errors are set to be displayed. - * - * @see #setErrorsOn(boolean) - * @param error - * The exception to display within the Dialog - * @param c - * Parent component for the dialog box - */ - public void errorDialog(Exception error, Component c) { - if (isErrorsOn()) { - JOptionPane.showMessageDialog(c, error.getMessage(), "VARNA Error", - JOptionPane.ERROR_MESSAGE); - } - } - - /** - * Pops up an error Dialog displaying an exception in an human-readable way. - * - * @param error - * The exception to display within the Dialog - * @param c - * Parent component for the dialog box - */ - public static void errorDialogStatic(Exception error, Component c) { - if (c != null) { - JOptionPane.showMessageDialog(c, error.getMessage(), - "VARNA Critical Error", JOptionPane.ERROR_MESSAGE); - } else { - System.err.println("Error: " + error.getMessage()); - } - } - - /** - * Displays a warning message through a modal dialog if warnings are set to - * be displayed. - * - * @see #setShowWarnings(boolean) - * @param warning - * A message expliciting the warning - */ - public void emitWarning(String warning) { - if (_conf._showWarnings) - JOptionPane.showMessageDialog(this, warning, "VARNA Warning", - JOptionPane.WARNING_MESSAGE); - } - - public static void emitWarningStatic(Exception e, Component c) { - emitWarningStatic(e.getMessage(), c); - } - - public static void emitWarningStatic(String warning, Component c) { - if (c != null) { - JOptionPane.showMessageDialog(c, warning, "VARNA Warning", - JOptionPane.WARNING_MESSAGE); - } else { - System.err.println("Error: " + warning); - } - } - - /** - * Toggles modifications on and off - * - * @param modifiable - * Modification status - */ - public void setModifiable(boolean modifiable) { - _conf._modifiable = modifiable; - } - - /** - * Returns current modification status - * - * @return current modification status - */ - public boolean isModifiable() { - return _conf._modifiable; - } - - /** - * Resets the visual aspects (Zoom factor, shift) for the Panel. - */ - public void reset() { - this.setBorderSize(new Dimension(0, 0)); - this.setTranslation(new Point(0, (int) (-getTitleHeight() / 2.0))); - this.setZoom(VARNAConfig.DEFAULT_ZOOM); - this.setZoomIncrement(VARNAConfig.DEFAULT_AMOUNT); - } - - /** - * Returns the color used to draw non-standard bases - * - * @return The color used to draw non-standard bases - */ - public Color getNonStandardBasesColor() { - return _conf._specialBasesColor; - } - - /** - * Sets the color used to draw non-standard bases - * - * @param basesColor - * The color used to draw non-standard bases - */ - public void setNonStandardBasesColor(Color basesColor) { - _conf._specialBasesColor = basesColor; - } - - /** - * Checks if the current translation doesn't "kick" the whole RNA out of the - * panel, and corrects the situation if necessary. - */ - public void checkTranslation() { - // verification pour un zoom < 1 - if (this.getZoom() <= 1) { - // verification sortie gauche - if (this.getTranslation().x < -(int) ((this.getWidth() - this - .getInnerWidth()) / 2.0)) { - this.setTranslation(new Point(-(int) ((this.getWidth() - this - .getInnerWidth()) / 2.0), this.getTranslation().y)); - } - // verification sortie droite - if (this.getTranslation().x > (int) ((this.getWidth() - this - .getInnerWidth()) / 2.0)) { - this.setTranslation(new Point((int) ((this.getWidth() - this - .getInnerWidth()) / 2.0), this.getTranslation().y)); - } - // verification sortie bas - if (this.getTranslation().y > (int) ((this.getHeight() - - getTitleHeight() * 2 - this.getInnerHeight()) / 2.0)) { - this.setTranslation(new Point(this.getTranslation().x, - (int) ((this.getHeight() - getTitleHeight() * 2 - this - .getInnerHeight()) / 2.0))); - } - // verification sortie haut - if (this.getTranslation().y < -(int) ((this.getHeight() - this - .getInnerHeight()) / 2.0)) { - this.setTranslation(new Point( - this.getTranslation().x, - -(int) ((this.getHeight() - this.getInnerHeight()) / 2.0))); - } - } else { - // zoom > 1 - Rectangle r2 = getZoomedInTranslationBox(); - int LBoundX = r2.x; - int UBoundX = r2.x + r2.width; - int LBoundY = r2.y; - int UBoundY = r2.y + r2.height; - if (this.getTranslation().x < LBoundX) { - this.setTranslation(new Point(LBoundX, getTranslation().y)); - } else if (this.getTranslation().x > UBoundX) { - this.setTranslation(new Point(UBoundX, getTranslation().y)); - } - if (this.getTranslation().y < LBoundY) { - this.setTranslation(new Point(getTranslation().x, LBoundY)); - } else if (this.getTranslation().y > UBoundY) { - this.setTranslation(new Point(getTranslation().x, UBoundY)); - } - } - } - - public Rectangle getZoomedInTranslationBox() { - int LBoundX = -(int) ((this.getInnerWidth()) / 2.0); - int UBoundX = (int) ((this.getInnerWidth()) / 2.0); - int LBoundY = -(int) ((this.getInnerHeight()) / 2.0); - int UBoundY = (int) ((this.getInnerHeight()) / 2.0); - return new Rectangle(LBoundX, LBoundY, UBoundX - LBoundX, UBoundY - - LBoundY); - - } - - /** - * Returns the "real pixels" x-coordinate of the RNA. - * - * @return X-coordinate of the translation - */ - public int getLeftOffset() { - return _border.width - + ((this.getWidth() - 2 * _border.width) - this.getInnerWidth()) - / 2 + _translation.x; - } - - /** - * Returns the "real pixels" width of the drawing surface for our RNA. - * - * @return Width of the drawing surface for our RNA - */ - public int getInnerWidth() { - // Largeur du dessin - return (int) Math.round((this.getWidth() - 2 * _border.width) - * _conf._zoom); - } - - /** - * Returns the "real pixels" y-coordinate of the RNA. - * - * @return Y-coordinate of the translation - */ - public int getTopOffset() { - return _border.height - + ((this.getHeight() - 2 * _border.height) - this - .getInnerHeight()) / 2 + _translation.y; - } - - /** - * Returns the "real pixels" height of the drawing surface for our RNA. - * - * @return Height of the drawing surface for our RNA - */ - public int getInnerHeight() { - // Hauteur du dessin - return (int) Math.round((this.getHeight()) * _conf._zoom - 2 - * _border.height - getTitleHeight()); - } - - /** - * Checks if the current mode is the "comparison" mode - * - * @return True if comparison, false otherwise - */ - public boolean isComparisonMode() { - return _conf._comparisonMode; - } - - /** - * Rotates the RNA coordinates by a certain angle - * - * @param angleDegres - * Rotation angle, in degrees - */ - public void globalRotation(Double angleDegres) { - _RNA.globalRotation(angleDegres); - fireLayoutChanged(); - repaint(); - } - - /** - * Returns the index of the currently selected base, defaulting to the - * closest base to the last mouse-click. - * - * @return Index of the currently selected base - */ - public Integer getNearestBase() { - return _nearestBase; - } - - /** - * Sets the index of the currently selected base. - * - * @param base - * Index of the new selected base - */ - public void setNearestBase(Integer base) { - _nearestBase = base; - } - - /** - * Returns the color used to draw 'Gaps' bases in comparison mode - * - * @return Color used for 'Gaps' - */ - public Color getGapsBasesColor() { - return _conf._dashBasesColor; - } - - /** - * Sets the color to use for 'Gaps' bases in comparison mode - * - * @param c - * Color used for 'Gaps' - */ - public void setGapsBasesColor(Color c) { - _conf._dashBasesColor = c; - } - - @SuppressWarnings("unused") - private void imprimer() { - // PrintPanel canvas; - // canvas = new PrintPanel(); - PrintRequestAttributeSet attributes; - attributes = new HashPrintRequestAttributeSet(); - try { - PrinterJob job = PrinterJob.getPrinterJob(); - // job.setPrintable(this); - if (job.printDialog(attributes)) { - job.print(attributes); - } - } catch (PrinterException exception) { - errorDialog(exception); - } - } - - /** - * Checks whether errors are to be displayed - * - * @return Error display status - */ - public boolean isErrorsOn() { - return _conf._errorsOn; - } - - /** - * Sets whether errors are to be displayed - * - * @param on - * New error display status - */ - public void setErrorsOn(boolean on) { - _conf._errorsOn = on; - } - - /** - * Returns the view associated with user interactions - * - * @return A view associated with user interactions - */ - public VueUI getVARNAUI() { - return _UI; - } - - /** - * Toggles on/off using base inner color for drawing base-pairs - * - * @param on - * True for using base inner color for drawing base-pairs, false - * for classic mode - */ - public void setUseBaseColorsForBPs(boolean on) { - _conf._useBaseColorsForBPs = on; - } - - /** - * Returns true if current base color is used as inner color for drawing - * base-pairs - * - * @return True for using base inner color for drawing base-pairs, false for - * classic mode - */ - public boolean getUseBaseColorsForBPs() { - return _conf._useBaseColorsForBPs; - } - - /** - * Toggles on/off using a special color used for drawing "non-standard" - * bases - * - * @param on - * True for using a special color used for drawing "non-standard" - * bases, false for classic mode - */ - public void setColorNonStandardBases(boolean on) { - _conf._colorSpecialBases = on; - } - - /** - * Returns true if a special color is used as inner color for non-standard - * base - * - * @return True for using a special color used for drawing "non-standard" - * bases, false for classic mode - */ - public boolean getColorSpecialBases() { - return _conf._colorSpecialBases; - } - - /** - * Toggles on/off using a special color used for drawing "Gaps" bases in - * comparison mode - * - * @param on - * True for using a special color used for drawing "Gaps" bases - * in comparison mode, false for classic mode - */ - public void setColorGapsBases(boolean on) { - _conf._colorDashBases = on; - } - - /** - * Returns true if a special color is used for drawing "Gaps" bases in - * comparison mode - * - * @return True for using a special color used for drawing "Gaps" bases in - * comparison mode, false for classic mode - */ - public boolean getColorGapsBases() { - return _conf._colorDashBases; - } - - /** - * Toggles on/off displaying warnings - * - * @param on - * True to display warnings, false otherwise - */ - public void setShowWarnings(boolean on) { - _conf._showWarnings = on; - } - - /** - * Get current warning display status - * - * @return True to display warnings, false otherwise - */ - public boolean getShowWarnings() { - return _conf._showWarnings; - } - - /** - * Toggles on/off displaying non-canonical base-pairs - * - * @param on - * True to display NC base-pairs, false otherwise - */ - public void setShowNonCanonicalBP(boolean on) { - _conf._drawnNonCanonicalBP = on; - } - - /** - * Return the current display status for non-canonical base-pairs - * - * @return True if NC base-pairs are displayed, false otherwise - */ - public boolean getShowNonCanonicalBP() { - return _conf._drawnNonCanonicalBP; - } - - /** - * Toggles on/off displaying "non-planar" base-pairs - * - * @param on - * True to display "non-planar" base-pairs, false otherwise - */ - public void setShowNonPlanarBP(boolean on) { - _conf._drawnNonPlanarBP = on; - } - - /** - * Return the current display status for non-planar base-pairs - * - * @return True if non-planars base-pairs are displayed, false otherwise - */ - public boolean getShowNonPlanarBP() { - return _conf._drawnNonPlanarBP; - } - - /** - * Sets the base-pair representation style - * - * @param st - * The new base-pair style - */ - public void setBPStyle(VARNAConfig.BP_STYLE st) { - _conf._mainBPStyle = st; - } - - /** - * Returns the base-pair representation style - * - * @return The current base-pair style - */ - public VARNAConfig.BP_STYLE getBPStyle() { - return _conf._mainBPStyle; - } - - /** - * Returns the current VARNA Panel configuration. The returned instance - * should not be modified directly, but rather through the getters/setters - * from the VARNAPanel class. - * - * @return Current configuration - */ - public VARNAConfig getConfig() { - return _conf; - } - - /** - * Sets the background color - * - * @param c - * New background color - */ - public void setBackground(Color c) { - if (_conf != null) { - if (c != null) { - _conf._backgroundColor = c; - _conf._drawBackground = (!c - .equals(VARNAConfig.DEFAULT_BACKGROUND_COLOR)); - } else { - _conf._backgroundColor = VARNAConfig.DEFAULT_BACKGROUND_COLOR; - _conf._drawBackground = false; - } - } - - } - - /** - * Starts highlighting the selected base. - */ - public void highlightSelectedBase(ModeleBase m) { - ArrayList v = new ArrayList(); - int sel = m.getIndex(); - if (sel != -1) { - v.add(sel); - } - setSelection(v); - } - - /** - * Starts highlighting the selected base. - */ - public void highlightSelectedStem(ModeleBase m) { - ArrayList v = new ArrayList(); - int sel = m.getIndex(); - if (sel != -1) { - ArrayList r = _RNA.findStem(sel); - v.addAll(r); - } - setSelection(v); - } - - public BaseList getSelection() { - return _selectedBases; - } - - public ArrayList getSelectionIndices() { - return _selectedBases.getIndices(); - } - - public void setSelection(ArrayList indices) { - setSelection(_RNA.getBasesAt(indices)); - } - - public void setSelection(Collection mbs) { - BaseList bck = new BaseList(_selectedBases); - _selectedBases.clear(); - _selectedBases.addBases(mbs); - _blink.setActive(true); - fireSelectionChanged(bck, _selectedBases); - } - - public ArrayList getBasesInRectangleDiff(Rectangle recIn, - Rectangle recOut) { - ArrayList result = new ArrayList(); - for (int i = 0; i < _realCoords.length; i++) { - if (recIn.contains(_realCoords[i]) - ^ recOut.contains(_realCoords[i])) - result.add(i); - } - return result; - } - - public ArrayList getBasesInRectangle(Rectangle rec) { - ArrayList result = new ArrayList(); - for (int i = 0; i < _realCoords.length; i++) { - if (rec.contains(_realCoords[i])) - result.add(i); - } - return result; - } - - public void setSelectionRectangle(Rectangle rec) { - ArrayList result = new ArrayList(); - if (_selectionRectangle != null) { - result = getBasesInRectangleDiff(_selectionRectangle, rec); - } else { - result = getBasesInRectangle(rec); - } - _selectionRectangle = new Rectangle(rec); - toggleSelection(result); - repaint(); - } - - public void removeSelectionRectangle() { - _selectionRectangle = null; - } - - public void addToSelection(Collection indices) { - for (int i : indices) { - addToSelection(i); - } - } - - public void addToSelection(int i) { - BaseList bck = new BaseList(_selectedBases); - ModeleBase mb = _RNA.getBaseAt(i); - _selectedBases.addBase(mb); - _blink.setActive(true); - fireSelectionChanged(bck, _selectedBases); - } - - public void removeFromSelection(int i) { - BaseList bck = new BaseList(_selectedBases); - ModeleBase mb = _RNA.getBaseAt(i); - _selectedBases.removeBase(mb); - if (_selectedBases.size() == 0) { - _blink.setActive(false); - } else { - _blink.setActive(true); - } - fireSelectionChanged(bck, _selectedBases); - } - - public boolean isInSelection(int i) { - return _selectedBases.contains(_RNA.getBaseAt(i)); - } - - public void toggleSelection(int i) { - if (isInSelection(i)) - removeFromSelection(i); - else - addToSelection(i); - } - - public void toggleSelection(Collection indices) { - for (int i : indices) { - toggleSelection(i); - } - } - - /** - * Stops highlighting bases - */ - public void clearSelection() { - BaseList bck = new BaseList(_selectedBases); - _selectedBases.clear(); - _blink.setActive(false); - repaint(); - fireSelectionChanged(bck, _selectedBases); - } - - public void saveSelection() { - _backupSelection.clear(); - _backupSelection.addAll(_selectedBases.getBases()); - } - - public void restoreSelection() { - setSelection(_backupSelection); - } - - /** - * Stops highlighting bases - */ - public void resetAnnotationHighlight() { - _highlightAnnotation = false; - repaint(); - } - - /** - * Toggles on/off a rectangular outline of the bounding box. - * - * @param on - * True to draw the bounding box, false otherwise - */ - public void drawBBox(boolean on) { - _drawBBox = on; - } - - /** - * Toggles on/off a rectangular outline of the border. - * - * @param on - * True to draw the bounding box, false otherwise - */ - public void drawBorder(boolean on) { - _drawBorder = on; - } - - public void setBaseInnerColor(Color c) { - _RNA.setBaseInnerColor(c); - } - - public void setBaseNumbersColor(Color c) { - _RNA.setBaseNumbersColor(c); - } - - public void setBaseNameColor(Color c) { - _RNA.setBaseNameColor(c); - } - - public void setBaseOutlineColor(Color c) { - _RNA.setBaseOutlineColor(c); - } - - public ArrayList getListeAnnotations() { - return _RNA.getAnnotations(); - } - - public void resetListeAnnotations() { - _RNA.clearAnnotations(); - repaint(); - } - - public void addAnnotation(TextAnnotation textAnnotation) { - _RNA.addAnnotation(textAnnotation); - repaint(); - } - - public boolean removeAnnotation(TextAnnotation textAnnotation) { - boolean done = _RNA.removeAnnotation(textAnnotation); - repaint(); - return done; - } - - public TextAnnotation get_selectedAnnotation() { - return _selectedAnnotation; - } - - public void set_selectedAnnotation(TextAnnotation annotation) { - _selectedAnnotation = annotation; - } - - public void removeSelectedAnnotation() { - _highlightAnnotation = false; - _selectedAnnotation = null; - } - - public void highlightSelectedAnnotation() { - _highlightAnnotation = true; - } - - public boolean getFlatExteriorLoop() { - return _conf._flatExteriorLoop; - } - - public void setFlatExteriorLoop(boolean on) { - _conf._flatExteriorLoop = on; - } - - public void setLastSelectedPosition(Point2D.Double p) { - _lastSelectedCoord.x = p.x; - _lastSelectedCoord.y = p.y; - } - - public Point2D.Double getLastSelectedPosition() { - return _lastSelectedCoord; - } - - public void setSequence(String s) { - _RNA.setSequence(s); - repaint(); - } - - public void setColorMapVisible(boolean b) { - _conf._drawColorMap = b; - repaint(); - } - - public boolean getColorMapVisible() { - return _conf._drawColorMap; - } - - public void removeColorMap() { - _conf._drawColorMap = false; - repaint(); - } - - public void saveSession(String path) { - /* - * FileOutputStream fos = null; ObjectOutputStream out = null; try { fos - * = new FileOutputStream(path); out = new ObjectOutputStream(fos); - * out.writeObject(new FullBackup(_conf, _RNA, _conf._title)); - * out.close(); } catch (Exception ex) { ex.printStackTrace(); } - */ - toXML(path); - } - - public FullBackup loadSession(String path) throws ExceptionLoadingFailed { - return loadSession(new File(path)); - } - public FullBackup loadSession(File path) throws ExceptionLoadingFailed { - - FullBackup bck = importSession(path); - Mapping map = Mapping.DefaultOutermostMapping(getRNA().getSize(), - bck.rna.getSize()); - showRNAInterpolated(bck.rna, map); - _conf = bck.config; - repaint(); - return bck; - } - - public static String VARNA_SESSION_EXTENSION = "varna"; - - public static FullBackup importSession(Object path) // BH was String - throws ExceptionLoadingFailed { - try { - FileInputStream fis = (path instanceof File ? new FileInputStream((File) path) : new FileInputStream(path.toString())); - // ZipInputStream zis = new - // ZipInputStream(new BufferedInputStream(fis)); - // zis.getNextEntry(); - FullBackup h = importSession(fis, path.toString()); - // zis.close(); - return h; - } catch (FileNotFoundException e) { - throw (new ExceptionLoadingFailed("File not found.", path.toString())); - } catch (IOException e) { - // TODO Auto-generated catch block - throw (new ExceptionLoadingFailed( - "I/O error while loading session.", path.toString())); - } - } - - public static FullBackup importSession(InputStream fis, String path) - throws ExceptionLoadingFailed { - System.setProperty("javax.xml.parsers.SAXParserFactory", - "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); - SAXParserFactory saxFact = javax.xml.parsers.SAXParserFactory - .newInstance(); - saxFact.setValidating(false); - saxFact.setXIncludeAware(false); - saxFact.setNamespaceAware(false); - try { - SAXParser sp = saxFact.newSAXParser(); - VARNASessionParser sessionData = new VARNASessionParser(); - sp.parse(fis, sessionData); - FullBackup res = new FullBackup(sessionData.getVARNAConfig(), - sessionData.getRNA(), "test"); - return res; - } catch (ParserConfigurationException e) { - throw new ExceptionLoadingFailed("Bad XML parser configuration", - path); - } catch (SAXException e) { - throw new ExceptionLoadingFailed("XML parser Exception", path); - } catch (IOException e) { - throw new ExceptionLoadingFailed("I/O error", path); - } - } - - public void loadFile(File path) { - loadFile(path, false); - } - - public boolean getDrawBackbone() { - return _conf._drawBackbone; - } - - public void setDrawBackbone(boolean b) { - _conf._drawBackbone = b; - } - - public void addHighlightRegion(HighlightRegionAnnotation n) { - _RNA.addHighlightRegion(n); - } - - public void removeHighlightRegion(HighlightRegionAnnotation n) { - _RNA.removeHighlightRegion(n); - } - - public void addHighlightRegion(int i, int j) { - _RNA.addHighlightRegion(i, j); - } - - public void addHighlightRegion(int i, int j, Color fill, Color outline, - double radius) { - _RNA.addHighlightRegion(i, j, fill, outline, radius); - } - - public void loadRNA(String path) { - loadRNA(path, false); - } - - public void loadRNA(Object path, boolean interpolate) { // BH was String - try { - Collection rnas = (path instanceof File ? RNAFactory.loadSecStr(new FileReader((File) path)) : RNAFactory.loadSecStr(path.toString())); - if (rnas.isEmpty()) { - throw new ExceptionFileFormatOrSyntax( - "No RNA could be parsed from that source."); - } - RNA rna = rnas.iterator().next(); - try { - rna.drawRNA(_conf); - } catch (ExceptionNAViewAlgorithm e) { - e.printStackTrace(); - } - if (!interpolate) { - showRNA(rna); - } else { - this.showRNAInterpolated(rna); - } - - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (ExceptionFileFormatOrSyntax e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void loadFile(File path, boolean interpolate) { // was String BH StringJS - try { - loadSession(path); - } catch (Exception e1) { - loadRNA(path, interpolate); - } - } - - public void setConfig(VARNAConfig cfg) { - _conf = cfg; - } - - public void toggleDrawOutlineBases() { - _conf._drawOutlineBases = !_conf._drawOutlineBases; - } - - public void toggleFillBases() { - _conf._fillBases = !_conf._fillBases; - } - - public void setDrawOutlineBases(boolean drawn) { - _conf._drawOutlineBases = drawn; - } - - public void setFillBases(boolean drawn) { - _conf._fillBases = drawn; - } - - public void readValues(Reader r) { - this._RNA.readValues(r, _conf._cm); - } - - public void addVARNAListener(InterfaceVARNAListener v) { - _VARNAListeners.add(v); - } - - public void fireLayoutChanged() { - for (InterfaceVARNAListener v : _VARNAListeners) { - v.onStructureRedrawn(); - } - } - - public void fireUINewStructure(RNA r) { - for (InterfaceVARNAListener v : _VARNAListeners) { - v.onUINewStructure(_conf, r); - } - } - - public void fireZoomLevelChanged(double d) { - for (InterfaceVARNAListener v : _VARNAListeners) { - v.onZoomLevelChanged(); - } - } - - public void fireTranslationChanged() { - for (InterfaceVARNAListener v2 : _VARNAListeners) { - v2.onTranslationChanged(); - } - } - - public void addSelectionListener(InterfaceVARNASelectionListener v) { - _selectionListeners.add(v); - } - - public void fireSelectionChanged(BaseList mold, BaseList mnew) { - BaseList addedBases = mnew.removeAll(mold); - BaseList removedBases = mold.removeAll(mnew); - for (InterfaceVARNASelectionListener v2 : _selectionListeners) { - v2.onSelectionChanged(mnew, addedBases, removedBases); - } - } - - public void fireHoverChanged(ModeleBase mold, ModeleBase mnew) { - for (InterfaceVARNASelectionListener v2 : _selectionListeners) { - v2.onHoverChanged(mold, mnew); - } - } - - public void addRNAListener(InterfaceVARNARNAListener v) { - _RNAListeners.add(v); - } - - public void addVARNABasesListener(InterfaceVARNABasesListener l) { - _basesListeners.add(l); - } - - public void fireSequenceChanged(int index, String oldseq, String newseq) { - for (InterfaceVARNARNAListener v2 : _RNAListeners) { - v2.onSequenceModified(index, oldseq, newseq); - } - } - - public void fireStructureChanged(Set current, - Set addedBasePairs, Set removedBasePairs) { - for (InterfaceVARNARNAListener v2 : _RNAListeners) { - v2.onStructureModified(current, addedBasePairs, removedBasePairs); - } - } - - public void fireLayoutChanged( - Hashtable movedPositions) { - for (InterfaceVARNARNAListener v2 : _RNAListeners) { - v2.onRNALayoutChanged(movedPositions); - } - } - - public void fireBaseClicked(ModeleBase mb, MouseEvent me) { - if (mb != null) { - for (InterfaceVARNABasesListener v2 : _basesListeners) { - v2.onBaseClicked(mb, me); - } - } - } - - public double getOrientation() { - return _RNA.getOrientation(); - } - - public ModeleBase _hoveredBase = null; - - public void setHoverBase(ModeleBase m) { - if (m != _hoveredBase) { - ModeleBase bck = _hoveredBase; - _hoveredBase = m; - repaint(); - fireHoverChanged(bck, m); - } - } - - public void toXML(String path) { - FileOutputStream fis; - try { - fis = new FileOutputStream(path); - // ZipOutputStream zis = new ZipOutputStream(new - // BufferedOutputStream(fis)); - // ZipEntry entry = new ZipEntry("VARNASession"); - // zis.putNextEntry(entry); - PrintWriter pw = new PrintWriter(fis); - toXML(pw); - pw.flush(); - // zis.closeEntry(); - // zis.close(); - fis.close(); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - public void toXML(PrintWriter out) { - try { - - // out = new PrintWriter(System.out); - StreamResult streamResult = new StreamResult(out); - SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory - .newInstance(); - // SAX2.0 ContentHandler. - TransformerHandler hd = tf.newTransformerHandler(); - Transformer serializer = hd.getTransformer(); - serializer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); - serializer - .setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "users.dtd"); - serializer.setOutputProperty(OutputKeys.INDENT, "yes"); - hd.setResult(streamResult); - hd.startDocument(); - toXML(hd); - hd.endDocument(); - } catch (TransformerConfigurationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (SAXException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - - public static String XML_ELEMENT_NAME = "VARNASession"; - - public void toXML(TransformerHandler hd) throws SAXException { - AttributesImpl atts = new AttributesImpl(); - hd.startElement("", "", XML_ELEMENT_NAME, atts); - _RNA.toXML(hd); - _conf.toXML(hd); - hd.endElement("", "", XML_ELEMENT_NAME); - } - - public TextAnnotation getNearestAnnotation(int x, int y) { - TextAnnotation t = null; - if (getListeAnnotations().size() != 0) { - double dist = Double.MAX_VALUE; - double d2; - Point2D.Double position; - for (TextAnnotation textAnnot : getListeAnnotations()) { - // calcul de la distance - position = textAnnot.getCenterPosition(); - position = transformCoord(position); - d2 = Math.sqrt(Math.pow((position.x - x), 2) - + Math.pow((position.y - y), 2)); - // si la valeur est inferieur au minimum actuel - if ((dist > d2) - && (d2 < getScaleFactor() - * ControleurClicMovement.MIN_SELECTION_DISTANCE)) { - t = textAnnot; - dist = d2; - } - } - } - return t; - } - - public ModeleBase getNearestBase(int x, int y, boolean always, - boolean onlyPaired) { - int i = getNearestBaseIndex(x, y, always, onlyPaired); - if (i == -1) - return null; - return getRNA().get_listeBases().get(i); - } - - public ModeleBase getNearestBase(int x, int y) { - return getNearestBase(x, y, false, false); - } - - public int getNearestBaseIndex(int x, int y, boolean always, - boolean onlyPaired) { - double d2, dist = Double.MAX_VALUE; - int mb = -1; - for (int i = 0; i < getRealCoords().length; i++) { - if (!onlyPaired - || (getRNA().get_listeBases().get(i).getElementStructure() != -1)) { - d2 = Math.sqrt(Math.pow((getRealCoords()[i].x - x), 2) - + Math.pow((getRealCoords()[i].y - y), 2)); - if ((dist > d2) - && ((d2 < getScaleFactor() - * ControleurClicMovement.MIN_SELECTION_DISTANCE) || always)) { - dist = d2; - mb = i; - } - } - } - return mb; - } - - public void globalRescale(double factor) { - _RNA.rescale(factor); - fireLayoutChanged(); - repaint(); - } - - public void setSpaceBetweenBases(double sp) { - _conf._spaceBetweenBases = sp; - } - - public double getSpaceBetweenBases() { - return _conf._spaceBetweenBases; - } - - -} diff --git a/src2/fr/orsay/lri/varna/applications/AlignmentDemo.java b/src2/fr/orsay/lri/varna/applications/AlignmentDemo.java deleted file mode 100644 index 18c328c..0000000 --- a/src2/fr/orsay/lri/varna/applications/AlignmentDemo.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - 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; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import fr.orsay.lri.varna.VARNAPanel; - -import fr.orsay.lri.varna.models.rna.RNA; - - -public class AlignmentDemo extends JFrame{ - - /** - * - */ - private static final long serialVersionUID = -790155708306987257L; - - private static final String DEFAULT_SEQUENCE1 = "CGCGCACGCGA----UAUU----UCGCGUCGCGCAUUUGCGCGUAGCGCG"; - private static final String DEFAULT_STRUCTURE1 = "(((((.(((((----....----))))).(((((....)))))..)))))"; - - private static final String DEFAULT_SEQUENCE2 = "CGCGCACGCGSGCGCGUUUGCGCUCGCGU---------------AGCGCG"; - private static final String DEFAULT_STRUCTURE2 = "(((((.(((((((((....))))))))).--------------..)))))"; - // private static final String DEFAULT_STRUCTURE1 = "((((....))))"; - // private static final String DEFAULT_STRUCTURE2 = - // "((((..(((....)))..))))"; - - private VARNAPanel _vpMaster; - - private JPanel _tools = new JPanel(); - private JPanel _input = new JPanel(); - - private JPanel _seq1Panel = new JPanel(); - private JPanel _seq2Panel = new JPanel(); - private JPanel _struct1Panel = new JPanel(); - private JPanel _struct2Panel = new JPanel(); - private JLabel _info = new JLabel(); - private JTextField _struct1 = new JTextField(DEFAULT_STRUCTURE1); - private JTextField _struct2 = new JTextField(DEFAULT_STRUCTURE2); - private JTextField _seq1 = new JTextField(DEFAULT_SEQUENCE1); - private JTextField _seq2 = new JTextField(DEFAULT_SEQUENCE2); - private JLabel _struct1Label = new JLabel(" Str1:"); - private JLabel _struct2Label = new JLabel(" Str2:"); - private JLabel _seq1Label = new JLabel(" Seq1:"); - private JLabel _seq2Label = new JLabel(" Seq2:"); - private JButton _goButton = new JButton("Go"); - - private String _str1Backup = ""; - private String _str2Backup = ""; - private String _seq1Backup = ""; - private String _seq2Backup = ""; - private RNA _RNA = new RNA(); - - private static String errorOpt = "error"; - @SuppressWarnings("unused") - private boolean _error; - - private Color _backgroundColor = Color.white; - - @SuppressWarnings("unused") - private int _algoCode; - - - public AlignmentDemo() { - super(); - _vpMaster = new VARNAPanel(getSeq1(), getStruct1(), getSeq2(), getStruct2(), RNA.DRAW_MODE_RADIATE,""); - _vpMaster.setPreferredSize(new Dimension(600, 400)); - RNAPanelDemoInit(); - } - - private void RNAPanelDemoInit() { - int marginTools = 40; - - setBackground(_backgroundColor); - _vpMaster.setBackground(_backgroundColor); - - Font textFieldsFont = Font.decode("MonoSpaced-PLAIN-12"); - - - _goButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - _vpMaster.drawRNA(getSeq1(), getStruct1(), getSeq2(), getStruct2(), _vpMaster.getDrawMode()); - _vpMaster.repaint(); - } - }); - - - _seq1Label.setHorizontalTextPosition(JLabel.LEFT); - _seq1Label.setPreferredSize(new Dimension(marginTools, 15)); - _seq1.setFont(textFieldsFont); - - _seq1Panel.setLayout(new BorderLayout()); - _seq1Panel.add(_seq1Label, BorderLayout.WEST); - _seq1Panel.add(_seq1, BorderLayout.CENTER); - - _seq2Label.setHorizontalTextPosition(JLabel.LEFT); - _seq2Label.setPreferredSize(new Dimension(marginTools, 15)); - _seq2.setFont(textFieldsFont); - - _seq2Panel.setLayout(new BorderLayout()); - _seq2Panel.add(_seq2Label, BorderLayout.WEST); - _seq2Panel.add(_seq2, BorderLayout.CENTER); - - _struct1Label.setPreferredSize(new Dimension(marginTools, 15)); - _struct1Label.setHorizontalTextPosition(JLabel.LEFT); - _struct1.setFont(textFieldsFont); - _struct1Panel.setLayout(new BorderLayout()); - _struct1Panel.add(_struct1Label, BorderLayout.WEST); - _struct1Panel.add(_struct1, BorderLayout.CENTER); - - _struct2Label.setPreferredSize(new Dimension(marginTools, 15)); - _struct2Label.setHorizontalTextPosition(JLabel.LEFT); - _struct2.setFont(textFieldsFont); - _struct2Panel.setLayout(new BorderLayout()); - _struct2Panel.add(_struct2Label, BorderLayout.WEST); - _struct2Panel.add(_struct2, BorderLayout.CENTER); - - _input.setLayout(new GridLayout(4, 0)); - _input.add(_seq1Panel); - _input.add(_struct1Panel); - _input.add(_seq2Panel); - _input.add(_struct2Panel); - - JPanel goPanel = new JPanel(); - goPanel.setLayout(new BorderLayout()); - - _tools.setLayout(new BorderLayout()); - _tools.add(_input, BorderLayout.CENTER); - _tools.add(_info, BorderLayout.SOUTH); - _tools.add(goPanel, BorderLayout.EAST); - - goPanel.add(_goButton, BorderLayout.CENTER); - - getContentPane().setLayout(new BorderLayout()); - JPanel VARNAs = new JPanel(); - VARNAs.setLayout(new GridLayout(1,1)); - VARNAs.add(_vpMaster); - getContentPane().add(VARNAs, BorderLayout.CENTER); - getContentPane().add(_tools, BorderLayout.SOUTH); - - setVisible(true); - _vpMaster.getVARNAUI().UIRadiate(); - } - - public RNA getRNA() { - - if (!( _str1Backup.equals(getStruct1()) - && _str2Backup.equals(getStruct2()) - && _seq1Backup.equals(getSeq1()) - && _seq2Backup.equals(getSeq2()) - )) { - _vpMaster.drawRNA(getSeq1(), getStruct1(), getSeq2(), getStruct2(), _vpMaster.getDrawMode()); - _RNA = _vpMaster.getRNA(); - _str1Backup = getStruct1(); - _str2Backup = getStruct2(); - _seq1Backup = getSeq1(); - _seq2Backup = getSeq2(); - } - return _RNA; - } - - - public String getStruct1() { - return cleanStruct(_struct1.getText()); - } - - public String getStruct2() { - return cleanStruct(_struct2.getText()); - } - - public String getSeq1() { - return cleanStruct(_seq1.getText()); - } - - public String getSeq2() { - return cleanStruct(_seq2.getText()); - } - - - private String cleanStruct(String struct) { - struct = struct.replaceAll("[:-]", "-"); - return struct; - } - - public String[][] getParameterInfo() { - String[][] info = { - // Parameter Name Kind of Value Description, - { "sequenceDBN", "String", "A raw RNA sequence" }, - { "structureDBN", "String", - "An RNA structure in dot bracket notation (DBN)" }, - { errorOpt, "boolean", "To show errors" }, }; - return info; - } - - public void init() { - _vpMaster.setBackground(_backgroundColor); - _error = true; - } - - @SuppressWarnings("unused") - private Color getSafeColor(String col, Color def) { - Color result; - try { - result = Color.decode(col); - } catch (Exception e) { - try { - result = Color.getColor(col, def); - } catch (Exception e2) { - return def; - } - } - return result; - } - - public VARNAPanel get_varnaPanel() { - return _vpMaster; - } - - public void set_varnaPanel(VARNAPanel surface) { - _vpMaster = surface; - } - - public JTextField get_struct() { - return _struct1; - } - - public void set_struct(JTextField _struct) { - this._struct1 = _struct; - } - - public JTextField get_seq() { - return _seq1; - } - - public void set_seq(JTextField _seq) { - this._seq1 = _seq; - } - - public JLabel get_info() { - return _info; - } - - public void set_info(JLabel _info) { - this._info = _info; - } - - public static void main(String[] args) { - AlignmentDemo d = new AlignmentDemo(); - d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - d.pack(); - d.setVisible(true); - } - - public void onWarningEmitted(String s) { - // TODO Auto-generated method stub - - } -} diff --git a/src2/fr/orsay/lri/varna/applications/BasicINI.java b/src2/fr/orsay/lri/varna/applications/BasicINI.java deleted file mode 100644 index 89a590e..0000000 --- a/src2/fr/orsay/lri/varna/applications/BasicINI.java +++ /dev/null @@ -1,178 +0,0 @@ -package fr.orsay.lri.varna.applications; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.Reader; -import java.io.StreamTokenizer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Hashtable; -import java.util.Set; - -public class BasicINI { - - private Hashtable> _data = new Hashtable>(); - - - public void addItem(String category, String key, String val) - { - if (!_data.containsKey(category)) - { - _data.put(category, new Hashtable()); - } - System.out.println("[E]"+key+"->"+val); - _data.get(category).put(key,val); - } - - - public String getItem(String category, String key) - { - String result = ""; - if (_data.containsKey(category)) - { - if (_data.get(category).containsKey(key)) - { - result = _data.get(category).get(key); - } - } - return result; - } - - public ArrayList getItemList(String category) - { - ArrayList result = new ArrayList(); - if (_data.containsKey(category)) - { - for (String key: _data.get(category).keySet()) - { - result.add(_data.get(category).get(key)); - } - } - return result; - } - - public BasicINI(){ - - } - - public static void saveINI(BasicINI data, String filename) - { - try - { - FileWriter out = new FileWriter(filename); - Set cats = data._data.keySet(); - String[] sortedCats = new String[cats.size()]; - sortedCats = cats.toArray(sortedCats); - Arrays.sort(sortedCats); - for (int i=0;i vals = data._data.get(cat); - Set keys = vals.keySet(); - String[] sortedKeys = new String[keys.size()]; - sortedKeys = keys.toArray(sortedKeys); - for(int j=0;j sols = getStructs(); - _infos.setInfo(sols, count(getSeq())); - } - - - - - public String getSeq() - { - return (""+_seq1.getSelectedItem()).toUpperCase(); - } - - - private boolean canBasePairAll(char a, char b) - { - return true; - } - - private boolean canBasePairBasic(char a, char b) - { - if ((a=='G')&&(b=='C')) - return true; - if ((a=='C')&&(b=='G')) - return true; - if ((a=='U')&&(b=='A')) - return true; - if ((a=='A')&&(b=='U')) - return true; - if ((a=='G')&&(b=='U')) - return true; - if ((a=='U')&&(b=='G')) - return true; - return false; - } - - private double basePairScoreBasic(char a, char b) - { - if ((a=='G')&&(b=='C')) - return 1.0; - if ((a=='C')&&(b=='G')) - return 1.0; - if ((a=='U')&&(b=='A')) - return 1.0; - if ((a=='A')&&(b=='U')) - return 1.0; - if ((a=='G')&&(b=='U')) - return 1.0; - if ((a=='U')&&(b=='G')) - return 1.0; - return Double.NEGATIVE_INFINITY; - } - - - private boolean canBasePairNussinov(char a, char b) - { - if ((a=='G')&&(b=='C')) - return true; - if ((a=='C')&&(b=='G')) - return true; - if ((a=='U')&&(b=='A')) - return true; - if ((a=='A')&&(b=='U')) - return true; - if ((a=='U')&&(b=='G')) - return true; - if ((a=='G')&&(b=='U')) - return true; - return false; - } - - private double basePairScoreNussinov(char a, char b) - { - if ((a=='G')&&(b=='C')) - return 3.0; - if ((a=='C')&&(b=='G')) - return 3.0; - if ((a=='U')&&(b=='A')) - return 2.0; - if ((a=='A')&&(b=='U')) - return 2.0; - if ((a=='U')&&(b=='G')) - return 1.0; - if ((a=='G')&&(b=='U')) - return 1.0; - return Double.NEGATIVE_INFINITY; - } - - private boolean canBasePairINRIA(char a, char b) - { - if ((a=='U')&&(b=='A')) - return true; - if ((a=='A')&&(b=='U')) - return true; - if ((a=='G')&&(b=='C')) - return true; - if ((a=='C')&&(b=='G')) - return true; - - if ((a=='A')&&(b=='G')) - return true; - if ((a=='G')&&(b=='A')) - return true; - if ((a=='U')&&(b=='C')) - return true; - if ((a=='C')&&(b=='U')) - return true; - if ((a=='A')&&(b=='A')) - return true; - if ((a=='U')&&(b=='U')) - return true; - - if ((a=='U')&&(b=='G')) - return true; - if ((a=='G')&&(b=='U')) - return true; - if ((a=='A')&&(b=='C')) - return true; - if ((a=='C')&&(b=='A')) - return true; - return false; - } - - private double basePairScoreINRIA(char a, char b) - { - if ((a=='U')&&(b=='A')) - return 3; - if ((a=='A')&&(b=='U')) - return 3; - if ((a=='G')&&(b=='C')) - return 3; - if ((a=='C')&&(b=='G')) - return 3; - - if ((a=='A')&&(b=='G')) - return 2; - if ((a=='G')&&(b=='A')) - return 2; - if ((a=='U')&&(b=='C')) - return 2; - if ((a=='C')&&(b=='U')) - return 2; - if ((a=='A')&&(b=='A')) - return 2; - if ((a=='U')&&(b=='U')) - return 2; - - if ((a=='U')&&(b=='G')) - return 1; - if ((a=='G')&&(b=='U')) - return 1; - if ((a=='A')&&(b=='C')) - return 1; - if ((a=='C')&&(b=='A')) - return 1; - return Double.NEGATIVE_INFINITY; - } - - private boolean canBasePair(char a, char b) - { - return canBasePairBasic(a,b); - //return canBasePairNussinov(a,b); - //return canBasePairINRIA(a,b); - } - - private double basePairScore(char a, char b) - { - return basePairScoreBasic(a,b); - //return basePairScoreNussinov(a,b); - //return basePairScoreINRIA(a,b); - } - - public double[][] fillMatrix(String seq) - { - int n = seq.length(); - double[][] tab = new double[n][n]; - for(int m=1;m<=n;m++) - { - for(int i=0;ii+1) - { - fact1 = tab[i+1][k-1]; - } - double fact2 = 0; - if (k combine(double bonus, ArrayList part1, ArrayList part2) - { - ArrayList base = new ArrayList(); - for(double d1: part1) - { - for(double d2: part2) - { - base.add(bonus+d1+d2); - } - } - return base; - } - - public static ArrayList selectBests(ArrayList base) - { - ArrayList result = new ArrayList(); - double best = Double.NEGATIVE_INFINITY; - for(double val: base) - { - best = Math.max(val, best); - } - for(double val: base) - { - if (val == best) - result.add(val); - } - return result; - } - - - private ArrayList backtrack(double[][] tab, String seq) - { - return backtrack(tab,seq, 0, seq.length()-1); - } - - private ArrayList backtrack(double[][] tab, String seq, int i, int j) - { - ArrayList result = new ArrayList(); - if (i indices = new ArrayList(); - indices.add(-1); - for (int k=i+1;k<=j;k++) - { - indices.add(k); - } - for (int k : indices) - { - if (k==-1) - { - if (tab[i][j] == tab[i+1][j]) - { - for (String s:backtrack(tab, seq, i+1,j)) - { - result.add("."+s); - } - } - } - else - { - if (canBasePair(seq.charAt(i),seq.charAt(k))) - { - double fact1 = 0; - if (k>i+1) - { - fact1 = tab[i+1][k-1]; - } - double fact2 = 0; - if (ki+1) - { - fact1 = tab[i+1][k-1]; - } - BigInteger fact2 = BigInteger.ONE; - if (k _cacheStructs = new ArrayList(); - - public ArrayList getStructs() { - String seq = getSeq(); - seq = seq.toUpperCase(); - if (!_cache.equals(seq)) - { - double[][] mfe = fillMatrix(seq); - _cacheStructs = backtrack(mfe,seq); - _cache = seq; - } - return _cacheStructs; - } - - public VARNAPanel get_varnaPanel() { - return _vpMaster; - } - - public void set_varnaPanel(VARNAPanel surface) { - _vpMaster = surface; - } - - - public JLabel get_info() { - return _actions; - } - - public void set_info(JLabel _info) { - this._actions = _info; - } - - public static void main(String[] args) { - NussinovDemo d = new NussinovDemo(); - d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - d.pack(); - d.setVisible(true); - } - - public void onStructureRedrawn() { - _vpMaster.repaint(); - } - - public void onWarningEmitted(String s) { - // TODO Auto-generated method stub - - } - - public void onLoad(String path) { - // TODO Auto-generated method stub - - } - - public void onLoaded() { - // TODO Auto-generated method stub - - } - - public void onUINewStructure(VARNAConfig v, RNA r) { - // TODO Auto-generated method stub - - } - - static final String[] _bases = {"A","C","G","U"}; - static final String[] _basesComp = {"U","G","C","A"}; - - public void onBaseClicked(ModeleBase mb, MouseEvent e) { - } - - public void onZoomLevelChanged() { - // TODO Auto-generated method stub - - } - - public void onTranslationChanged() { - // TODO Auto-generated method stub - - } - private class InfoPanel extends JPanel - { - ArrayList _sols = new ArrayList(); - BigInteger _nbFolds = BigInteger.ZERO; - JTextArea _text = new JTextArea(""); - JTextArea _subopts = new JTextArea(""); - JPanel _suboptBrowser = new JPanel(); - JPanel _suboptCount = new JPanel(); - int _selectedIndex = 0; - JButton next = new JButton(">"); - JButton previous = new JButton("<"); - - InfoPanel() - { - setLayout(new BorderLayout()); - add(_suboptBrowser,BorderLayout.SOUTH); - add(_suboptCount,BorderLayout.NORTH); - - next.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent arg0) { - if (_sols.size()>0) - { - setSelectedIndex((_selectedIndex+1)%_sols.size()); - } - } - }); - - previous.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent arg0) { - if (_sols.size()>0) - { - setSelectedIndex((_selectedIndex+_sols.size()-1)%_sols.size()); - } - } - }); - next.setEnabled(false); - previous.setEnabled(false); - - - JLabel nbLab = new JLabel("#Repliements"); - NussinovDemo.formatLabel(nbLab); - - _suboptCount.setLayout(new BorderLayout()); - _suboptCount.add(nbLab,BorderLayout.WEST); - _suboptCount.add(_text,BorderLayout.CENTER); - - JLabel cooptlab = new JLabel("#Co-optimaux"); - NussinovDemo.formatLabel(cooptlab); - - JPanel commands = new JPanel(); - commands.add(previous); - commands.add(next); - - JPanel jp = new JPanel(); - jp.setLayout(new BorderLayout()); - jp.add(_subopts,BorderLayout.WEST); - jp.add(commands,BorderLayout.CENTER); - - _suboptBrowser.setLayout(new BorderLayout()); - _suboptBrowser.add(cooptlab,BorderLayout.WEST); - _suboptBrowser.add(jp,BorderLayout.CENTER); - - - } - - - public void setSelectedIndex(int i) - { - _selectedIndex = i; - RNA rfolded = new RNA(); - try { - rfolded.setRNA(getSeq(), _sols.get(i)); - rfolded.drawRNARadiate(_vpMaster.getConfig()); - rfolded.setBaseNameColor(Color.white); - rfolded.setBaseOutlineColor(Color.white); - rfolded.setBaseNumbersColor(Color.white); - _vpMaster.setBaseNumbersColor(Color.white); - _vpMaster.setBaseOutlineColor(Color.white); - _vpMaster.setFillBases(false); - _vpMaster.setBaseNameColor(Color.white); - _vpMaster.showRNAInterpolated(rfolded); - - } catch (ExceptionUnmatchedClosingParentheses e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionFileFormatOrSyntax e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - _struct.setText(_sols.get(i)); - formatDescription(); - } - - public void setFont(Font f) - { - super.setFont(f); - if(_text!=null) - { - _text.setFont(f); - _text.setOpaque(false); - } - if(_subopts!=null) - { - _subopts.setFont(f); - _subopts.setOpaque(false); - } - } - public void setInfo(ArrayList sols, BigInteger nbFolds) - { - _sols = sols; - _nbFolds = nbFolds; - formatDescription(); - setSelectedIndex(0); - } - - private void formatDescription() - { - _text.setText(""+_nbFolds); - _subopts.setText(""+_sols.size()); - next.setEnabled(_sols.size()>1); - previous.setEnabled(_sols.size()>1); - - } - - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/NussinovDesignDemo.java b/src2/fr/orsay/lri/varna/applications/NussinovDesignDemo.java deleted file mode 100644 index 9c82a07..0000000 --- a/src2/fr/orsay/lri/varna/applications/NussinovDesignDemo.java +++ /dev/null @@ -1,997 +0,0 @@ -/* - 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; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.awt.event.MouseEvent; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collections; - -import javax.swing.BorderFactory; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JSplitPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.JTextPane; -import javax.swing.border.BevelBorder; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurInterpolator; -import fr.orsay.lri.varna.exceptions.ExceptionDrawingAlgorithm; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionModeleStyleBaseSyntaxError; -import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionParameterError; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.exceptions.MappingException; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.VARNAConfig.BP_STYLE; -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModelBaseStyle; -import fr.orsay.lri.varna.models.rna.RNA; -import fr.orsay.lri.varna.interfaces.InterfaceVARNABasesListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener;; - -public class NussinovDesignDemo extends JFrame implements InterfaceVARNAListener,InterfaceVARNABasesListener, ItemListener { - - /** - * - */ - private static final long serialVersionUID = -790155708306987257L; - - private static final String SEQUENCE_A = "AGGCACGUCU"; - private static final String SEQUENCE_B = "GAGUAGCCUC"; - private static final String SEQUENCE_C = "GCAUAGCUGC"; - private static final String SEQUENCE_INRIA = "CGAUUGCAUCGCAAGU"; - - private static final String TARGET_STRUCTURE_1 = "(((((((..)))))))"; - private static final String TARGET_STRUCTURE_2 = "(((())))(((())))"; - private static final String TARGET_STRUCTURE_3 = "(.((.((..).)).))"; - private static final String TARGET_STRUCTURE_4 = "((((((())))(((())(()))))))"; - private static final String TARGET_STRUCTURE_5 = "(((())))(((())))(((())))(((())))(((())))(((())))"; - - private static final String SEQUENCE_BIG = "AAAACAAAAACACCAUGGUGUUUUCACCCAAUUGGGUGAAAACAGAGAUCUCGAGAUCUCUGUUUUUGUUUU"; - - private static final String DEFAULT_STRUCTURE = ".........."; - // private static final String DEFAULT_STRUCTURE1 = "((((....))))"; - // private static final String DEFAULT_STRUCTURE2 = - // "((((..(((....)))..))))"; - - private VARNAPanel _vpMaster; - private VARNAPanel _vpTarget; - - private InfoPanel _infos = new InfoPanel(); - private JPanel _tools = new JPanel(); - private JPanel _input = new JPanel(); - - private JPanel _seqPanel = new JPanel(); - private JPanel _structPanel = new JPanel(); - private JLabel _actions = new JLabel(); - private JComboBox _struct = new JComboBox(); - private JLabel _seq1 = new JLabel(); - private JLabel _structLabel = new JLabel("Structure Cible"); - private JLabel _seqLabel = new JLabel("Sequence d'ARN"); - private JButton _switchButton = new JButton("Reset"); - - - private Color _backgroundColor = Color.white; - - private Color _okColor = Color.decode("#E33729"); - private Color _koColor = new Color(250,200,200); - - - public static ModelBaseStyle createStyle(String txt) - { - ModelBaseStyle result = new ModelBaseStyle(); - try { - result.assignParameters(txt); - } catch (ExceptionModeleStyleBaseSyntaxError e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionParameterError e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return result; - } - - public void applyTo(VARNAPanel vp, ModelBaseStyle mb, int[] indices) - { - for(int i=0;i sols = getStructs(); - _infos.setInfo(sols, count(getSeq())); - if ((sols.size()==1)&&(sols.get(0).equals(_struct.getSelectedItem().toString()))) - { - /*JOptionPane.showMessageDialog(null, - "Vous avez trouvé une séquence pour cette structure !!!\n Saurez vous faire le design de molécules plus complexes ?", - "Félicitations !", - JOptionPane.INFORMATION_MESSAGE);*/ - - } - else - { - this._vpMaster.setTitle("Meilleur repliement - Séquence courante"); - } - } - - - public void setTarget(String target) - { - try { - _vpTarget.drawRNA(String.format("%"+target.length()+"s", ""),target); - _vpTarget.setBaseNumbersColor(Color.white); - _vpTarget.setBaseOutlineColor(Color.white); - //_vpTarget.toggleDrawOutlineBases(); - createDummySeq(); - showSolution(); - onStructureRedrawn(); - } catch (ExceptionNonEqualLength e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - private void createDummySeq() - { - RNA r = _vpTarget.getRNA(); - String seq = new String(); - for (int i=0;ii+1) - { - fact1 = tab[i+1][k-1]; - } - double fact2 = 0; - if (k combine(double bonus, ArrayList part1, ArrayList part2) - { - ArrayList base = new ArrayList(); - for(double d1: part1) - { - for(double d2: part2) - { - base.add(bonus+d1+d2); - } - } - return base; - } - - public static ArrayList selectBests(ArrayList base) - { - ArrayList result = new ArrayList(); - double best = Double.NEGATIVE_INFINITY; - for(double val: base) - { - best = Math.max(val, best); - } - for(double val: base) - { - if (val == best) - result.add(val); - } - return result; - } - - - private ArrayList backtrack(double[][] tab, String seq) - { - return backtrack(tab,seq, 0, seq.length()-1); - } - - private ArrayList backtrack(double[][] tab, String seq, int i, int j) - { - ArrayList result = new ArrayList(); - if (i indices = new ArrayList(); - indices.add(-1); - for (int k=i+1;k<=j;k++) - { - indices.add(k); - } - for (int k : indices) - { - if (k==-1) - { - if (tab[i][j] == tab[i+1][j]) - { - for (String s:backtrack(tab, seq, i+1,j)) - { - result.add("."+s); - } - } - } - else - { - if (canBasePair(seq.charAt(i),seq.charAt(k))) - { - double fact1 = 0; - if (k>i+1) - { - fact1 = tab[i+1][k-1]; - } - double fact2 = 0; - if (ki+1) - { - fact1 = tab[i+1][k-1]; - } - BigInteger fact2 = BigInteger.ONE; - if (k _cacheStructs = new ArrayList(); - - public ArrayList getStructs() { - String seq = getSeq(); - seq = seq.toUpperCase(); - if (!_cache.equals(seq)) - { - double[][] mfe = fillMatrix(seq); - _cacheStructs = backtrack(mfe,seq); - _cache = seq; - } - return _cacheStructs; - } - - public VARNAPanel get_varnaPanel() { - return _vpMaster; - } - - public void set_varnaPanel(VARNAPanel surface) { - _vpMaster = surface; - } - - - public JLabel get_info() { - return _actions; - } - - public void set_info(JLabel _info) { - this._actions = _info; - } - - public static void main(String[] args) { - NussinovDesignDemo d = new NussinovDesignDemo(); - d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - d.pack(); - d.setVisible(true); - } - - public void onStructureRedrawn() { - _vpMaster.repaint(); - } - - public void onWarningEmitted(String s) { - // TODO Auto-generated method stub - - } - - public void onLoad(String path) { - // TODO Auto-generated method stub - - } - - public void onLoaded() { - // TODO Auto-generated method stub - - } - - public void onUINewStructure(VARNAConfig v, RNA r) { - // TODO Auto-generated method stub - - } - - static final String[] _bases = {"A","C","G","U"}; - static final String[] _basesComp = {"U","G","C","A"}; - - public void onBaseClicked(ModeleBase mb, MouseEvent e) { - int index = -1; - for(int i =0;i<_bases.length;i++) - { - if (mb.getContent().equalsIgnoreCase(_bases[i])) - { - index = i; - } - } - index = (index+1)%_bases.length; - mb.setContent(_bases[index].toUpperCase()); - ArrayList partners =_vpTarget.getRNA().getAllPartners(mb.getIndex()); - if (partners.size()!=0) - { - ModeleBase mbPartner = _vpMaster.getRNA().getBaseAt(partners.get(0).getIndex()); - mbPartner.setContent(_basesComp[index].toUpperCase()); - } - _vpMaster.repaint(); - _seq1.setText(_vpMaster.getRNA().getSeq()); - new Temporizer(_vpMaster.getRNA().getSeq()).start(); - } - - private class Temporizer extends Thread{ - String _seq; - public Temporizer(String seq) - { - _seq = seq; - } - public void run() { - try { - this.sleep(1000); - if (_vpMaster.getRNA().getSeq().equalsIgnoreCase(_seq)) - { - showSolution(); - } - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - public void onZoomLevelChanged() { - // TODO Auto-generated method stub - - } - - public void onTranslationChanged() { - // TODO Auto-generated method stub - - } - - public void itemStateChanged(ItemEvent arg0) { - // TODO Auto-generated method stub - System.out.println(); - } - - - public static void formatLabel(JLabel j) - { - j.setHorizontalTextPosition(JLabel.LEFT); - j.setPreferredSize(new Dimension(NussinovDemo.marginTools, 25)); - j.setFont(labelsFont); - j.setForeground(Color.white); - } - - public static void formatLabel(JTextArea j) - { - j.setPreferredSize(new Dimension(NussinovDemo.marginTools, 25)); - j.setFont(labelsFont); - j.setForeground(Color.white); - } - - public class InfoPanel extends JPanel - { - ArrayList _sols = new ArrayList(); - BigInteger _nbFolds = BigInteger.ZERO; - JLabel _text = new JLabel(""); - JLabel _subopts = new JLabel(""); - JPanel _suboptBrowser = new JPanel(); - JPanel _suboptCount = new JPanel(); - int _selectedIndex = 0; - JButton next = new JButton(">"); - JButton previous = new JButton("<"); - - InfoPanel() - { - this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - setLayout(new BorderLayout()); - add(_suboptBrowser,BorderLayout.SOUTH); - add(_suboptCount,BorderLayout.NORTH); - - next.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent arg0) { - if (_sols.size()>0) - { - setSelectedIndex((_selectedIndex+1)%_sols.size()); - } - } - }); - - previous.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent arg0) { - if (_sols.size()>0) - { - setSelectedIndex((_selectedIndex+_sols.size()-1)%_sols.size()); - } - } - }); - next.setEnabled(false); - previous.setEnabled(false); - - JLabel nbLab = new JLabel("#Repliements"); - NussinovDesignDemo.formatLabel(nbLab); - - - JLabel cooptlab = new JLabel("#Co-optimaux"); - NussinovDesignDemo.formatLabel(cooptlab); - - NussinovDesignDemo.formatLabel(_text); - NussinovDesignDemo.formatLabel(_subopts); - - - _suboptCount.setLayout(new BorderLayout()); - _suboptCount.add(nbLab,BorderLayout.WEST); - _suboptCount.add(_text,BorderLayout.CENTER); - _suboptCount.setBackground(Color.decode("#E33729")); - - - JPanel commands = new JPanel(); - commands.add(previous); - commands.add(next); - commands.setBackground(Color.decode("#E33729")); - - JPanel jp = new JPanel(); - jp.setLayout(new BorderLayout()); - jp.add(_subopts,BorderLayout.WEST); - jp.add(commands,BorderLayout.CENTER); - jp.setBackground(Color.decode("#E33729")); - - _suboptBrowser.setLayout(new BorderLayout()); - _suboptBrowser.add(cooptlab,BorderLayout.WEST); - _suboptBrowser.add(jp,BorderLayout.CENTER); - _suboptBrowser.setBackground(Color.decode("#E33729")); - - } - - - /*public void setSelectedIndex(int i) - { - _selectedIndex = i; - RNA rfolded = new RNA(); - try { - rfolded.setRNA(getSeq(), _sols.get(i)); - rfolded.drawRNARadiate(_vpMaster.getConfig()); - _vpMaster.showRNAInterpolated(rfolded); - } catch (ExceptionUnmatchedClosingParentheses e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionFileFormatOrSyntax e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - //_struct.setText(_sols.get(i)); - formatDescription(); - }*/ - - public void setSelectedIndex(int i) - { - _selectedIndex = i; - RNA rfolded = new RNA(); - try { - rfolded.setRNA(getSeq(), _sols.get(i)); - RNA target = _vpTarget.getRNA(); - for(ModeleBase mb: rfolded.get_listeBases()) - { - ModeleBase mbref = target.getBaseAt(mb.getIndex()); - if (mb.getElementStructure()==mbref.getElementStructure()) - { - mb.getStyleBase().setBaseInnerColor(_okColor); - mb.getStyleBase().setBaseNameColor(Color.white); - } - } - for(ModeleBase mb: target.get_listeBases()) - { - ModeleBase mbref = rfolded.getBaseAt(mb.getIndex()); - if (mb.getElementStructure()==mbref.getElementStructure()) - { - mb.getStyleBase().setBaseInnerColor(_okColor); - } - else - { - mb.getStyleBase().setBaseInnerColor(Color.white); - } - } - rfolded.drawRNARadiate(_vpMaster.getConfig()); - if ((_sols.size()==1)&& (target.getStructDBN().equals(_sols.get(0)))) - rfolded.setName("Félicitations !"); - else - rfolded.setName("Repliement stable - "+(i+1)+"/"+_sols.size()); - _vpMaster.showRNAInterpolated(rfolded); - _vpTarget.repaint(); - } catch (ExceptionUnmatchedClosingParentheses e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionFileFormatOrSyntax e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - //_struct.setSelectedItem(_sols.get(i)); - formatDescription(); - } - -// public void setFont(Font f) -// { -// super.setFont(f); -// if(_text!=null) -// { -// _text.setFont(f); -// _text.setOpaque(false); -// } -// if(_subopts!=null) -// { -// _subopts.setFont(f); -// _subopts.setOpaque(false); -// } -// } - public void setInfo(ArrayList sols, BigInteger nbFolds) - { - _sols = sols; - _nbFolds = nbFolds; - formatDescription(); - setSelectedIndex(0); - } - - private void formatDescription() - { - _text.setText(""+_nbFolds); - _subopts.setText(""+_sols.size()); - next.setEnabled(_sols.size()>1); - previous.setEnabled(_sols.size()>1); - - } - - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/SecStrConsensus.java b/src2/fr/orsay/lri/varna/applications/SecStrConsensus.java deleted file mode 100644 index 5fce12b..0000000 --- a/src2/fr/orsay/lri/varna/applications/SecStrConsensus.java +++ /dev/null @@ -1,189 +0,0 @@ -package fr.orsay.lri.varna.applications; - -import java.util.ArrayList; -import java.util.Hashtable; - -import fr.orsay.lri.varna.models.rna.ModeleBP; - -public class SecStrConsensus { - - - /** - * Internal class to represent a simple base-pair. - * @author Yawn - * - */ - static class SimpleBP{ - int bp5; - int bp3; - - public SimpleBP(int i5, int i3) - { - bp5=i5; - bp3=i3; - } - } - - public static int[] extractConsensus(ArrayList> bps) - { - // We do not currently know the length of the alignment - // => Estimate it as the biggest index of a base-pair plus one. - int maxlength = 0; - for (ArrayList strs : bps) - { - for (SimpleBP bp : strs) - { - maxlength = Math.max(1+Math.max(bp.bp5, bp.bp3), maxlength); - } - } - // Now we have a good estimate for length, allocate and initialize data - // to be fed to the dynamic programming procedure. - ArrayList> seq = new ArrayList>(); - for (int i=0;i()); } - for (ArrayList strs : bps) - { - for (SimpleBP bp : strs) - { - int i = bp.bp5; - int j = bp.bp3; - Hashtable h = seq.get(i); - if (!h.containsKey(j)) - { - h.put(j, 0.0); - } - h.put(j, h.get(i)+1.); - } - } - // At this point, seq contains, at each position i, a hashtable which associates, - // to each possible end j, the number of time a base-pair (i,j) occurs in the alignment - - // We can now run the dynamic programming procedure on this data - double[][] mat = fillMatrix(seq); - ArrayList res = backtrack(mat,seq); - - // Convert it to an array, ie finalres[i] = j >= 0 iff a base-pair (i,j) is present - // in the consensus, or -1 otherwise - int[] finalres = new int[seq.size()]; - for (int i=0;i> seq, int i, int k) - { - return seq.get(i).containsKey(k); - } - - // Returns the score of a potential base-pair, ie the number of structures in which it is found. - private static double basePairScore(ArrayList> seq, int i, int k) - { - return seq.get(i).get(k); - } - - - private static double[][] fillMatrix(ArrayList> seq) - { - int n = seq.size(); - double[][] tab = new double[n][n]; - for(int m=1;m<=n;m++) - { - for(int i=0;ii+1) - { - fact1 = tab[i+1][k-1]; - } - double fact2 = 0; - if (k backtrack(double[][] tab,ArrayList> seq) - { - return backtrack(tab,seq,0,seq.size()-1); - } - - private static ArrayList backtrack(double[][] tab,ArrayList> seq, int i, int j) - { - ArrayList result = new ArrayList(); - if (i indices = new ArrayList(); - indices.add(-1); - for (int k=i+1;k<=j;k++) - { - indices.add(k); - } - for (int k : indices) - { - if (k==-1) - { - if (tab[i][j] == tab[i+1][j]) - { - result = backtrack(tab, seq, i+1,j); - } - } - else - { - if (canBasePair(seq,i,k)) - { - double fact1 = 0; - if (k>i+1) - { - fact1 = tab[i+1][k-1]; - } - double fact2 = 0; - if (k. -*/ - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JApplet; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.VARNAConsole; -import fr.orsay.lri.varna.controlers.ControleurDemoTextField; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.models.rna.RNA; - -/** -* An RNA 2d Panel demo applet -* -* @author Yann Ponty & Darty Kévin -* -*/ - -public class VARNAConsoleDemo extends JApplet implements ActionListener { - - /** - * - */ - private static final long serialVersionUID = -790155708306987257L; - - private static final String DEFAULT_SEQUENCE = "CAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIA"; - - private static final String DEFAULT_STRUCTURE = "..(((((...(((((...(((((...(((((.....)))))...))))).....(((((...(((((.....)))))...))))).....)))))...))))).."; - - private VARNAPanel _vp; - - private JPanel _tools = new JPanel(); - private JPanel _input = new JPanel(); - - private JPanel _seqPanel = new JPanel(); - private JPanel _structPanel = new JPanel(); - private JLabel _info = new JLabel(); - private JButton _go = new JButton("Go"); - private JTextField _struct = new JTextField(); - private JTextField _seq = new JTextField(); - private JLabel _structLabel = new JLabel(" Str:"); - private JLabel _seqLabel = new JLabel(" Seq:"); - - private VARNAConsole _console; - - private static String errorOpt = "error"; - private boolean _error; - - private Color _backgroundColor = Color.white; - - private int _algoCode; - - public VARNAConsoleDemo() { - super(); - try { - _vp = new VARNAPanel(_seq.getText(), _struct.getText()); - _vp.setErrorsOn(false); - } catch (ExceptionNonEqualLength e) { - _vp.errorDialog(e); - } - RNAPanelDemoInit(); - } - - private void RNAPanelDemoInit() { - - - int marginTools = 40; - - setBackground(_backgroundColor); - _vp.setBackground(_backgroundColor); - - try { - _vp.getRNA().setRNA(_seq.getText(), _struct.getText()); - _vp.setErrorsOn(false); - } catch (Exception e1) { - _vp.errorDialog(e1); - } - - Font textFieldsFont = Font.decode("MonoSpaced-PLAIN-12"); - - _console = new VARNAConsole(_vp); - - - _go.addActionListener(this); - - _seqLabel.setHorizontalTextPosition(JLabel.LEFT); - _seqLabel.setPreferredSize(new Dimension(marginTools, 15)); - _seq.setFont(textFieldsFont); - _seq.setText(_vp.getRNA().getSeq()); - - _seqPanel.setLayout(new BorderLayout()); - _seqPanel.add(_seqLabel, BorderLayout.WEST); - _seqPanel.add(_seq, BorderLayout.CENTER); - - _structLabel.setPreferredSize(new Dimension(marginTools, 15)); - _structLabel.setHorizontalTextPosition(JLabel.LEFT); - _struct.setFont(textFieldsFont); - _struct.setText(_vp.getRNA().getStructDBN()); - _structPanel.setLayout(new BorderLayout()); - _structPanel.add(_structLabel, BorderLayout.WEST); - _structPanel.add(_struct, BorderLayout.CENTER); - - - _input.setLayout(new GridLayout(3, 0)); - _input.add(_seqPanel); - _input.add(_structPanel); - - _tools.setLayout(new BorderLayout()); - _tools.add(_input, BorderLayout.CENTER); - _tools.add(_info, BorderLayout.SOUTH); - _tools.add(_go, BorderLayout.EAST); - - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(_vp, BorderLayout.CENTER); - getContentPane().add(_tools, BorderLayout.SOUTH); - - _vp.getVARNAUI().UIRadiate(); - setPreferredSize(new Dimension(400,400)); - - setVisible(true); - - _console.setVisible(true); - - } - - public String[][] getParameterInfo() { - String[][] info = { - // Parameter Name Kind of Value Description, - { "sequenceDBN", "String", "A raw RNA sequence" }, - { "structureDBN", "String", - "An RNA structure in dot bracket notation (DBN)" }, - { errorOpt, "boolean", "To show errors" }, }; - return info; - } - - public void init() { - retrieveParametersValues(); - _vp.setBackground(_backgroundColor); - _error = true; - } - - private Color getSafeColor(String col, Color def) { - Color result; - try { - result = Color.decode(col); - } catch (Exception e) { - try { - result = Color.getColor(col, def); - } catch (Exception e2) { - return def; - } - } - return result; - } - - private String getParameterValue(String key, String def) { - String tmp; - tmp = getParameter(key); - if (tmp == null) { - return def; - } else { - return tmp; - } - } - - private void retrieveParametersValues() { - _error = Boolean.parseBoolean(getParameterValue(errorOpt, "false")); - _vp.setErrorsOn(_error); - _backgroundColor = getSafeColor(getParameterValue("background", - _backgroundColor.toString()), _backgroundColor); - _vp.setBackground(_backgroundColor); - _seq.setText(getParameterValue("sequenceDBN", "")); - _struct.setText(getParameterValue("structureDBN", "")); - String _algo = getParameterValue("algorithm", "radiate"); - if (_algo.equals("circular")) - _algoCode = RNA.DRAW_MODE_CIRCULAR; - else if (_algo.equals("naview")) - _algoCode = RNA.DRAW_MODE_NAVIEW; - else if (_algo.equals("line")) - _algoCode = RNA.DRAW_MODE_LINEAR; - else - _algoCode = RNA.DRAW_MODE_RADIATE; - if (_seq.getText().equals("") && _struct.getText().equals("")) { - _seq.setText(DEFAULT_SEQUENCE); - _struct.setText(DEFAULT_STRUCTURE); - } - try { - _vp.drawRNA(_seq.getText(), _struct.getText(), _algoCode); - } catch (ExceptionNonEqualLength e) { - e.printStackTrace(); - } - - } - - public VARNAPanel get_varnaPanel() { - return _vp; - } - - public void set_varnaPanel(VARNAPanel surface) { - _vp = surface; - } - - public JTextField get_struct() { - return _struct; - } - - public void set_struct(JTextField _struct) { - this._struct = _struct; - } - - public JTextField get_seq() { - return _seq; - } - - public void set_seq(JTextField _seq) { - this._seq = _seq; - } - - public JLabel get_info() { - return _info; - } - - public void set_info(JLabel _info) { - this._info = _info; - } - - public void actionPerformed(ActionEvent arg0) { - RNA r = new RNA(); - try { - _vp.drawRNAInterpolated(_seq.getText(), _struct.getText()); - } catch (ExceptionNonEqualLength e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - _vp.repaint(); - } -} diff --git a/src2/fr/orsay/lri/varna/applications/VARNAEditor.java b/src2/fr/orsay/lri/varna/applications/VARNAEditor.java deleted file mode 100644 index 818cfda..0000000 --- a/src2/fr/orsay/lri/varna/applications/VARNAEditor.java +++ /dev/null @@ -1,659 +0,0 @@ -/* - 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; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; -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.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.geom.Point2D.Double; -import java.io.File; -import java.text.DateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.Hashtable; -import java.util.List; -import java.util.Set; - -import javax.swing.DefaultListModel; -import javax.swing.DefaultListSelectionModel; -import javax.swing.Icon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTextField; -import javax.swing.ListModel; -import javax.swing.ListSelectionModel; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.DefaultHighlighter; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.ReorderableJList; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNARNAListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNASelectionListener; -import fr.orsay.lri.varna.models.BaseList; -import fr.orsay.lri.varna.models.FullBackup; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VARNAEditor extends JFrame implements DropTargetListener, InterfaceVARNAListener, MouseListener { - - /** - * - */ -// private static final_long serialVersionUID = -790155708306987257L; - - private static final String DEFAULT_SEQUENCE = "CAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIA"; - - private static final String DEFAULT_STRUCTURE1 = "..(((((...(((((...(((((...(((((.....)))))...))))).....(((((...(((((.....)))))...))))).....)))))...))))).."; - private static final String DEFAULT_STRUCTURE2 = "..(((((...(((((...(((((........(((((...(((((.....)))))...)))))..................))))).....)))))...))))).."; - // private static final String DEFAULT_STRUCTURE1 = "((((....))))"; - // private static final String DEFAULT_STRUCTURE2 = - // "((((..(((....)))..))))"; - - private VARNAPanel _vp; - - private JPanel _tools = new JPanel(); - private JPanel _input = new JPanel(); - - private JPanel _seqPanel = new JPanel(); - private JPanel _strPanel = new JPanel(); - private JLabel _info = new JLabel(); - - private JTextField _str = new JTextField(DEFAULT_STRUCTURE1); - Object _hoverHighlightStr = null; - ArrayList _selectionHighlightStr = new ArrayList(); - - private JTextField _seq = new JTextField(DEFAULT_SEQUENCE); - Object _hoverHighlightSeq = null; - ArrayList _selectionHighlightSeq = new ArrayList(); - - - private JLabel _strLabel = new JLabel(" Str:"); - private JLabel _seqLabel = new JLabel(" Seq:"); - private JButton _deleteButton = new JButton("Delete"); - private JButton _duplicateButton = new JButton("Duplicate"); - - private JPanel _listPanel = new JPanel(); - private ReorderableJList _sideList = null; - - - - private static String errorOpt = "error"; - @SuppressWarnings("unused") - private boolean _error; - - private Color _backgroundColor = Color.white; - - private static int _nextID = 1; - @SuppressWarnings("unused") - private int _algoCode; - - private BackupHolder _rnaList; - - - public VARNAEditor() { - super("VARNA Editor"); - RNAPanelDemoInit(); - } - - private void RNAPanelDemoInit() - { - DefaultListModel dlm = new DefaultListModel(); - - - int marginTools = 40; - - DefaultListSelectionModel m = new DefaultListSelectionModel(); - m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - m.setLeadAnchorNotificationEnabled(false); - - - _sideList = new ReorderableJList(); - _sideList.setModel(dlm); - _sideList.addMouseListener(this); - _sideList.setSelectionModel(m); - _sideList.setPreferredSize(new Dimension(100, 0)); - _sideList.addListSelectionListener( new ListSelectionListener(){ - public void valueChanged(ListSelectionEvent arg0) { - //System.out.println(arg0); - if (!_sideList.isSelectionEmpty() && !arg0.getValueIsAdjusting()) - { - FullBackup sel = (FullBackup) _sideList.getSelectedValue(); - Mapping map = Mapping.DefaultOutermostMapping(_vp.getRNA().getSize(), sel.rna.getSize()); - _vp.showRNAInterpolated(sel.rna,sel.config,map); - _seq.setText(sel.rna.getSeq()); - _str.setText(sel.rna.getStructDBN(true)); - } - } - }); - - _rnaList = new BackupHolder(dlm,_sideList); - RNA _RNA1 = new RNA("User defined 1"); - RNA _RNA2 = new RNA("User defined 2"); - try { - _vp = new VARNAPanel("0","."); - _RNA1.setRNA(DEFAULT_SEQUENCE, DEFAULT_STRUCTURE1); - _RNA1.drawRNARadiate(_vp.getConfig()); - _RNA2.setRNA(DEFAULT_SEQUENCE, DEFAULT_STRUCTURE2); - _RNA2.drawRNARadiate(_vp.getConfig()); - } catch (ExceptionNonEqualLength e) { - _vp.errorDialog(e); - } catch (ExceptionUnmatchedClosingParentheses e2) { - e2.printStackTrace(); - } catch (ExceptionFileFormatOrSyntax e3) { - e3.printStackTrace(); - } - _vp.setPreferredSize(new Dimension(400, 400)); - // - - // BH 2018 this will NOT be a clone in SwingJS - _rnaList.add(_vp.getConfig().clone(),_RNA2,generateDefaultName()); - _rnaList.add(_vp.getConfig().clone(),_RNA1,generateDefaultName(),true); - - JScrollPane listScroller = new JScrollPane(_sideList); - listScroller.setPreferredSize(new Dimension(150, 0)); - - setBackground(_backgroundColor); - _vp.setBackground(_backgroundColor); - - - Font textFieldsFont = Font.decode("MonoSpaced-PLAIN-12"); - - _seqLabel.setHorizontalTextPosition(JLabel.LEFT); - _seqLabel.setPreferredSize(new Dimension(marginTools, 15)); - _seq.setFont(textFieldsFont); - _seq.setText(DEFAULT_SEQUENCE); - _seq.setEditable(false); - - - _seqPanel.setLayout(new BorderLayout()); - _seqPanel.add(_seqLabel, BorderLayout.WEST); - _seqPanel.add(_seq, BorderLayout.CENTER); - - _strLabel.setPreferredSize(new Dimension(marginTools, 15)); - _strLabel.setHorizontalTextPosition(JLabel.LEFT); - _str.setFont(textFieldsFont); - _str.setEditable(false); - _strPanel.setLayout(new BorderLayout()); - _strPanel.add(_strLabel, BorderLayout.WEST); - _strPanel.add(_str, BorderLayout.CENTER); - - _input.setLayout(new GridLayout(2, 0)); - _input.add(_seqPanel); - _input.add(_strPanel); - - - _tools.setLayout(new BorderLayout()); - _tools.add(_input, BorderLayout.CENTER); - _tools.add(_info, BorderLayout.SOUTH); - - _deleteButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _rnaList.removeSelected(); - } - }); -// _duplicateButton.addActionListener(new ActionListener() { -// public void actionPerformed(ActionEvent e) { -// _rnaList.add((VARNAConfig)_vp.getConfig().clone(),_vp.getRNA().clone(),_vp.getRNA().getName()+"-"+DateFormat.getTimeInstance(DateFormat.LONG).format(new Date()),true); -// }}); - - JPanel ops = new JPanel(); - ops.setLayout(new GridLayout(1,2)); - ops.add(_deleteButton); - ops.add(_duplicateButton); - - JLabel j = new JLabel("Structures",JLabel.CENTER); - _listPanel.setLayout(new BorderLayout()); - - _listPanel.add(ops,BorderLayout.SOUTH); - _listPanel.add(j,BorderLayout.NORTH); - _listPanel.add(listScroller,BorderLayout.CENTER); - - - JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,_listPanel,_vp); - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(split, BorderLayout.CENTER); - getContentPane().add(_tools, BorderLayout.NORTH); - - setVisible(true); - DropTarget dt = new DropTarget(_vp, this); - - _vp.addRNAListener(new InterfaceVARNARNAListener(){ - public void onSequenceModified(int index, String oldseq, String newseq) { - _seq.setText(_vp.getRNA().getSeq()); - } - - public void onStructureModified(Set current, - Set addedBasePairs, Set removedBasePairs) { - _str.setText(_vp.getRNA().getStructDBN(true)); - } - - public void onRNALayoutChanged(Hashtable previousPositions) { - } - - }); - - _vp.addSelectionListener(new InterfaceVARNASelectionListener(){ - - public void onHoverChanged(ModeleBase oldbase, ModeleBase newBase) { - if (_hoverHighlightSeq!=null) - { - _seq.getHighlighter().removeHighlight(_hoverHighlightSeq); - _hoverHighlightSeq = null; - } - if (_hoverHighlightStr!=null) - { - _str.getHighlighter().removeHighlight(_hoverHighlightStr); - _hoverHighlightStr = null; - } - if (newBase!=null) - { - try { - _hoverHighlightSeq = _seq.getHighlighter().addHighlight(newBase.getIndex(), newBase.getIndex()+1, new DefaultHighlighter.DefaultHighlightPainter(Color.green) ); - _hoverHighlightStr = _str.getHighlighter().addHighlight(newBase.getIndex(), newBase.getIndex()+1, new DefaultHighlighter.DefaultHighlightPainter(Color.green) ); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - } - - public void onSelectionChanged(BaseList selection, - BaseList addedBases, BaseList removedBases) { - for(Object tag: _selectionHighlightSeq) - { - _seq.getHighlighter().removeHighlight(tag); - } - _selectionHighlightSeq.clear(); - for(Object tag: _selectionHighlightStr) - { - _str.getHighlighter().removeHighlight(tag); - } - _selectionHighlightStr.clear(); - for (ModeleBase m: selection.getBases()) - { - try { - _selectionHighlightSeq.add(_seq.getHighlighter().addHighlight(m.getIndex(), m.getIndex()+1, new DefaultHighlighter.DefaultHighlightPainter(Color.orange) )); - _selectionHighlightStr.add(_str.getHighlighter().addHighlight(m.getIndex(), m.getIndex()+1, new DefaultHighlighter.DefaultHighlightPainter(Color.orange) )); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - } - - }); - - _vp.addVARNAListener(this); - } - - public static String generateDefaultName() - { - return "User file #"+_nextID++; - } - - public RNA getRNA() { - return (RNA)_sideList.getSelectedValue(); - } - - - - public String[][] getParameterInfo() { - String[][] info = { - // Parameter Name Kind of Value Description, - { "sequenceDBN", "String", "A raw RNA sequence" }, - { "structureDBN", "String", - "An RNA structure in dot bracket notation (DBN)" }, - { errorOpt, "boolean", "To show errors" }, }; - return info; - } - - public void init() { - _vp.setBackground(_backgroundColor); - _error = true; - } - - @SuppressWarnings("unused") - private Color getSafeColor(String col, Color def) { - Color result; - try { - result = Color.decode(col); - } catch (Exception e) { - try { - result = Color.getColor(col, def); - } catch (Exception e2) { - return def; - } - } - return result; - } - - public VARNAPanel get_varnaPanel() { - return _vp; - } - - public void set_varnaPanel(VARNAPanel surface) { - _vp = surface; - } - - - public JTextField get_seq() { - return _seq; - } - - public void set_seq(JTextField _seq) { - this._seq = _seq; - } - - public JLabel get_info() { - return _info; - } - - public void set_info(JLabel _info) { - this._info = _info; - } - - public static void main(String[] args) { - VARNAEditor d = new VARNAEditor(); - d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - d.pack(); - d.setVisible(true); - } - - - 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) { - // TODO Auto-generated method stub - - } - - public void drop(DropTargetDropEvent dtde) { - try { - Transferable tr = dtde.getTransferable(); - DataFlavor[] flavors = tr.getTransferDataFlavors(); - for (int i = 0; i < flavors.length; i++) { - if (flavors[i].isFlavorJavaFileListType()) { - dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - Object ob = tr.getTransferData(flavors[i]); - if (ob instanceof List) - { - List list = (List) ob; - for (int j = 0; j < list.size(); j++) { - Object o = list.get(j); - - if (dtde.getSource() instanceof DropTarget) - { - DropTarget dt = (DropTarget) dtde.getSource(); - Component c = dt.getComponent(); - if (c instanceof VARNAPanel) - { - String path = o.toString(); - VARNAPanel vp = (VARNAPanel) c; - try{ - FullBackup bck = VARNAPanel.importSession((File) o); // BH SwingJS - _rnaList.add(bck.config, bck.rna,bck.name,true); - } - catch (ExceptionLoadingFailed e3) - { - Collection rnas = RNAFactory.loadSecStr((File) o); // BH SwingJS - if (rnas.isEmpty()) - { - throw new ExceptionFileFormatOrSyntax("No RNA could be parsed from that source."); - } - - int id = 1; - for(RNA r: rnas) - { - r.drawRNA(vp.getConfig()); - String name = r.getName(); - if (name.equals("")) - { - name = path.substring(path.lastIndexOf(File.separatorChar)+1); - } - if (rnas.size()>1) - { - name += " - Molecule# "+id++; - } - _rnaList.add(vp.getConfig().clone(),r,name,true); - } - } - } - } - } - } - // If we made it this far, everything worked. - dtde.dropComplete(true); - return; - } - } - // Hmm, the user must not have dropped a file list - dtde.rejectDrop(); - } catch (Exception e) { - e.printStackTrace(); - dtde.rejectDrop(); - } - - } - - public void dropActionChanged(DropTargetDragEvent arg0) { - } - - private class BackupHolder{ - private DefaultListModel _rnaList; - private ArrayList _rnas = new ArrayList(); - JList _l; - - public BackupHolder(DefaultListModel rnaList, JList l) - { - _rnaList = rnaList; - _l = l; - } - - public void add(VARNAConfig c, RNA r) - { - add(c, r, r.getName(),false); - } - - public void add(VARNAConfig c, RNA r,boolean select) - { - add(c, r, r.getName(),select); - } - - public void add(VARNAConfig c, RNA r, String name) - { - add(c, r, name,false); - } - public void add(VARNAConfig c, RNA r, String name, boolean select) - { - if (select){ - _l.removeSelectionInterval(0, _rnaList.size()); - } - if (name.equals("")) - { - name = generateDefaultName(); - } - FullBackup bck = new FullBackup(c,r,name); - _rnas.add(0, r); - _rnaList.add(0,bck); - if (select){ - _l.setSelectedIndex(0); - } - } - - public void remove(int i) - { - _rnas.remove(i); - _rnaList.remove(i); - - } - public DefaultListModel getModel() - { - return _rnaList; - } - public boolean contains(RNA r) - { - return _rnas.contains(r); - } - /*public int getSize() - { - return _rnaList.getSize(); - }*/ - public FullBackup getElementAt(int i) - { - return (FullBackup) _rnaList.getElementAt(i); - } - - public void removeSelected() - { - int i = _l.getSelectedIndex(); - if (i!=-1) - { - if (_rnaList.getSize()==1) - { - RNA r = new RNA(); - try { - r.setRNA(" ", "."); - } catch (ExceptionUnmatchedClosingParentheses e1) { - } catch (ExceptionFileFormatOrSyntax e1) { - } - _vp.showRNA(r); - _vp.repaint(); - } - else - { - int newi = i+1; - if (newi==_rnaList.getSize()) - { - newi = _rnaList.getSize()-2; - } - FullBackup bck = (FullBackup) _rnaList.getElementAt(newi); - _l.setSelectedValue(bck,true); - } - _rnaList.remove(i); - } - - } - } - - public void onStructureRedrawn() { - // TODO Auto-generated method stub - - } - - public void onUINewStructure(VARNAConfig v, RNA r) { - _rnaList.add(v, r,"",true); - } - - public void onWarningEmitted(String s) { - // TODO Auto-generated method stub - - } - - public void mouseClicked(MouseEvent e) { - if(e.getClickCount() == 2){ - int index = _sideList.locationToIndex(e.getPoint()); - ListModel dlm = _sideList.getModel(); - FullBackup item = (FullBackup) dlm.getElementAt(index);; - _sideList.ensureIndexIsVisible(index); - Object newName = JOptionPane.showInputDialog( - this, - "Specify a new name for this RNA", - "Rename RNA", - JOptionPane.QUESTION_MESSAGE, - (Icon)null, - null, - item.toString()); - if (newName!=null) - { - item.name = newName.toString(); - this._sideList.repaint(); - } - } - } - - public void mouseEntered(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mouseExited(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mousePressed(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mouseReleased(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void onZoomLevelChanged() { - // TODO Auto-generated method stub - - } - - public void onTranslationChanged() { - // TODO Auto-generated method stub - - } -} diff --git a/src2/fr/orsay/lri/varna/applications/VARNAGUI.java b/src2/fr/orsay/lri/varna/applications/VARNAGUI.java deleted file mode 100644 index e62503f..0000000 --- a/src2/fr/orsay/lri/varna/applications/VARNAGUI.java +++ /dev/null @@ -1,791 +0,0 @@ -/* - 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; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.Image; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Toolkit; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; -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.AdjustmentEvent; -import java.awt.event.AdjustmentListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.geom.Point2D.Double; -import java.io.File; -import java.text.DateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.Hashtable; -import java.util.List; -import java.util.Set; - -import javax.swing.DefaultListModel; -import javax.swing.DefaultListSelectionModel; -import javax.swing.Icon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollBar; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTextField; -import javax.swing.ListModel; -import javax.swing.ListSelectionModel; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.DefaultHighlighter; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.ReorderableJList; -import fr.orsay.lri.varna.components.ZoomWindow; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNARNAListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNASelectionListener; -import fr.orsay.lri.varna.models.BaseList; -import fr.orsay.lri.varna.models.FullBackup; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VARNAGUI extends JFrame implements DropTargetListener, InterfaceVARNAListener, MouseListener, AdjustmentListener { - - /** - * - */ - private static final long serialVersionUID = -790155708306987257L; - - private static final String DEFAULT_SEQUENCE = "CAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIA"; - - private static final String DEFAULT_STRUCTURE1 = "..(((((...(((((...(((((...(((((.....)))))...))))).....(((((...(((((.....)))))...))))).....)))))...))))).."; - private static final String DEFAULT_STRUCTURE2 = "..(((((...(((((...(((((........(((((...(((((.....)))))...)))))..................))))).....)))))...))))).."; - // private static final String DEFAULT_STRUCTURE1 = "((((....))))"; - // private static final String DEFAULT_STRUCTURE2 = - // "((((..(((....)))..))))"; - - private VARNAPanel _vp; - - private JPanel _tools = new JPanel(); - private JPanel _input = new JPanel(); - - private JPanel _seqPanel = new JPanel(); - private JPanel _strPanel = new JPanel(); - private JLabel _info = new JLabel(); - - private JTextField _str = new JTextField(DEFAULT_STRUCTURE1); - Object _hoverHighlightStr = null; - ArrayList _selectionHighlightStr = new ArrayList(); - - private JTextField _seq = new JTextField(DEFAULT_SEQUENCE); - Object _hoverHighlightSeq = null; - ArrayList _selectionHighlightSeq = new ArrayList(); - - - private ZoomWindow _zoomWindow; - private JLabel _strLabel = new JLabel(" Str:"); - private JLabel _seqLabel = new JLabel(" Seq:"); - private JButton _createButton = new JButton("Create"); - private JButton _deleteButton = new JButton("Delete"); - private JButton _duplicateButton = new JButton("Snapshot"); - - private JPanel _listPanel = new JPanel(); - private ReorderableJList _sideList = null; - - - private static String errorOpt = "error"; - @SuppressWarnings("unused") - private boolean _error; - - private Color _backgroundColor = Color.white; - - private JScrollBar _vert = new JScrollBar(JScrollBar.VERTICAL); - private JScrollBar _horiz = new JScrollBar(JScrollBar.HORIZONTAL); - - private static int _nextID = 1; - @SuppressWarnings("unused") - private int _algoCode; - - private BackupHolder _rnaList; - - - public VARNAGUI() { - super("VARNA GUI"); - RNAPanelDemoInit(); - } - - private void RNAPanelDemoInit() - { - DefaultListModel dlm = new DefaultListModel(); - - - int marginTools = 40; - - DefaultListSelectionModel m = new DefaultListSelectionModel(); - m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - m.setLeadAnchorNotificationEnabled(false); - - - _sideList = new ReorderableJList(); - _sideList.setModel(dlm); - _sideList.addMouseListener(this); - _sideList.setSelectionModel(m); - _sideList.setPreferredSize(null); - - _sideList.addListSelectionListener( new ListSelectionListener(){ - public void valueChanged(ListSelectionEvent arg0) { - //System.out.println(arg0); - if (!_sideList.isSelectionEmpty() && !arg0.getValueIsAdjusting()) - { - FullBackup sel = (FullBackup) _sideList.getSelectedValue(); - _vp.setConfig(sel.config); - showRNA(sel.rna); - _seq.setText(sel.rna.getSeq()); - _str.setText(sel.rna.getStructDBN(true)); - } - } - }); - - _rnaList = new BackupHolder(dlm,_sideList); - RNA _RNA1 = new RNA("User defined 1"); - RNA _RNA2 = new RNA("User defined 2"); - try { - _vp = new VARNAPanel("0","."); - _zoomWindow = new ZoomWindow(_vp); - _RNA1.setRNA(DEFAULT_SEQUENCE, DEFAULT_STRUCTURE1); - _RNA1.drawRNARadiate(_vp.getConfig()); - _RNA2.setRNA(DEFAULT_SEQUENCE, DEFAULT_STRUCTURE2); - _RNA2.drawRNARadiate(_vp.getConfig()); - } catch (ExceptionNonEqualLength e) { - _vp.errorDialog(e); - } catch (ExceptionUnmatchedClosingParentheses e2) { - e2.printStackTrace(); - } catch (ExceptionFileFormatOrSyntax e3) { - e3.printStackTrace(); - } - _vp.setPreferredSize(new Dimension(400, 400)); - _rnaList.add(_vp.getConfig().clone(),_RNA2,generateDefaultName()); - _rnaList.add(_vp.getConfig().clone(),_RNA1,generateDefaultName(),true); - - - JScrollPane listScroller = new JScrollPane(_sideList);//,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - listScroller.setPreferredSize(new Dimension(150, 0)); - - setBackground(_backgroundColor); - _vp.setBackground(_backgroundColor); - - - Font textFieldsFont = Font.decode("MonoSpaced-PLAIN-12"); - - _seqLabel.setHorizontalTextPosition(JLabel.LEFT); - _seqLabel.setPreferredSize(new Dimension(marginTools, 15)); - _seq.setFont(textFieldsFont); - _seq.setText(DEFAULT_SEQUENCE); - - _createButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - try { - RNA nRNA = new RNA(generateDefaultName()); - nRNA.setRNA(_seq.getText(), _str.getText()); - nRNA.drawRNARadiate(_vp.getConfig()); - _rnaList.add(new VARNAConfig(),nRNA,true); - } catch (ExceptionUnmatchedClosingParentheses e1) { - JOptionPane.showMessageDialog(_vp, e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE); - } catch (ExceptionFileFormatOrSyntax e1) { - JOptionPane.showMessageDialog(_vp, e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE); - } - } - }); - - - _seqPanel.setLayout(new BorderLayout()); - _seqPanel.add(_seqLabel, BorderLayout.WEST); - _seqPanel.add(_seq, BorderLayout.CENTER); - - _strLabel.setPreferredSize(new Dimension(marginTools, 15)); - _strLabel.setHorizontalTextPosition(JLabel.LEFT); - _str.setFont(textFieldsFont); - _strPanel.setLayout(new BorderLayout()); - _strPanel.add(_strLabel, BorderLayout.WEST); - _strPanel.add(_str, BorderLayout.CENTER); - - _input.setLayout(new GridLayout(2, 0)); - _input.add(_seqPanel); - _input.add(_strPanel); - - JPanel goPanel = new JPanel(); - goPanel.setLayout(new BorderLayout()); - - _tools.setLayout(new BorderLayout()); - _tools.add(_input, BorderLayout.CENTER); - _tools.add(_info, BorderLayout.SOUTH); - _tools.add(goPanel, BorderLayout.EAST); - - _deleteButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _rnaList.removeSelected(); - } - }); - // BH 2018 SwingJS can't clone, as it does not implement serialization - if (/** @j2sNative false && */ true) - _duplicateButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _rnaList.add((VARNAConfig)_vp.getConfig().clone(),_vp.getRNA().clone(),_vp.getRNA().getName()+"-"+DateFormat.getTimeInstance(DateFormat.LONG).format(new Date()),true); - }}); - - JPanel ops = new JPanel(); - ops.setLayout(new GridLayout(1,2)); - ops.add(_deleteButton); - if (/** @j2sNative false && */ true) - ops.add(_duplicateButton); - - JPanel opspanel = new JPanel(new BorderLayout()); - opspanel.add(ops,BorderLayout.NORTH); - opspanel.add(_zoomWindow,BorderLayout.SOUTH); - - _zoomWindow.setPreferredSize(new Dimension(-1,200)); - - - JLabel j = new JLabel("Structure Manager",JLabel.CENTER); - _listPanel.setLayout(new BorderLayout()); - - _listPanel.add(opspanel,BorderLayout.SOUTH); - _listPanel.add(j,BorderLayout.NORTH); - _listPanel.add(listScroller,BorderLayout.CENTER); - - goPanel.add(_createButton, BorderLayout.CENTER); - - JPanel vpScroll = new JPanel(); - vpScroll.setLayout(new BorderLayout()); - _horiz.setVisible(false); - _horiz.addAdjustmentListener(this); - _vert.setVisible(false); - _vert.addAdjustmentListener(this); - vpScroll.add(_horiz,BorderLayout.SOUTH); - vpScroll.add(_vert,BorderLayout.EAST); - vpScroll.add(_vp,BorderLayout.CENTER); - JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,_listPanel,vpScroll); - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(split, BorderLayout.CENTER); - getContentPane().add(_tools, BorderLayout.NORTH); - - - setVisible(true); - DropTarget dt = new DropTarget(_vp, this); - - _vp.addRNAListener(new InterfaceVARNARNAListener(){ - public void onSequenceModified(int index, String oldseq, String newseq) { - //System.out.println("Sequence changed: Index:"+index+" ["+oldseq+"]=>["+newseq+"]"); - } - - public void onStructureModified(Set current, - Set addedBasePairs, Set removedBasePairs) { - String result = ""; - //System.out.println("Structure changed: "); - for (ModeleBP s:addedBasePairs) - { result +=s; } - //System.out.println(" Added: "+result); - result = ""; - for (ModeleBP s:removedBasePairs) - { result +=s; } - //System.out.println(" Removed: "+result); - } - - public void onRNALayoutChanged(Hashtable previousPositions) { - //System.out.print("Layout changed, bases#: "); - String result = ""; - for (Integer s:previousPositions.keySet()) - { result +=s+" "; } - //System.out.println(result); - } - - }); - - _vp.addSelectionListener(new InterfaceVARNASelectionListener(){ - - public void onHoverChanged(ModeleBase oldbase, ModeleBase newBase) { - if (_hoverHighlightSeq!=null) - { - _seq.getHighlighter().removeHighlight(_hoverHighlightSeq); - _hoverHighlightSeq = null; - } - if (_hoverHighlightStr!=null) - { - _str.getHighlighter().removeHighlight(_hoverHighlightStr); - _hoverHighlightStr = null; - } - if (newBase!=null) - { - try { - int i = newBase.getIndex(); - int[] shifts = _vp.getRNA().getStrandShifts(); - _hoverHighlightSeq = _seq.getHighlighter().addHighlight(i+shifts[i], i+shifts[i]+1, new DefaultHighlighter.DefaultHighlightPainter(Color.green) ); - _hoverHighlightStr = _str.getHighlighter().addHighlight(i+shifts[i], i+shifts[i]+1, new DefaultHighlighter.DefaultHighlightPainter(Color.green) ); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - } - - public void onSelectionChanged(BaseList selection, - BaseList addedBases, BaseList removedBases) { - for(Object tag: _selectionHighlightSeq) - { - _seq.getHighlighter().removeHighlight(tag); - } - _selectionHighlightSeq.clear(); - for(Object tag: _selectionHighlightStr) - { - _str.getHighlighter().removeHighlight(tag); - } - _selectionHighlightStr.clear(); - int[] shifts = _vp.getRNA().getStrandShifts(); - for (ModeleBase m: selection.getBases()) - { - try { - int i = m.getIndex(); - _selectionHighlightSeq.add(_seq.getHighlighter().addHighlight(i+shifts[i], i+shifts[i]+1, new DefaultHighlighter.DefaultHighlightPainter(Color.orange) )); - _selectionHighlightStr.add(_str.getHighlighter().addHighlight(i+shifts[i], i+shifts[i]+1, new DefaultHighlighter.DefaultHighlightPainter(Color.orange) )); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - } - - }); - - _vp.addVARNAListener(this); - - new Thread(_zoomWindow).start(); - } - - protected void showRNA(RNA rna) { - _vp.showRNAInterpolated(rna); - _zoomWindow.repaint(); - } - - - public void addRNA(RNA r, VARNAConfig cfg) - { - _rnaList.add(cfg,r); - } - - public static String generateDefaultName() - { - return "User file #"+_nextID++; - } - - public RNA getRNA() { - return (RNA)_sideList.getSelectedValue(); - } - - - - public String[][] getParameterInfo() { - String[][] info = { - // Parameter Name Kind of Value Description, - { "sequenceDBN", "String", "A raw RNA sequence" }, - { "structureDBN", "String", - "An RNA structure in dot bracket notation (DBN)" }, - { errorOpt, "boolean", "To show errors" }, }; - return info; - } - - public void init() { - _vp.setBackground(_backgroundColor); - _error = true; - } - - @SuppressWarnings("unused") - private Color getSafeColor(String col, Color def) { - Color result; - try { - result = Color.decode(col); - } catch (Exception e) { - try { - result = Color.getColor(col, def); - } catch (Exception e2) { - return def; - } - } - return result; - } - - public VARNAPanel get_varnaPanel() { - return _vp; - } - - public void set_varnaPanel(VARNAPanel surface) { - _vp = surface; - } - - - public JTextField get_seq() { - return _seq; - } - - public void set_seq(JTextField _seq) { - this._seq = _seq; - } - - public JLabel get_info() { - return _info; - } - - public void set_info(JLabel _info) { - this._info = _info; - } - - public static void main(String[] args) { - List icons = new ArrayList(); - //JOptionPane.showMessageDialog(null, ""+Toolkit.getDefaultToolkit().getImage("./VARNA16x16.png"), "Check", JOptionPane.INFORMATION_MESSAGE); - icons.add(Toolkit.getDefaultToolkit().getImage("./VARNA16x16.png")); - icons.add(Toolkit.getDefaultToolkit().getImage("./VARNA32x32.png")); - icons.add(Toolkit.getDefaultToolkit().getImage("./VARNA64x64.png")); - VARNAGUI d = new VARNAGUI(); - d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - d.pack(); - d.setIconImages(icons); - d.setVisible(true); - } - - - 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) { - // TODO Auto-generated method stub - - } - - public void drop(DropTargetDropEvent dtde) { - try { - Transferable tr = dtde.getTransferable(); - DataFlavor[] flavors = tr.getTransferDataFlavors(); - for (int i = 0; i < flavors.length; i++) { - if (flavors[i].isFlavorJavaFileListType()) { - dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - Object ob = tr.getTransferData(flavors[i]); - if (ob instanceof List) - { - List list = (List) ob; - for (int j = 0; j < list.size(); j++) { - Object o = list.get(j); - - if (dtde.getSource() instanceof DropTarget) - { - DropTarget dt = (DropTarget) dtde.getSource(); - Component c = dt.getComponent(); - if (c instanceof VARNAPanel) - { - String path = o.toString(); - VARNAPanel vp = (VARNAPanel) c; - try{ - FullBackup bck = VARNAPanel.importSession((File) o); // BH SwingJS - _rnaList.add(bck.config, bck.rna,bck.name,true); - } - catch (ExceptionLoadingFailed e3) - { - ArrayList rnas = RNAFactory.loadSecStr((File) o); // BH SwingJS - if (rnas.isEmpty()) - { - throw new ExceptionFileFormatOrSyntax("No RNA could be parsed from that source."); - } - - dtde.dropComplete(true); - _vp.getVARNAUI().UIChooseRNAs(rnas); - return; - /* - for(RNA r: rnas) - { - r.drawRNA(vp.getConfig()); - String name = r.getName(); - if (name.equals("")) - { - name = path.substring(path.lastIndexOf(File.separatorChar)+1); - } - if (rnas.size()>1) - { - name += " - Molecule# "+id++; - } - _rnaList.add(vp.getConfig().clone(),r,name,true); - }*/ - } - } - } - } - } - // If we made it this far, everything worked. - dtde.dropComplete(true); - return; - } - } - // Hmm, the user must not have dropped a file list - dtde.rejectDrop(); - } catch (Exception e) { - e.printStackTrace(); - dtde.rejectDrop(); - } - - } - - public void dropActionChanged(DropTargetDragEvent arg0) { - } - - private class BackupHolder{ - private DefaultListModel _rnaList; - private ArrayList _rnas = new ArrayList(); - JList _l; - - public BackupHolder(DefaultListModel rnaList, JList l) - { - _rnaList = rnaList; - _l = l; - } - - public void add(VARNAConfig c, RNA r) - { - add(c, r, r.getName(),false); - } - - public void add(VARNAConfig c, RNA r,boolean select) - { - add(c, r, r.getName(),select); - } - - public void add(VARNAConfig c, RNA r, String name) - { - add(c, r, name,false); - } - public void add(VARNAConfig c, RNA r, String name, boolean select) - { - if (!_rnas.contains(r)) - { - if (select){ - _l.removeSelectionInterval(0, _rnaList.size()); - } - if (name.equals("")) - { - name = generateDefaultName(); - } - FullBackup bck = new FullBackup(c,r,name); - _rnas.add(0, r); - _rnaList.add(0,bck); - _l.doLayout(); - if (select){ - _l.setSelectedIndex(0); - } - } - } - - public void remove(int i) - { - _rnas.remove(i); - _rnaList.remove(i); - - } - public DefaultListModel getModel() - { - return _rnaList; - } - public boolean contains(RNA r) - { - return _rnas.contains(r); - } - /*public int getSize() - { - return _rnaList.getSize(); - }*/ - public FullBackup getElementAt(int i) - { - return (FullBackup) _rnaList.getElementAt(i); - } - - public void removeSelected() - { - int i = _l.getSelectedIndex(); - if (i!=-1) - { - if (_rnaList.getSize()==1) - { - RNA r = new RNA(); - try { - r.setRNA(" ", "."); - } catch (ExceptionUnmatchedClosingParentheses e1) { - } catch (ExceptionFileFormatOrSyntax e1) { - } - showRNA(r); - } - else - { - int newi = i+1; - if (newi==_rnaList.getSize()) - { - newi = _rnaList.getSize()-2; - } - FullBackup bck = (FullBackup) _rnaList.getElementAt(newi); - _l.setSelectedValue(bck,true); - } - _rnaList.remove(i); - } - - } - } - - public void onStructureRedrawn() { - // TODO Auto-generated method stub - - } - - public void onUINewStructure(VARNAConfig v, RNA r) { - _rnaList.add(v, r,r.getName(),true); - onZoomLevelChanged(); - } - - public void onWarningEmitted(String s) { - // TODO Auto-generated method stub - - } - - public void mouseClicked(MouseEvent e) { - if(e.getClickCount() == 2){ - int index = _sideList.locationToIndex(e.getPoint()); - ListModel dlm = _sideList.getModel(); - FullBackup item = (FullBackup) dlm.getElementAt(index);; - _sideList.ensureIndexIsVisible(index); - Object newName = JOptionPane.showInputDialog( - this, - "Specify a new name for this RNA", - "Rename RNA", - JOptionPane.QUESTION_MESSAGE, - (Icon)null, - null, - item.toString()); - if (newName!=null) - { - item.name = newName.toString(); - this._sideList.repaint(); - } - } - } - - public void mouseEntered(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mouseExited(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mousePressed(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mouseReleased(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void onZoomLevelChanged() { - if (_vp.getZoom()>1.02) - { - Rectangle r = _vp.getZoomedInTranslationBox(); - _horiz.setMinimum(r.x); - _horiz.setMaximum(r.x+r.width+_vp.getWidth()); - _horiz.getModel().setExtent(_vp.getWidth()); - _horiz.getModel().setValue(_vp.getTranslation().x); - _horiz.doLayout(); - _horiz.setVisible(true); - - _vert.setMinimum(r.y); - _vert.setMaximum(r.y+r.height+_vp.getHeight()); - _vert.getModel().setExtent(_vp.getHeight()); - _vert.getModel().setValue(_vp.getTranslation().y); - _vert.doLayout(); - _vert.setVisible(true); - } - else - { - _horiz.setVisible(false); - _vert.setVisible(false); - } - } - - public void onTranslationChanged() { - if (_vp.getZoom()>1.02) - { - int nx = _horiz.getMaximum()-(_vp.getTranslation().x-_horiz.getMinimum())-_vp.getWidth(); - int ny = _vert.getMaximum()-(_vp.getTranslation().y-_vert.getMinimum())-_vp.getHeight(); - _horiz.getModel().setValue(nx); - _horiz.doLayout(); - _vert.getModel().setValue(ny); - _vert.doLayout(); - } - } - - public void adjustmentValueChanged(AdjustmentEvent arg0) { - if (arg0.getSource()==_horiz) - { - _vp.setTranslation(new Point(_horiz.getMaximum()-(arg0.getValue()-_horiz.getMinimum())-_vp.getWidth(),_vp.getTranslation().y)); - _vp.repaint(); - } - else if (arg0.getSource()==_vert) - { - _vp.setTranslation(new Point(_vp.getTranslation().x,_vert.getMaximum()-(arg0.getValue()-_vert.getMinimum())-_vp.getHeight())); - _vp.repaint(); - } - } -} diff --git a/src2/fr/orsay/lri/varna/applications/VARNAOnlineDemo.java b/src2/fr/orsay/lri/varna/applications/VARNAOnlineDemo.java deleted file mode 100644 index 2d02ce7..0000000 --- a/src2/fr/orsay/lri/varna/applications/VARNAOnlineDemo.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - 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; - -/* - VARNA is a Java library for quick automated drawings RNA secondary structure - Copyright (C) 2007 Yann Ponty - - 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 . - */ - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; - -import javax.swing.JApplet; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurDemoTextField; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.models.rna.RNA; - -/** - * An RNA 2d Panel demo applet - * - * @author Yann Ponty & Darty Kévin - * - */ - -public class VARNAOnlineDemo extends JApplet { - - /** - * - */ - private static final long serialVersionUID = -790155708306987257L; - - private static final String DEFAULT_SEQUENCE = "CAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIA"; - - private static final String DEFAULT_STRUCTURE = "..(((((...(((((...(((((...(((((.....)))))...))))).....(((((...(((((.....)))))...))))).....)))))...))))).."; - - private VARNAPanel _vp; - - private JPanel _tools = new JPanel(); - private JPanel _input = new JPanel(); - - private JPanel _seqPanel = new JPanel(); - private JPanel _structPanel = new JPanel(); - private JLabel _info = new JLabel(); - private JTextField _struct = new JTextField(); - private JTextField _seq = new JTextField(); - private JLabel _structLabel = new JLabel(" Str:"); - private JLabel _seqLabel = new JLabel(" Seq:"); - - private static String errorOpt = "error"; - private boolean _error; - - private Color _backgroundColor = Color.white; - - private int _algoCode; - - public VARNAOnlineDemo() { - super(); - try { - _vp = new VARNAPanel(_seq.getText(), _struct.getText()); - _vp.setErrorsOn(false); - } catch (ExceptionNonEqualLength e) { - _vp.errorDialog(e); - } - RNAPanelDemoInit(); - } - - private void RNAPanelDemoInit() { - int marginTools = 40; - - setBackground(_backgroundColor); - _vp.setBackground(_backgroundColor); - - try { - _vp.getRNA().setRNA(_seq.getText(), _struct.getText()); - _vp.setErrorsOn(false); - } catch (Exception e1) { - _vp.errorDialog(e1); - } - - Font textFieldsFont = Font.decode("MonoSpaced-PLAIN-12"); - - _seqLabel.setHorizontalTextPosition(JLabel.LEFT); - _seqLabel.setPreferredSize(new Dimension(marginTools, 15)); - _seq.setFont(textFieldsFont); - _seq.setText(_vp.getRNA().getSeq()); - - _seqPanel.setLayout(new BorderLayout()); - _seqPanel.add(_seqLabel, BorderLayout.WEST); - _seqPanel.add(_seq, BorderLayout.CENTER); - - _structLabel.setPreferredSize(new Dimension(marginTools, 15)); - _structLabel.setHorizontalTextPosition(JLabel.LEFT); - _struct.setFont(textFieldsFont); - _struct.setText(_vp.getRNA().getStructDBN()); - _structPanel.setLayout(new BorderLayout()); - _structPanel.add(_structLabel, BorderLayout.WEST); - _structPanel.add(_struct, BorderLayout.CENTER); - - ControleurDemoTextField controleurTextField = new ControleurDemoTextField(this); - _seq.addCaretListener(controleurTextField); - _struct.addCaretListener(controleurTextField); - - _input.setLayout(new GridLayout(3, 0)); - _input.add(_seqPanel); - _input.add(_structPanel); - - _tools.setLayout(new BorderLayout()); - _tools.add(_input, BorderLayout.CENTER); - _tools.add(_info, BorderLayout.SOUTH); - - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(_vp, BorderLayout.CENTER); - getContentPane().add(_tools, BorderLayout.SOUTH); - - setVisible(true); - _vp.getVARNAUI().UIRadiate(); - } - - public String[][] getParameterInfo() { - String[][] info = { - // Parameter Name Kind of Value Description, - { "sequenceDBN", "String", "A raw RNA sequence" }, - { "structureDBN", "String", - "An RNA structure in dot bracket notation (DBN)" }, - { errorOpt, "boolean", "To show errors" }, }; - return info; - } - - public void init() { - retrieveParametersValues(); - _vp.setBackground(_backgroundColor); - _error = true; - } - - private Color getSafeColor(String col, Color def) { - Color result; - try { - result = Color.decode(col); - } catch (Exception e) { - try { - result = Color.getColor(col, def); - } catch (Exception e2) { - return def; - } - } - return result; - } - - private String getParameterValue(String key, String def) { - String tmp; - tmp = getParameter(key); - if (tmp == null) { - return def; - } else { - return tmp; - } - } - - private void retrieveParametersValues() { - _error = Boolean.parseBoolean(getParameterValue(errorOpt, "false")); - _vp.setErrorsOn(_error); - _backgroundColor = getSafeColor(getParameterValue("background", - _backgroundColor.toString()), _backgroundColor); - _vp.setBackground(_backgroundColor); - _seq.setText(getParameterValue("sequenceDBN", "")); - _struct.setText(getParameterValue("structureDBN", "")); - String _algo = getParameterValue("algorithm", "radiate"); - if (_algo.equals("circular")) - _algoCode = RNA.DRAW_MODE_CIRCULAR; - else if (_algo.equals("naview")) - _algoCode = RNA.DRAW_MODE_NAVIEW; - else if (_algo.equals("line")) - _algoCode = RNA.DRAW_MODE_LINEAR; - else - _algoCode = RNA.DRAW_MODE_RADIATE; - if (_seq.getText().equals("") && _struct.getText().equals("")) { - _seq.setText(DEFAULT_SEQUENCE); - _struct.setText(DEFAULT_STRUCTURE); - } - try { - _vp.drawRNA(_seq.getText(), _struct.getText(), _algoCode); - } catch (ExceptionNonEqualLength e) { - e.printStackTrace(); - } - - } - - public VARNAPanel get_varnaPanel() { - return _vp; - } - - public void set_varnaPanel(VARNAPanel surface) { - _vp = surface; - } - - public JTextField get_struct() { - return _struct; - } - - public void set_struct(JTextField _struct) { - this._struct = _struct; - } - - public JTextField get_seq() { - return _seq; - } - - public void set_seq(JTextField _seq) { - this._seq = _seq; - } - - public JLabel get_info() { - return _info; - } - - public void set_info(JLabel _info) { - this._info = _info; - } -} diff --git a/src2/fr/orsay/lri/varna/applications/VARNAPrinter.java b/src2/fr/orsay/lri/varna/applications/VARNAPrinter.java deleted file mode 100644 index 6dbc332..0000000 --- a/src2/fr/orsay/lri/varna/applications/VARNAPrinter.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.orsay.lri.varna.applications; - -import java.awt.*; -import javax.swing.*; -import java.awt.print.*; - -public class VARNAPrinter implements Printable { - private Component componentToBePrinted; - - public static void printComponent(Component c) { - new VARNAPrinter(c).print(); - } - - public VARNAPrinter(Component componentToBePrinted) { - this.componentToBePrinted = componentToBePrinted; - } - - public void print() { - PrinterJob printJob = PrinterJob.getPrinterJob(); - printJob.setPrintable(this); - if (printJob.printDialog()) - try { - printJob.print(); - } catch(PrinterException pe) { - //System.out.println("Error printing: " + pe); - } - } - - public int print(Graphics g, PageFormat pageFormat, int pageIndex) { - if (pageIndex > 0) { - return(NO_SUCH_PAGE); - } else { - Graphics2D g2d = (Graphics2D)g; - g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); - disableDoubleBuffering(componentToBePrinted); - componentToBePrinted.paint(g2d); - enableDoubleBuffering(componentToBePrinted); - return(PAGE_EXISTS); - } - } - - public static void disableDoubleBuffering(Component c) { - RepaintManager currentManager = RepaintManager.currentManager(c); - currentManager.setDoubleBufferingEnabled(false); - } - - public static void enableDoubleBuffering(Component c) { - RepaintManager currentManager = RepaintManager.currentManager(c); - currentManager.setDoubleBufferingEnabled(true); - } -} diff --git a/src2/fr/orsay/lri/varna/applications/VARNAcmd.java b/src2/fr/orsay/lri/varna/applications/VARNAcmd.java deleted file mode 100644 index 7b16c61..0000000 --- a/src2/fr/orsay/lri/varna/applications/VARNAcmd.java +++ /dev/null @@ -1,529 +0,0 @@ -/* - 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; - - -import java.awt.Graphics2D; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.Hashtable; -import java.util.Vector; - -import javax.imageio.IIOImage; -import javax.imageio.ImageIO; -import javax.imageio.ImageWriteParam; -import javax.imageio.ImageWriter; -import javax.imageio.stream.FileImageOutputStream; -import javax.swing.JFrame; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.exceptions.ExceptionExportFailed; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionJPEGEncoding; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionModeleStyleBaseSyntaxError; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionParameterError; -import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.exceptions.ExceptionWritingForbidden; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.interfaces.InterfaceParameterLoader; -import fr.orsay.lri.varna.models.FullBackup; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.VARNAConfigLoader; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VARNAcmd implements InterfaceParameterLoader { - - public class ExitCode extends Exception{ - /** - * - */ - private static final long serialVersionUID = -3011196062868355584L; - private int _c; - private String _msg; - public ExitCode(int c,String msg){ - _c = c; - _msg = msg; - } - public int getExitCode(){ - return _c; - } - public String getExitMessage(){ - return _msg; - } - } - - - private Hashtable _optsValues = new Hashtable(); - private Hashtable _basicOptsInv = new Hashtable(); - private String _inFile = ""; - private String _outFile = ""; - int _baseWidth = 400; - double _scale = 1.0; - float _quality = 0.9f; - - private String[] _basicOptions = { VARNAConfigLoader.algoOpt, - VARNAConfigLoader.bpStyleOpt, VARNAConfigLoader.bondColorOpt, - VARNAConfigLoader.backboneColorOpt, VARNAConfigLoader.periodNumOpt, - VARNAConfigLoader.baseInnerColorOpt, - VARNAConfigLoader.baseOutlineColorOpt, - - }; - - public VARNAcmd(Vector args) throws ExitCode { - for (int j = 0; j < _basicOptions.length; j++) { - _basicOptsInv.put(_basicOptions[j], _basicOptions[j]); - } - int i = 0; - while (i < args.size()) { - String opt = args.elementAt(i); - if (opt.charAt(0) != '-') { - errorExit("Missing or unknown option \"" + opt + "\""); - } - if (opt.equals("-h")) { - displayLightHelpExit(); - } - if (opt.equals("-x")) { - displayDetailledHelpExit(); - } else { - if (i + 1 >= args.size()) { - errorExit("Missing argument for option \"" + opt + "\""); - } - String val = args.get(i + 1); - if (opt.equals("-i")) { - _inFile = val; - } else if (opt.equals("-o")) { - _outFile = val; - } else if (opt.equals("-quality")) { - _quality = Float.parseFloat(val); - } else if (opt.equals("-resolution")) { - _scale = Float.parseFloat(val); - } else { - addOption(opt, val); - } - } - i += 2; - } - } - - public void addOption(String key, String value) { - if (key.equals("-i")) { - _inFile = value; - } else if (key.equals("-o")) { - _outFile = value; - } else { - _optsValues.put(key.substring(1), value); - } - } - - private String getDescription() { - return "VARNA v" - + VARNAConfig.MAJOR_VERSION - + "." - + VARNAConfig.MINOR_VERSION - + " Assisted drawing of RNA secondary structure (Command Line version)"; - } - - private String indent(int k) { - String result = ""; - for (int i = 0; i < k; i++) { - result += " "; - } - return result; - } - - private String complete(String s, int k) { - String result = s; - while (result.length() < k) { - result += " "; - } - return result; - } - - Vector matrix = new Vector(); - - private void addLine(String opt, String val) { - String[] line = { opt, val }; - matrix.add(line); - } - - private static int MAX_WIDTH = 100; - - @SuppressWarnings("unchecked") - private void printMatrix(int ind) { - String[][] values = new String[matrix.size()][]; - matrix.toArray(values); - Arrays.sort(values, new Comparator() { - public int compare(Object o1, Object o2) { - String[] tab1 = (String[]) o1; - String[] tab2 = (String[]) o2; - return tab1[0].compareTo(tab2[0]); - } - }); - - int maxSize = 0; - for (int i = 0; i < values.length; i++) { - String[] elem = values[i]; - maxSize = Math.max(maxSize, elem[0].length()); - } - maxSize += ind + 2; - for (int i = 0; i < values.length; i++) { - String[] elem = values[i]; - String opt = elem[0]; - String msg = elem[1]; - opt = complete("", ind) + "-" + complete(opt, maxSize - ind); - System.out.println(opt + msg.substring(0, Math.min(MAX_WIDTH - opt.length(), msg.length()))); - if (opt.length() + msg.length() >= MAX_WIDTH) { - int off = MAX_WIDTH - opt.length(); - while (off < msg.length()) { - String nmsg = msg.substring(off, Math.min(off + MAX_WIDTH - - opt.length(), msg.length())); - System.out.println(complete("", opt.length())+nmsg); - off += MAX_WIDTH - opt.length(); - } - } - } - matrix = new Vector(); - } - - private void printUsage() { - System.out - .println("Usage: java -cp . [-i InFile|-sequenceDBN XXX -structureDBN YYY] -o OutFile [Options]"); - System.out.println("Where:"); - System.out.println(indent(1) - + "OutFile\tSupported formats: {JPEG,PNG,EPS,XFIG,SVG}"); - System.out - .println(indent(1) - + "InFile\tSecondary structure file: Supported formats: {BPSEQ,CT,RNAML,DBN}"); - - } - - private void printHelpOptions() { - System.out.println("\nMain options:"); - addLine("h", "Displays a short description of main options and exits"); - addLine("x", "Displays a detailled description of all options"); - printMatrix(2); - } - - private void printMainOptions(String[][] info) { - System.out.println("\nMain options:"); - addLine("h", "Displays a short description of main options and exits"); - addLine("x", "Displays a detailled description of all options"); - for (int i = 0; i < info.length; i++) { - String key = info[i][0]; - if (_basicOptsInv.containsKey(key)) { - addLine(key, info[i][2]); - } - } - printMatrix(2); - } - - private void printAdvancedOptions(String[][] info) { - System.out.println("\nAdvanced options:"); - for (int i = 0; i < info.length; i++) { - String key = info[i][0]; - if (!_basicOptsInv.containsKey(key)) { - addLine(key, info[i][2]); - } - } - addLine("quality", "Sets quality (non-vector file formats only)"); - addLine("resolution", "Sets resolution (non-vector file formats only)"); - printMatrix(2); - } - - private void displayLightHelpExit() throws ExitCode { - String[][] info = VARNAConfigLoader.getParameterInfo(); - System.out.println(getDescription()); - printUsage(); - printMainOptions(info); - throw(new ExitCode(1,"")); - } - - private void displayDetailledHelpExit() throws ExitCode { - String[][] info = VARNAConfigLoader.getParameterInfo(); - System.out.println(getDescription()); - printUsage(); - printMainOptions(info); - printAdvancedOptions(info); - throw(new ExitCode(1,"")); - } - - private void errorExit(String msg) throws ExitCode { - System.out.println(getDescription()); - System.out.println("Error: " + msg + "\n"); - printUsage(); - printHelpOptions(); - throw(new ExitCode(1,"")); - } - - public String getParameterValue(String key, String def) { - if (_optsValues.containsKey(key)) { - return _optsValues.get(key); - } - return def; - } - - public String formatOutputPath(String base,int index, int total) - { - String result = base; - - if (total>1) - { - int indexDot = base.lastIndexOf('.'); - String pref; - String ext; - if (indexDot!=-1) - { - pref = base.substring(0,indexDot); - ext = base.substring(indexDot); - } - else{ - pref=base; - ext=""; - } - result = pref+"-"+index+ext; - } - System.err.println("Output file: "+result); - return result; - } - - public void run() throws IOException, ExitCode { - VARNAConfigLoader VARNAcfg = new VARNAConfigLoader(this); - ArrayList vpl; - ArrayList confs = new ArrayList(); - try { - if (!_inFile.equals("")) { - if (!_inFile.toLowerCase().endsWith(".varna")) { - Collection rnas = RNAFactory.loadSecStr(_inFile); - if (rnas.isEmpty()) - { - FullBackup f = null; - try{ - f = VARNAPanel.importSession(new FileInputStream(_inFile), _inFile); - confs.add(f); - } - catch(Exception e) - { - e.printStackTrace(); - } - if (f==null) - { - throw new ExceptionFileFormatOrSyntax("No RNA could be parsed from file '"+_inFile+"'."); - } - } - else{ - for (RNA r: rnas) - { - confs.add(new FullBackup(r,_inFile)); - } - } - } - else{ - confs.add(VARNAPanel.importSession(_inFile)); - } - } else { - RNA r = new RNA(); - r.setRNA(this.getParameterValue("sequenceDBN", - ""), this.getParameterValue( - "structureDBN", "")); - confs.add(new FullBackup(r,"From Params")); - } - if (!_outFile.equals("")) - { - int index = 1; - for (FullBackup r: confs) - { - VARNAcfg.setRNA(r.rna); - vpl = VARNAcfg.createVARNAPanels(); - if (vpl.size() > 0) { - VARNAPanel _vp = vpl.get(0); - if (r.hasConfig()) - { - _vp.setConfig(r.config); - } - RNA _rna = _vp.getRNA(); - Rectangle2D.Double bbox = _vp.getRNA().getBBox(); - //System.out.println(_vp.getRNA().getBBox()); - - if (_outFile.toLowerCase().endsWith(".jpeg") - || _outFile.toLowerCase().endsWith(".jpg") - || _outFile.toLowerCase().endsWith(".png")) - { - _vp.setTitleFontSize((int)(_scale*_vp.getTitleFont().getSize())); - _vp.setSize((int)(_baseWidth*_scale), (int)((_scale*_baseWidth*bbox.height)/((double)bbox.width))); - } - - if (_outFile.toLowerCase().endsWith(".eps")) { - _rna.saveRNAEPS(formatOutputPath(_outFile,index, confs.size()), _vp.getConfig()); - } else if (_outFile.toLowerCase().endsWith(".xfig") - || _outFile.toLowerCase().endsWith(".fig")) { - _rna.saveRNAXFIG(formatOutputPath(_outFile,index, confs.size()), _vp.getConfig()); - } else if (_outFile.toLowerCase().endsWith(".svg")) { - _rna.saveRNASVG(formatOutputPath(_outFile,index, confs.size()), _vp.getConfig()); - } else if (_outFile.toLowerCase().endsWith(".jpeg") - || _outFile.toLowerCase().endsWith(".jpg")) { - this.saveToJPEG(formatOutputPath(_outFile,index, confs.size()), _vp); - } else if (_outFile.toLowerCase().endsWith(".png")) { - this.saveToPNG(formatOutputPath(_outFile,index, confs.size()), _vp); - } else if (_outFile.toLowerCase().endsWith(".varna")) { - _vp.saveSession(formatOutputPath(_outFile,index, confs.size())); - } else { - errorExit("Unknown extension for output file \"" + _outFile - + "\""); - } - } - index++; - } - } - // No output file => Open GUI - else - { - VARNAGUI d = new VARNAGUI(); - d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - d.pack(); - d.setVisible(true); - for (FullBackup b: confs) - { - RNA r = b.rna; - VARNAcfg.setRNA(r); - vpl = VARNAcfg.createVARNAPanels(); - if (vpl.size() > 0) { - VARNAPanel _vp = vpl.get(0); - VARNAConfig cfg = _vp.getConfig(); - if (b.hasConfig()) - { - cfg = b.config; - } - RNA rna = _vp.getRNA(); - d.addRNA(rna, cfg); - - } - } - } - } catch (ExceptionWritingForbidden e) { - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (ExceptionJPEGEncoding e) { - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (ExceptionParameterError e) { - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (ExceptionModeleStyleBaseSyntaxError e) { - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (ExceptionNonEqualLength e) { - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (ExceptionUnmatchedClosingParentheses e) { - e.printStackTrace(); - System.exit(1); - } catch (ExceptionExportFailed e) { - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (ExceptionPermissionDenied e) { - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (ExceptionLoadingFailed e) { - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (ExceptionFileFormatOrSyntax e) { - e.setPath(_inFile); - e.printStackTrace(); - throw(new ExitCode(1,"")); - } catch (FileNotFoundException e) { - throw(new ExitCode(1,"Error: Missing input file \""+_inFile+"\".")); - } - - if (!_outFile.equals("")) - throw(new ExitCode(0,"")); - - - - } - - public void saveToJPEG(String filename, VARNAPanel vp) - throws ExceptionJPEGEncoding, ExceptionExportFailed { - - BufferedImage myImage = new BufferedImage((int) Math.round(vp - .getWidth() - ), (int) Math.round(vp.getHeight() ), - BufferedImage.TYPE_INT_RGB); - Graphics2D g2 = myImage.createGraphics(); - vp.paintComponent(g2); - try { - FileImageOutputStream out = new FileImageOutputStream(new File(filename)); - ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); - ImageWriteParam params = writer.getDefaultWriteParam(); - params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - params.setCompressionQuality(_quality); - writer.setOutput(out); - IIOImage myIIOImage = new IIOImage(myImage, null, null); - writer.write(null, myIIOImage, params); - out.close(); - } catch (IOException e) { - throw new ExceptionExportFailed(e.getMessage(), filename); - } - - } - - public void saveToPNG(String filename, VARNAPanel vp) - throws ExceptionExportFailed { - BufferedImage myImage = new BufferedImage((int) Math.round(vp - .getWidth()), (int) Math.round(vp.getHeight() ), - BufferedImage.TYPE_INT_RGB); - Graphics2D g2 = myImage.createGraphics(); - vp.paintComponent(g2); - g2.dispose(); - try { - ImageIO.write(myImage, "PNG", new File(filename)); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static void main(String[] argv) { - Vector opts = new Vector(); - for (int i = 0; i < argv.length; i++) { - opts.add(argv[i]); - } - try { - VARNAcmd app = new VARNAcmd(opts); - app.run(); - } catch (IOException e) { - e.printStackTrace(); - } catch (ExitCode e) { - System.err.println(e.getExitMessage()); - System.exit(e.getExitCode()); - } - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqAnnotationDataModel.java b/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqAnnotationDataModel.java deleted file mode 100644 index 15c0522..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqAnnotationDataModel.java +++ /dev/null @@ -1,112 +0,0 @@ -package fr.orsay.lri.varna.applications.fragseq; - -import java.awt.Color; -import java.awt.datatransfer.DataFlavor; -import java.util.Hashtable; -import java.util.Random; - -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation.ChemProbAnnotationType; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.RNA; - -public class FragSeqAnnotationDataModel extends FragSeqModel { - private String _id; - private String _name; - private Hashtable _values = new Hashtable(); - - - public FragSeqAnnotationDataModel(String id, String name) - { - _id = id; - _name = name; - } - - public FragSeqAnnotationDataModel() - { - this(Long.toHexString(Double.doubleToLongBits(Math.random())),Long.toHexString(Double.doubleToLongBits(Math.random()))); - } - - public void addValue(ChemProbModel cpm) - { - _values.put(cpm._baseNumber1,cpm); - } - - static Random _rnd = new Random(); - - public static void addRandomAnnotations(RNA r,FragSeqAnnotationDataModel data){ - int nb = r.getSize()/5+_rnd.nextInt(r.getSize()/3); - Color[] colors = {Color.orange,Color.black,Color.blue.darker(),Color.green.darker(), Color.gray}; - ChemProbAnnotationType[] types = ChemProbAnnotationType.values(); - for(int i=0;i= clickCount; - } - return true; - - } - - -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqCellRenderer.java b/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqCellRenderer.java deleted file mode 100644 index d1e92bf..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqCellRenderer.java +++ /dev/null @@ -1,225 +0,0 @@ -package fr.orsay.lri.varna.applications.fragseq; - -import java.awt.BasicStroke; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; - -import javax.swing.BorderFactory; -import javax.swing.Icon; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.UIManager; -import javax.swing.border.Border; -import javax.swing.plaf.basic.BasicTreeUI; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; - -class FragSeqCellRenderer extends DefaultTreeCellRenderer { - - JTree _j; - FragSeqTreeModel _m; - - private static FragSeqCellRenderer _default = new FragSeqCellRenderer(null,null); - - - - public FragSeqCellRenderer (JTree j, FragSeqTreeModel m) - { - _j = j; - _m = m; - } - - public JComponent baseElements(JTree tree,FragSeqTreeModel m, - Object value, boolean sel, boolean expanded, boolean leaf, - int row, boolean hasFocus) - { - JLabel initValue = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); - JPanel result = new JPanel(); - result.setLayout(new BorderLayout()); - initValue.setBorder(null); - result.setBorder(null); - result.setBackground(initValue.getBackground()); - /*if (hasFocus) - { - //renderer.setBackground(Color.blue); - //result.setBorder(BorderFactory.createLineBorder(Color.blue)); - result.setBackground(UIManager.getColor("Tree.selectionBackground")); - result.setBorder(BorderFactory.createLineBorder(initValue.getBackground())); - initValue.setOpaque(true); - } - else - { - result.setBackground(Color.white); - result.setBorder(BorderFactory.createLineBorder(initValue.getBackground())); - - }*/ - DefaultMutableTreeNode t = (DefaultMutableTreeNode)value; - Object o = t.getUserObject(); - if (( o instanceof String)) - { - if (expanded) - { - initValue.setIcon(_default.getOpenIcon()); - } - else - { - initValue.setIcon(_default.getClosedIcon()); - } - result.add(initValue,BorderLayout.WEST); - JButton del = new JButton(); - del.setIcon(new SimpleIcon(Color.red,26,false)); - Dimension d = getPreferredSize(); - d.width=24; - del.setPreferredSize(d); - del.addActionListener(new FolderCloses((String)o,tree,m)); - result.add(del,BorderLayout.EAST); - } - else if (( o instanceof FragSeqRNASecStrModel)) - { - initValue.setIcon(new SimpleIcon(Color.blue.darker())); - result.add(initValue,BorderLayout.WEST); - } - else if (( o instanceof FragSeqFileModel)) - { - initValue.setIcon(_default.getLeafIcon()); - FragSeqFileModel mod = (FragSeqFileModel) o; - result.add(initValue,BorderLayout.WEST); - if (mod.hasChanged()) - { - JButton refresh = new JButton("Refresh"); - result.add(refresh,BorderLayout.EAST); - } - } - else if (( o instanceof FragSeqModel)) - { - FragSeqModel mod = (FragSeqModel) o; - initValue.setIcon(new SimpleIcon()); - result.add(initValue,BorderLayout.WEST); - } - return result; - } - - public Component getDefaultTreeCellRendererComponent(JTree tree, - Object value, boolean sel, boolean expanded, boolean leaf, - int row, boolean hasFocus) - { - return super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus); - } - - public Component getTreeCellRendererComponent(JTree tree, - Object value, boolean sel, boolean expanded, boolean leaf, - int row, boolean hasFocus) - { - - return baseElements(tree,_m,value,sel,expanded,leaf,row,hasFocus); - } - public Dimension getPreferredSize(int row) { - Dimension size = super.getPreferredSize(); - size.width = _j.getWidth(); - System.out.println(size); - return size; - } - - -// @Override -// public void setBounds(final int x, final int y, final int width, final int height) { -// super.setBounds(x, y, Math.min(_j.getWidth()-x, width), height); -// } - - - public class FolderCloses implements ActionListener{ - String _path; - JComponent _p; - FragSeqTreeModel _m; - - public FolderCloses(String path, JComponent p, FragSeqTreeModel m) - { - _path = path; - _p = p; - _m = m; - } - public void actionPerformed(ActionEvent e) { - if (JOptionPane.showConfirmDialog(_p, "This folder will cease to be watched. Confirm?", "Closing folder", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION) - { - _m.removeFolder(_path); - System.out.println(_j); - _j.updateUI(); - } - } - - } - - - public class SimpleIcon implements Icon{ - - private int _w = 16; - private int _h = 16; - - private BasicStroke stroke = new BasicStroke(3); - private Color _r; - private boolean _drawBackground = true; - - public SimpleIcon() - { - this(Color.magenta.darker()); - } - - public SimpleIcon(Color r) - { - this(r,16,true); - } - public SimpleIcon(Color r, int dim, boolean drawBackground) - { - this(r,dim,dim,drawBackground); - } - - public SimpleIcon(Color r, int width, int height,boolean drawBackground) - { - _r=r; - _w=width; - _h=height; - _drawBackground=drawBackground; - } - - public void paintIcon(Component c, Graphics g, int x, int y) { - Graphics2D g2d = (Graphics2D) g.create(); - - if (_drawBackground) - { - g2d.setColor(Color.WHITE); - g2d.fillRect(x +1 ,y + 1,_w -2 ,_h -2); - - g2d.setColor(Color.BLACK); - g2d.drawRect(x +1 ,y + 1,_w -2 ,_h -2); - } - - g2d.setColor(_r); - - g2d.setStroke(stroke); - g2d.drawLine(x +10, y + 10, x + _w -10, y + _h -10); - g2d.drawLine(x +10, y + _h -10, x + _w -10, y + 10); - - g2d.dispose(); - } - - public int getIconWidth() { - return _w; - } - - public int getIconHeight() { - return _h; - } - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqFileModel.java b/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqFileModel.java deleted file mode 100644 index 6374db8..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqFileModel.java +++ /dev/null @@ -1,158 +0,0 @@ -package fr.orsay.lri.varna.applications.fragseq; - -import java.awt.datatransfer.DataFlavor; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.Random; -import java.util.regex.Pattern; - -import javax.swing.tree.DefaultMutableTreeNode; - -import fr.orsay.lri.varna.exceptions.ExceptionExportFailed; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.models.rna.RNA; - -public class FragSeqFileModel implements Comparable { - private ArrayList _models = new ArrayList(); - protected Date _lastModified; - protected boolean _outOfSync = false; - protected String _caption = ""; - protected String _path = ""; - protected String _folder = ""; - protected boolean _cached = false; - - - public static Date lastModif(String path) - { - return new Date(new File(path).lastModified()) ; - } - - public FragSeqFileModel(String folder, String path) - { - this(folder,path,lastModif(path)); - } - - - private static Random _rnd = new Random(); - - public FragSeqFileModel(String folder, String path,Date lastModified) - { - _lastModified = lastModified; - _outOfSync = false; - _folder =folder; - _path = path; - String[] s = path.split(Pattern.quote(File.separator)); - if (s.length>0) - _caption = s[s.length-1]; - } - - public void load() - { - ArrayList rnas = null; - try { - rnas = createRNAs(); - for (RNA r: rnas) - { - this.addModel(new FragSeqRNASecStrModel(r)); - int nb =_rnd.nextInt(5); - for(int i=0;i getModels() - { - if (!_cached) - { load(); } - return _models; - } - public void addModel(FragSeqModel f) - { - _models.add(f); - } - - - private ArrayList createRNAs() throws ExceptionUnmatchedClosingParentheses, ExceptionFileFormatOrSyntax, FileNotFoundException, ExceptionExportFailed, ExceptionPermissionDenied, ExceptionLoadingFailed - { - Collection r = RNAFactory.loadSecStr(_path); - for (RNA r2 : r) - { - r2.drawRNARadiate(); - } - return new ArrayList(r); - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqGUI.java b/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqGUI.java deleted file mode 100644 index db2c3ee..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqGUI.java +++ /dev/null @@ -1,958 +0,0 @@ -/* - 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.fragseq; - -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.JComboBox; -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.LookAndFeel; -import javax.swing.SwingUtilities; -import javax.swing.TransferHandler; -import javax.swing.UIManager; -import javax.swing.UIManager.LookAndFeelInfo; -import javax.swing.UnsupportedLookAndFeelException; -import javax.swing.event.TreeModelEvent; -import javax.swing.event.TreeModelListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.ExpandVetoException; -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.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.models.FullBackup; - - -public class FragSeqGUI extends JFrame implements TreeModelListener, MouseListener,DropTargetListener, WindowListener, ComponentListener, ActionListener, TreeSelectionListener { - - private enum Commands - { - NEW_FOLDER, - ADD_PANEL_UP, - ADD_PANEL_DOWN, - REMOVE_PANEL_UP, - REMOVE_PANEL_DOWN, - SORT_ID, - SORT_FILENAME, - REFRESH_ALL, - CHANGE_LNF, - TEST_XML, - }; - - - /** - * - */ - private static final long serialVersionUID = -790155708306987257L; - - - - private String _INIFilename = "FragSeqUI.ini"; - 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 FragSeqTree _sideList = null; - - - private FragSeqTreeModel _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; - - private JComboBox _lnf; - - - public FragSeqGUI() { - super("VARNA Explorer"); - RNAPanelDemoInit(); - } - - - private void RNAPanelDemoInit() - { - JFrame.setDefaultLookAndFeelDecorated(true); - this.addWindowListener(this); - - _selectedElems = new JList(); - - _lnf = new JComboBox(UIManager.getInstalledLookAndFeels()); - - // Initializing Custom Tree Model - _treeModel = new FragSeqTreeModel(); - _treeModel.addTreeModelListener(this); - - _sideList = new FragSeqTree(_treeModel); - _sideList.addMouseListener(this); - _sideList.setLargeModel(true); - _sideList.setEditable(true); - _sideList.addTreeWillExpandListener(_treeModel); - FragSeqCellRenderer renderer = new FragSeqCellRenderer(_sideList,_treeModel); - //_sideList.setUI(new CustomTreeUI()); - _sideList.setCellRenderer(renderer); - _sideList.setCellEditor(new FragSeqCellEditor(_sideList,renderer,_treeModel)); - TreeSelectionModel m = _sideList.getSelectionModel(); - m.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - _sideList.setSelectionModel(m); - m.addTreeSelectionListener(this); - _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 FragSeqRNASecStrModel) { - return new Transferable(){ - public DataFlavor[] getTransferDataFlavors() { - DataFlavor[] dt = {FragSeqRNASecStrModel.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 FragSeqRNASecStrModel.Flavor.equals(df); - } - }; - } else if (node.getUserObject() instanceof FragSeqAnnotationDataModel) { - return new Transferable(){ - public DataFlavor[] getTransferDataFlavors() { - DataFlavor[] dt = { FragSeqAnnotationDataModel.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 FragSeqAnnotationDataModel.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); - - JButton changeLNFButton = new JButton("Change"); - changeLNFButton.setActionCommand(""+Commands.CHANGE_LNF); - changeLNFButton.addActionListener(this); - - JButton XMLButton = new JButton("Test XML"); - XMLButton.setActionCommand(""+Commands.TEST_XML); - XMLButton.addActionListener(this); - - _toolbar.setFloatable(false); - _toolbar.add(refreshAllFoldersButton); - _toolbar.addSeparator(); - _toolbar.add(addUpperButton); - _toolbar.add(removeUpperButton); - _toolbar.add(addLowerButton); - _toolbar.add(removeLowerButton); - _toolbar.addSeparator(); - _toolbar.add(XMLButton); - _toolbar.addSeparator(); - _toolbar.add(_lnf); - _toolbar.add(changeLNFButton); - - // 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("Directory"); - 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.getContentPane().setLayout(new BorderLayout()); - this.getContentPane().add(_splitRight, BorderLayout.CENTER); - this.getContentPane().add(_toolbar, BorderLayout.NORTH); - addUpperPanel(); - addUpperPanel(); - this.setVisible(true); - } - - public FragSeqGUI 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 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() == 1) - { - /*TreePath t = _sideList.getSelectionPath(); - if (t!=null) - { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) t.getLastPathComponent(); - if (node.getUserObject() instanceof FragSeqFileModel) - { - int row = _sideList.getRowForPath(t); - System.out.println("[A]"+row); - if (!_sideList.isExpanded(row)) - { - try { - _sideList.fireTreeWillExpand(t); - _sideList.expandPath(t); - } catch (ExpandVetoException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - } - else - { - try { - _sideList.fireTreeWillCollapse(t); - _sideList.collapsePath(t); - } catch (ExpandVetoException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - } - } - }*/ - } - else if (e.getClickCount() == 2) - { - TreePath t = _sideList.getSelectionPath(); - if (t!= null) - { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) t.getLastPathComponent(); - if (node.getUserObject() instanceof FragSeqFileModel) - { - if (!_sideList.isExpanded(t)) - { - try { - _sideList.fireTreeWillExpand(t); - _sideList.expandPath(t); - } catch (ExpandVetoException e1) { - e1.printStackTrace(); - } - } - else - { - try { - _sideList.fireTreeWillCollapse(t); - _sideList.collapsePath(t); - } catch (ExpandVetoException e1) { - e1.printStackTrace(); - } - } - } - else if (node.getUserObject() instanceof FragSeqModel) - { - FragSeqModel model = (FragSeqModel) node.getUserObject(); - - // Figuring out which panel to add object to... - int res; - if (model instanceof FragSeqRNASecStrModel) - { - res = index % (_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount()); - } - else - { - res = (index+_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount()-1) % (_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; - if (model instanceof FragSeqRNASecStrModel) - { - h.setSecStrModel((FragSeqRNASecStrModel)model); - index ++; - } - else if (model instanceof FragSeqAnnotationDataModel) - { - h.setDataModel((FragSeqAnnotationDataModel)model); - } - } - } - } - } - } - } - - - - - class VARNAHolder extends JPanel - { - VARNAPanel vp; - FragSeqRNASecStrModel _m; - FragSeqAnnotationDataModel _data; - 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)); - - _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 setSecStrModel(FragSeqRNASecStrModel 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(); - } - void setDataModel(FragSeqAnnotationDataModel data) - { - _data = data; - data.applyTo(vp.getRNA()); - vp.repaint(); - vp.requestFocus(); - } - FragSeqModel 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) - { - System.out.println("[X]"); - Transferable t = arg0.getTransferable(); - if (t.isDataFlavorSupported(FragSeqRNASecStrModel.Flavor)) - { - Object data = t.getTransferData(FragSeqRNASecStrModel.Flavor); - if (data instanceof FragSeqRNASecStrModel) - { - h.setSecStrModel((FragSeqRNASecStrModel) data); - } - } - else if (t.isDataFlavorSupported(FragSeqAnnotationDataModel.Flavor)) - { - System.out.println("[Y]"); - Object data = t.getTransferData(FragSeqAnnotationDataModel.Flavor); - if (data instanceof FragSeqAnnotationDataModel) - { - FragSeqAnnotationDataModel d = (FragSeqAnnotationDataModel) data; - h.setDataModel(d); - } - } - } - } - } 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 if (cmd.equals(""+Commands.SORT_FILENAME)) - { - _sideList.switchToPath(); - } - else if (cmd.equals(""+Commands.SORT_ID)) - { - _sideList.switchToID(); - } - else if (cmd.equals(""+Commands.TEST_XML)) - { - String path = "temp.xml"; - VARNAHolder vh = (VARNAHolder) _varnaUpperPanels.getComponent(0); - vh.vp.toXML(path); - try { - FullBackup b = vh.vp.importSession(path); - VARNAHolder vh2 = (VARNAHolder) _varnaUpperPanels.getComponent(1); - vh2.vp.setConfig(b.config); - vh2.vp.showRNAInterpolated(b.rna); - vh2.vp.repaint(); - } catch (ExceptionLoadingFailed e1) { - e1.printStackTrace(); - } - } - else if (cmd.equals(""+Commands.CHANGE_LNF)) - { - try { - - Object o = _lnf.getModel().getSelectedItem(); - System.out.println(o); - UIManager.setLookAndFeel(((LookAndFeelInfo)_lnf.getModel().getSelectedItem()).getClassName()); - SwingUtilities.updateComponentTreeUI(this); - this.pack(); - } catch (UnsupportedLookAndFeelException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (ClassNotFoundException e2) { - // TODO Auto-generated catch block - e2.printStackTrace(); - } catch (InstantiationException e3) { - // TODO Auto-generated catch block - e3.printStackTrace(); - } catch (IllegalAccessException e4) { - // TODO Auto-generated catch block - e4.printStackTrace(); - } - } - else - { - JOptionPane.showMessageDialog(this, "Command '"+cmd+"' not implemented yet."); - } - } - - - public void valueChanged(TreeSelectionEvent e) { - int[] t = _sideList.getSelectionRows(); - if (t==null) - { - System.out.print("null"); - } - else - { - System.out.print("["); - for(int i=0;i { - - public abstract String getID(); - - public int compareTo(FragSeqModel o) { - // TODO Auto-generated method stub - return 0; - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqNode.java b/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqNode.java deleted file mode 100644 index efdd6b0..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqNode.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.orsay.lri.varna.applications.fragseq; - -import javax.swing.tree.DefaultMutableTreeNode; - -public class FragSeqNode extends DefaultMutableTreeNode -{ - - public FragSeqNode(Object o) - { - super(o); - } - - public boolean isLeaf() - { - return (this.getUserObject() instanceof FragSeqModel); - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqRNASecStrModel.java b/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqRNASecStrModel.java deleted file mode 100644 index 6c3c6f2..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqRNASecStrModel.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.orsay.lri.varna.applications.fragseq; - -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.UnsupportedFlavorException; -import java.io.File; -import java.io.FileFilter; -import java.io.FileNotFoundException; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.regex.Pattern; - -import fr.orsay.lri.varna.exceptions.ExceptionExportFailed; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.models.rna.RNA; - -public class FragSeqRNASecStrModel extends FragSeqModel { - - private RNA _r =null; - - public FragSeqRNASecStrModel(RNA r) - { - _r = r; - } - - - public String toString() - { - return _r.getName(); - } - - public String getID() - { - return _r.getID(); - } - - - public RNA getRNA() - { - return _r; - } - public static DataFlavor Flavor = new DataFlavor(FragSeqRNASecStrModel.class, "RNA Sec Str Object"); - -} diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqTree.java b/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqTree.java deleted file mode 100644 index d9bed27..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqTree.java +++ /dev/null @@ -1,108 +0,0 @@ -package fr.orsay.lri.varna.applications.fragseq; - -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.DragGestureListener; -import java.awt.dnd.DragGestureRecognizer; -import java.awt.dnd.DragSource; -import java.awt.dnd.MouseDragGestureRecognizer; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.Enumeration; - -import javax.swing.JComponent; -import javax.swing.JTree; -import javax.swing.plaf.basic.BasicTreeUI; -import javax.swing.tree.AbstractLayoutCache; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.TreePath; - -public class FragSeqTree extends JTree implements MouseListener { - private Watcher _w; - - - public FragSeqTree(FragSeqTreeModel m) - { - super(m); - _w = new Watcher(m ); - _w.start(); - } - - public DefaultMutableTreeNode getSelectedNode() - { - TreePath t = getSelectionPath(); - if (t!= null) - { - return (DefaultMutableTreeNode) t.getLastPathComponent(); - } - return null; - } - - public void mouseClicked(MouseEvent e) { - int x = e.getX(); - int y = e.getY(); - TreePath tp = this.getPathForLocation(x, y); - if (tp!=null) - { - DefaultMutableTreeNode n = (DefaultMutableTreeNode) tp.getLastPathComponent(); - - } - } - - public void switchToPath() - { - FragSeqTreeModel m = (FragSeqTreeModel) getModel(); - cancelEditing(); - m.setRoot(m.getPathViewRoot()); - - Enumeration en = m.getRoot().depthFirstEnumeration(); - while(en.hasMoreElements()) - { - FragSeqNode n = (FragSeqNode) en.nextElement(); - if(m.isExpanded(n)) - { - expandPath(new TreePath(n.getPath())); - } - } - } - - public void switchToID() - { - FragSeqTreeModel m = (FragSeqTreeModel) getModel(); - cancelEditing(); - m.setRoot(m.getIDViewRoot()); - Enumeration en = m.getRoot().depthFirstEnumeration(); - while(en.hasMoreElements()) - { - FragSeqNode n = (FragSeqNode) en.nextElement(); - if(m.isExpanded(n)) - { - expandPath(new TreePath(n.getPath())); - } - } - } - - public void mousePressed(MouseEvent e) { - // TODO Auto-generated method stub - - } - - public void mouseReleased(MouseEvent e) { - // TODO Auto-generated method stub - - } - - public void mouseEntered(MouseEvent e) { - // TODO Auto-generated method stub - - } - - public void mouseExited(MouseEvent e) { - // TODO Auto-generated method stub - - } - - - -} diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqTreeModel.java b/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqTreeModel.java deleted file mode 100644 index 6586c04..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/FragSeqTreeModel.java +++ /dev/null @@ -1,256 +0,0 @@ -package fr.orsay.lri.varna.applications.fragseq; - -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.PriorityQueue; -import java.util.Random; -import java.util.TreeSet; - -import javax.swing.event.TreeExpansionEvent; -import javax.swing.event.TreeWillExpandListener; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.ExpandVetoException; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; - -public class FragSeqTreeModel extends DefaultTreeModel implements TreeWillExpandListener{ - - private FragSeqNode _rootIDs = new FragSeqNode("IDs"); - private FragSeqNode _rootFolders = new FragSeqNode("Folders"); - - private TreeSet _folders = new TreeSet(); - private Hashtable _folderPathToFolderNode = new Hashtable(); - - private Hashtable _idsToNode = new Hashtable(); - private Hashtable> _pathToIDFileNodes = new Hashtable>(); - - public enum SORT_MODE{ - PATH, - ID - } - - private SORT_MODE _mode = SORT_MODE.PATH; - - public FragSeqTreeModel() - { - this(new FragSeqNode("Folders")); - - } - public FragSeqTreeModel(TreeNode t) - { - super(t); - this.setRoot(_rootFolders); - } - - - public FragSeqNode getPathViewRoot() - { - return _rootFolders; - } - - public FragSeqNode getIDViewRoot() - { - return _rootIDs; - } - - public void switchToIDView() - { - if (_mode!=SORT_MODE.ID) - { - this.setRoot(this._rootIDs); - - } - _mode=SORT_MODE.ID; - - } - - private void removeAllNodes(ArrayList toBeRemoved) - { - for(FragSeqNode leafNode : toBeRemoved) - { - FragSeqNode parent = (FragSeqNode) leafNode.getParent(); - parent.remove(leafNode); - if (parent.getChildCount()==0) - { - parent.removeFromParent(); - _folderPathToFolderNode.remove(parent); - if (parent.getUserObject() instanceof String) - { - String path = parent.getUserObject().toString(); - } - } - else - { - reload(parent); - } - } - } - - - public FragSeqNode getNodeForId(String id) - { - if(!_idsToNode.containsKey(id)) - { - FragSeqNode idNode = new FragSeqNode(id); - _idsToNode.put(id, idNode); - _rootIDs.add(idNode); - } - FragSeqNode idNode = _idsToNode.get(id); - return idNode; - } - - public void removeFolder(String path) - { - ArrayList toBeRemoved = new ArrayList(); - Enumeration en = _folderPathToFolderNode.get(path).children(); - while(en.hasMoreElements()) - { - FragSeqNode n = (FragSeqNode) en.nextElement(); - toBeRemoved.add(n); - } - removeAllNodes(toBeRemoved); - _folders.remove(path); - } - - - public FragSeqNode insertGroupNode(String crit, TreeSet t) - { - FragSeqNode groupNode = new FragSeqNode(crit); - FragSeqNode parent = getRoot(); - int pos = t.headSet(crit).size(); - parent.insert(groupNode, pos); - reload(groupNode); - return groupNode; - } - - - - public void insertFileNode(FragSeqNode parent, FragSeqFileModel m) - { - FragSeqNode leafNode = new FragSeqNode(m); - parent.add(leafNode); - } - - public FragSeqNode addFolder(String path) - { - FragSeqNode groupNode = null; - try { - if (!_folders.contains(path)) - { - File dir = new File(path); - if (dir.isDirectory()) - { - path = dir.getCanonicalPath(); - _folders.add(path); - groupNode = insertGroupNode(path, _folders); - _folderPathToFolderNode.put(path,groupNode); - for(File f:dir.listFiles(_f)) - { - addFile(path,f.getCanonicalPath()); - } - } - } - } catch (IOException e) { - e.printStackTrace(); - } - return groupNode; - } - - private void addFile(String folder, String path) - { - System.out.println(" => "+path); - FragSeqFileModel m = new FragSeqFileModel(folder,path); - addFolder(folder); - insertFileNode(_folderPathToFolderNode.get(folder), m); - } - - public FragSeqNode getRoot() - { - return (FragSeqNode) super.getRoot(); - } - - public ArrayList getFolders() - { - ArrayList result = new ArrayList(_folders); - return result; - } - - - FilenameFilter _f = new FilenameFilter(){ - public boolean accept(File dir, String name) { - return name.toLowerCase().endsWith(".dbn") - || name.toLowerCase().endsWith(".ct") - || name.toLowerCase().endsWith(".bpseq") - || name.toLowerCase().endsWith(".rnaml"); - }}; - - public FilenameFilter getFileNameFilter() - { - return _f; - } - - public void setFileNameFilter(FilenameFilter f) - { - _f = f; - } - - -private Hashtable _isExpanded = new Hashtable(); - -public boolean isExpanded(FragSeqNode n) -{ - if(_isExpanded.containsKey(n)) - { - return _isExpanded.get(n); - } - else - return false; -} - -public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { - if (event.getSource() instanceof FragSeqTree) - { - FragSeqTree tree = (FragSeqTree) event.getSource(); - TreePath t = event.getPath(); - FragSeqNode n = (FragSeqNode) t.getLastPathComponent(); - _isExpanded.put(n, true); - Object o = n.getUserObject(); - if (o instanceof FragSeqFileModel) - { - FragSeqFileModel f = (FragSeqFileModel) o; - if (!f._cached) - { - String path = f.getPath(); - if (!_pathToIDFileNodes.containsKey(path)) - { - _pathToIDFileNodes.put(path, new ArrayList()); - } - ArrayList nodesForID = _pathToIDFileNodes.get(path); - for(FragSeqModel m: f.getModels()) - { - n.add(new FragSeqNode(m)); - FragSeqNode nid = getNodeForId(m.getID()); - nid.add(new FragSeqNode(m)); - nodesForID.add(nid); - } - } - } - } -} - -public void treeWillCollapse(TreeExpansionEvent event) - throws ExpandVetoException { - // TODO Auto-generated method stub - TreePath t = event.getPath(); - FragSeqNode n = (FragSeqNode) t.getLastPathComponent(); - _isExpanded.put(n, false); - - -} - - -} diff --git a/src2/fr/orsay/lri/varna/applications/fragseq/Watcher.java b/src2/fr/orsay/lri/varna/applications/fragseq/Watcher.java deleted file mode 100644 index 443ba27..0000000 --- a/src2/fr/orsay/lri/varna/applications/fragseq/Watcher.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.orsay.lri.varna.applications.fragseq; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; - -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.RNA; - - -public class Watcher extends Thread { - - private FragSeqTreeModel _model; - private boolean _terminated = false; - - public Watcher(FragSeqTreeModel model) - { - _model = model; - } - - public void run() { - while (!_terminated) - { - ArrayList folders = _model.getFolders(); - for (String path: folders) - { - _model.addFolder(path); - System.out.println("Watching ["+path+"]"); - } - try { - this.sleep(1000); - } catch (InterruptedException e) { - } - } - - } - - - - - - public void finish() - { - _terminated = true; - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUI.java b/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUI.java deleted file mode 100644 index 26a7334..0000000 --- a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUI.java +++ /dev/null @@ -1,750 +0,0 @@ -/* - 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."); - } - } -} - diff --git a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUICellEditor.java b/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUICellEditor.java deleted file mode 100644 index 4b1d3b5..0000000 --- a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUICellEditor.java +++ /dev/null @@ -1,53 +0,0 @@ -package fr.orsay.lri.varna.applications.newGUI; - -import java.awt.Component; -import java.awt.event.MouseEvent; -import java.io.File; -import java.util.EventObject; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellEditor; -import javax.swing.tree.DefaultTreeCellRenderer; - -class VARNAGUICellEditor extends DefaultTreeCellEditor { - - VARNAGUITreeModel _m; - - private VARNAGUIRenderer _base; - - public VARNAGUICellEditor(JTree tree, DefaultTreeCellRenderer renderer, VARNAGUITreeModel m) { - super(tree, renderer); - _base= new VARNAGUIRenderer(tree,m); - _m=m; - } - - - public Component getTreeCellEditorComponent(JTree tree, - Object value, boolean sel, boolean expanded, boolean leaf, - int row) - { - - JPanel renderer = (JPanel) _base.baseElements(tree,_m,value,sel,expanded,leaf,row,true); - return renderer; - } - - public boolean isCellEditable(EventObject evt) - { - if (evt instanceof MouseEvent) { - int clickCount; - // For single-click activation - clickCount = 1; - - return ((MouseEvent)evt).getClickCount() >= clickCount; - } - return true; - - } - - -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUIModel.java b/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUIModel.java deleted file mode 100644 index edfd56f..0000000 --- a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUIModel.java +++ /dev/null @@ -1,142 +0,0 @@ -package fr.orsay.lri.varna.applications.newGUI; - -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.UnsupportedFlavorException; -import java.io.File; -import java.io.FileFilter; -import java.io.FileNotFoundException; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.Collection; -import java.util.Date; -import java.util.regex.Pattern; - -import fr.orsay.lri.varna.exceptions.ExceptionExportFailed; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VARNAGUIModel implements Comparable { - private Date _lastModified; - private boolean _outOfSync = false; - private RNA _r = null; - private String _caption = ""; - private String _path = ""; - private String _folder = ""; - - - public static Date lastModif(String path) - { - return new Date(new File(path).lastModified()) ; - } - - public VARNAGUIModel(String folder, String path) - { - this(folder,path,lastModif(path)); - } - - public VARNAGUIModel(String folder, String path,Date lastModified) - { - _lastModified = lastModified; - _outOfSync = false; - _folder =folder; - _path = path; - String[] s = path.split(Pattern.quote(File.separator)); - if (s.length>0) - _caption = s[s.length-1]; - } - - public boolean hasChanged() - { - return _outOfSync; - } - - public boolean checkForModifications() - { - if (!lastModif(_path).equals(_lastModified) && !_outOfSync) - { - _outOfSync = true; - return true; - } - return false; - } - - - public RNA getRNA() - { - if (_r ==null) - { - try { - createRNA(); - } catch (ExceptionUnmatchedClosingParentheses e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionFileFormatOrSyntax e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionExportFailed e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionPermissionDenied e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionLoadingFailed e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - return _r; - } - - private RNA createRNA() throws ExceptionUnmatchedClosingParentheses, ExceptionFileFormatOrSyntax, FileNotFoundException, ExceptionExportFailed, ExceptionPermissionDenied, ExceptionLoadingFailed - { - Collection r = RNAFactory.loadSecStr(_path); - if (r.size()>0) - { - _r = r.iterator().next(); - _r.drawRNARadiate(); - } - else - { - throw new ExceptionFileFormatOrSyntax("No valid RNA defined in this file."); - } - return _r; - } - - public String toString() - { - return _caption + (this._outOfSync?"*":""); - } - - public String getID() - { - return getRNA().getID(); - } - - public String getCaption() - { - return _caption; - } - - public String getFolder() - { - return _folder; - } - - public static DataFlavor Flavor = new DataFlavor(VARNAGUIModel.class, "VARNA Object"); - - -public int compareTo(VARNAGUIModel o) { - return _caption.compareTo(o._caption); -} - - - -} diff --git a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUIRenderer.java b/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUIRenderer.java deleted file mode 100644 index 9ea6a47..0000000 --- a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUIRenderer.java +++ /dev/null @@ -1,141 +0,0 @@ -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.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.UIManager; -import javax.swing.border.Border; -import javax.swing.plaf.basic.BasicTreeUI; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; - -class VARNAGUIRenderer extends DefaultTreeCellRenderer { - - JTree _j; - VARNAGUITreeModel _m; - - private static VARNAGUIRenderer _default = new VARNAGUIRenderer(null,null); - - - - public VARNAGUIRenderer (JTree j, VARNAGUITreeModel m) - { - _j = j; - _m = m; - } - - public JComponent baseElements(JTree tree,VARNAGUITreeModel m, - Object value, boolean sel, boolean expanded, boolean leaf, - int row, boolean hasFocus) - { - JLabel initValue = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); - JPanel result = new JPanel(); - result.setLayout(new BorderLayout()); - initValue.setBorder(null); - if (hasFocus) - { - //renderer.setBackground(Color.blue); - result.setBorder(BorderFactory.createLineBorder(Color.blue)); - result.setBackground(UIManager.getColor("Tree.selectionBackground")); - initValue.setOpaque(true); - } - else - { - result.setBackground(Color.white); - result.setBorder(BorderFactory.createLineBorder(initValue.getBackground())); - - } - DefaultMutableTreeNode t = (DefaultMutableTreeNode)value; - Object o = t.getUserObject(); - if (!( o instanceof VARNAGUIModel)) - { - if (expanded) - { - initValue.setIcon(_default.getOpenIcon()); - } - else - { - initValue.setIcon(_default.getClosedIcon()); - } - result.add(initValue,BorderLayout.WEST); - JButton del = new JButton("X"); - del.addActionListener(new FolderCloses((String)o,tree,m)); - result.add(del,BorderLayout.EAST); - } - else - { - VARNAGUIModel mod = (VARNAGUIModel) o; - initValue.setIcon(_default.getLeafIcon()); - result.add(initValue,BorderLayout.WEST); - if (mod.hasChanged()) - { - JButton refresh = new JButton("Refresh"); - result.add(refresh,BorderLayout.EAST); - } - } - return result; - } - - public Component getDefaultTreeCellRendererComponent(JTree tree, - Object value, boolean sel, boolean expanded, boolean leaf, - int row, boolean hasFocus) - { - return super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus); - } - - public Component getTreeCellRendererComponent(JTree tree, - Object value, boolean sel, boolean expanded, boolean leaf, - int row, boolean hasFocus) - { - - return baseElements(tree,_m,value,sel,expanded,leaf,row,hasFocus); - } - public Dimension getPreferredSize(int row) { - Dimension size = super.getPreferredSize(); - size.width = _j.getWidth(); - System.out.println(size); - return size; - } - - -// @Override -// public void setBounds(final int x, final int y, final int width, final int height) { -// super.setBounds(x, y, Math.min(_j.getWidth()-x, width), height); -// } - - - public class FolderCloses implements ActionListener{ - String _path; - JComponent _p; - VARNAGUITreeModel _m; - - public FolderCloses(String path, JComponent p, VARNAGUITreeModel m) - { - _path = path; - _p = p; - _m = m; - } - public void actionPerformed(ActionEvent e) { - if (JOptionPane.showConfirmDialog(_p, "This folder will cease to be watched. Confirm?", "Closing folder", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION) - { - _m.removeFolder(_path); - System.out.println(_j); - _j.updateUI(); - } - } - - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUITree.java b/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUITree.java deleted file mode 100644 index 0fd2468..0000000 --- a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUITree.java +++ /dev/null @@ -1,74 +0,0 @@ -package fr.orsay.lri.varna.applications.newGUI; - -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.DragGestureListener; -import java.awt.dnd.DragGestureRecognizer; -import java.awt.dnd.DragSource; -import java.awt.dnd.MouseDragGestureRecognizer; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -import javax.swing.JComponent; -import javax.swing.JTree; -import javax.swing.plaf.basic.BasicTreeUI; -import javax.swing.tree.AbstractLayoutCache; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.TreePath; - -public class VARNAGUITree extends JTree implements MouseListener { - private Watcher _w; - - - public VARNAGUITree(VARNAGUITreeModel m) - { - super(m); - _w = new Watcher(m ); - _w.start(); - } - - public DefaultMutableTreeNode getSelectedNode() - { - TreePath t = getSelectionPath(); - if (t!= null) - { - return (DefaultMutableTreeNode) t.getLastPathComponent(); - } - return null; - } - - public void mouseClicked(MouseEvent e) { - int x = e.getX(); - int y = e.getY(); - TreePath tp = this.getPathForLocation(x, y); - if (tp!=null) - { - DefaultMutableTreeNode n = (DefaultMutableTreeNode) tp.getLastPathComponent(); - - } - } - - public void mousePressed(MouseEvent e) { - // TODO Auto-generated method stub - - } - - public void mouseReleased(MouseEvent e) { - // TODO Auto-generated method stub - - } - - public void mouseEntered(MouseEvent e) { - // TODO Auto-generated method stub - - } - - public void mouseExited(MouseEvent e) { - // TODO Auto-generated method stub - - } - - - -} diff --git a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUITreeModel.java b/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUITreeModel.java deleted file mode 100644 index e307543..0000000 --- a/src2/fr/orsay/lri/varna/applications/newGUI/VARNAGUITreeModel.java +++ /dev/null @@ -1,169 +0,0 @@ -package fr.orsay.lri.varna.applications.newGUI; - -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.PriorityQueue; -import java.util.TreeSet; - -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreePath; - -public class VARNAGUITreeModel extends DefaultTreeModel{ - - private TreeSet _folders = new TreeSet(); - private TreeSet _ids = new TreeSet(); - private Hashtable> _criterionToFiles = new Hashtable>(); - private Hashtable _criterionToNodes = new Hashtable(); - private ArrayList _fileNodes = new ArrayList(); - - public enum SORT_MODE{ - PATH, - ID - } - - private SORT_MODE _mode = SORT_MODE.PATH; - - public VARNAGUITreeModel() - { - super(new DefaultMutableTreeNode("Folders")); - } - - - public void removeFolder(String path) - { - if (_mode==SORT_MODE.PATH) - { - int pos = _folders.headSet(path).size(); - DefaultMutableTreeNode parent = (DefaultMutableTreeNode) getRoot().getChildAt(pos); - parent.removeAllChildren(); - reload(parent); - getRoot().remove(parent); - _criterionToNodes.remove(path); - _criterionToFiles.remove(path); - } - else if (_mode==SORT_MODE.ID) - { - ArrayList toBeRemoved = new ArrayList(); - for(DefaultMutableTreeNode leafNode : _fileNodes) - { - VARNAGUIModel m = (VARNAGUIModel)leafNode.getUserObject(); - if (m.getFolder().equals(path)) - { - toBeRemoved.add(leafNode); - } - } - for(DefaultMutableTreeNode leafNode : toBeRemoved) - { - _fileNodes.remove(leafNode); - DefaultMutableTreeNode parent = (DefaultMutableTreeNode) leafNode.getParent(); - parent.remove(leafNode); - } - } - _folders.remove(path); - } - - - public DefaultMutableTreeNode insertGroupNode(String crit, TreeSet t) - { - DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(crit); - DefaultMutableTreeNode parent = getRoot(); - int pos = t.headSet(crit).size(); - parent.insert(groupNode, pos); - reload(groupNode); - return groupNode; - } - - public void insertLeafNode(DefaultMutableTreeNode parent, VARNAGUIModel m, TreeSet t) - { - DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode(m); - int pos = t.headSet(m).size(); - parent.insert(leafNode, pos); - _fileNodes.add(leafNode); - } - - public DefaultMutableTreeNode addFolder(String path) - { - DefaultMutableTreeNode groupNode = null; - try { - if (!_folders.contains(path)) - { - System.out.println("Folder: "+path); - File dir = new File(path); - if (dir.isDirectory()) - { - path = dir.getCanonicalPath(); - _folders.add(path); - if (_mode==SORT_MODE.PATH) - { - System.out.println(" Adding: "+path); - groupNode = insertGroupNode(path, _folders); - _criterionToNodes.put(path,groupNode); - _criterionToFiles.put(path, new TreeSet()); - } - for(File f:dir.listFiles(_f)) - { - addFile(path,f.getCanonicalPath()); - } - } - } - } catch (IOException e) { - e.printStackTrace(); - } - return groupNode; - } - - private void addFile(String folder, String path) - { - System.out.println(" => "+path); - VARNAGUIModel m = new VARNAGUIModel(folder,path); - if (_mode==SORT_MODE.PATH) - { - addFolder(folder); - insertLeafNode(_criterionToNodes.get(folder), m, _criterionToFiles.get(folder)); - } - else if (_mode==SORT_MODE.ID) - { - String id = m.getID(); - if (!_criterionToNodes.containsKey(id)) - { - _criterionToNodes.put(id, insertGroupNode(id, _ids)); - } - insertLeafNode(_criterionToNodes.get(id), m, _criterionToFiles.get(id)); - } - } - - public DefaultMutableTreeNode getRoot() - { - return (DefaultMutableTreeNode) super.getRoot(); - } - - public ArrayList getFolders() - { - ArrayList result = new ArrayList(_folders); - return result; - } - - - FilenameFilter _f = new FilenameFilter(){ - public boolean accept(File dir, String name) { - return name.toLowerCase().endsWith(".dbn") - || name.toLowerCase().endsWith(".ct") - || name.toLowerCase().endsWith(".bpseq") - || name.toLowerCase().endsWith(".rnaml"); - }}; - - public FilenameFilter getFileNameFilter() - { - return _f; - } - - public void setFileNameFilter(FilenameFilter f) - { - _f = f; - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/newGUI/Watcher.java b/src2/fr/orsay/lri/varna/applications/newGUI/Watcher.java deleted file mode 100644 index 563b5a9..0000000 --- a/src2/fr/orsay/lri/varna/applications/newGUI/Watcher.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.orsay.lri.varna.applications.newGUI; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; - -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.RNA; - - -public class Watcher extends Thread { - - private VARNAGUITreeModel _model; - private boolean _terminated = false; - - public Watcher(VARNAGUITreeModel model) - { - _model = model; - } - - public void run() { - while (!_terminated) - { - ArrayList folders = _model.getFolders(); - for (String path: folders) - { - _model.addFolder(path); - System.out.println("Watching ["+path+"]"); - } - try { - this.sleep(1000); - } catch (InterruptedException e) { - } - } - - } - - - - - - public void finish() - { - _terminated = true; - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/Connection.java b/src2/fr/orsay/lri/varna/applications/templateEditor/Connection.java deleted file mode 100644 index 56200aa..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; - - -public class Connection { - public GraphicalTemplateElement _h1; - public GraphicalTemplateElement.RelativePosition _edge1; - public GraphicalTemplateElement _h2; - public GraphicalTemplateElement.RelativePosition _edge2; - - public Connection(GraphicalTemplateElement h1, GraphicalTemplateElement.RelativePosition edge1,GraphicalTemplateElement h2, GraphicalTemplateElement.RelativePosition edge2) - { - _h1 = h1; - _h2 = h2; - _edge1 = edge1; - _edge2 = edge2; - } - - public boolean equals( Connection c) - { - return ((_h1==c._h1)&&(_h2==c._h2)&&(_edge1==c._edge1)&&(_edge2==c._edge2)); - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/Couple.java b/src2/fr/orsay/lri/varna/applications/templateEditor/Couple.java deleted file mode 100644 index 2f60b01..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/Couple.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; - - -public class Couple { - public T first; - public U second; - private static final int HASH_PRIME = 1000003; - - - public Couple(T a, U b) - { - first = a; - second = b; - } - - public boolean equals( Object c) - { - if (!(c instanceof Couple)) - { - return false; - } - Couple cc = (Couple) c; - return (cc.first.equals(first) && (cc.second.equals(second))); - } - - public int hashCode() - { - return HASH_PRIME*first.hashCode()+second.hashCode(); - } - - public String toString() - { - return "("+first+","+second+")"; - } -} diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/GraphicalTemplateElement.java b/src2/fr/orsay/lri/varna/applications/templateEditor/GraphicalTemplateElement.java deleted file mode 100644 index 7e92960..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/GraphicalTemplateElement.java +++ /dev/null @@ -1,254 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.Shape; -import java.awt.Stroke; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; -import java.util.HashMap; - -import fr.orsay.lri.varna.exceptions.ExceptionEdgeEndpointAlreadyConnected; -import fr.orsay.lri.varna.exceptions.ExceptionInvalidRNATemplate; -import fr.orsay.lri.varna.models.templates.RNATemplate.EdgeEndPointPosition; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement.EdgeEndPoint; - -public abstract class GraphicalTemplateElement { - - public boolean _debug = false; - protected HashMap _mainColors = new HashMap(); - - public Color _dominantColor = new Color(0.5f,0.5f,0.5f,0.9f); - - public enum RelativePosition { - RP_OUTER,RP_INNER_GENERAL,RP_INNER_MOVE,RP_EDIT_START,RP_EDIT_END,RP_CONNECT_START5,RP_CONNECT_START3,RP_CONNECT_END5,RP_CONNECT_END3, - RP_EDIT_TANGENT_3,RP_EDIT_TANGENT_5; - }; - - static final Color BACKBONE_COLOR = Color.gray; - static final Color CONTROL_COLOR = Color.decode("#D0D0FF"); - static final Font NUMBER_FONT = new Font("Arial", Font.BOLD,18); - static final Color NUMBER_COLOR = Color.gray; - static final Color BASE_PAIR_COLOR = Color.blue; - static final Color BASE_COLOR = Color.gray; - static final Color BASE_FILL_COLOR = Color.white; - static final Color BASE_FILL_3_COLOR = Color.red; - static final Color BASE_FILL_5_COLOR = Color.green; - static final Color MAGNET_COLOR = CONTROL_COLOR; - - public void setDominantColor(Color c) - { - _dominantColor = c; - } - - public Color getDominantColor() - { - return _dominantColor; - } - - public abstract RelativePosition getRelativePosition(double x, double y); - - public abstract void draw(Graphics2D g2d, boolean selected); - public abstract Polygon getBoundingPolygon(); - public abstract void translate(double x, double y); - public abstract RelativePosition getClosestEdge(double x, double y); - public abstract ArrayList getConnectedEdges(); - public abstract RNATemplateElement getTemplateElement(); - public void setMainColor(RelativePosition edge,Color c) - { - _mainColors.put(edge, c); - } - - public abstract Shape getArea(); - - public void attach(GraphicalTemplateElement e, RelativePosition edgeOrig, RelativePosition edgeDest) throws ExceptionEdgeEndpointAlreadyConnected, ExceptionInvalidRNATemplate - { - _attachedElements.put(edgeOrig, new Couple(edgeDest,e)); - } - - - /** - * Same as attach(), but without touching the underlying - * RNATemplateElement objects. - * This is useful if the underlying RNATemplate already contains edges - * but not the graphical template. - */ - public void graphicalAttach(GraphicalTemplateElement e, RelativePosition edgeOrig, RelativePosition edgeDest) - { - _attachedElements.put(edgeOrig, new Couple(edgeDest,e)); - } - - public void detach(RelativePosition edge) - { - if (_attachedElements.containsKey(edge)) - { - Couple c = _attachedElements.get(edge); - _attachedElements.remove(edge); - c.second.detach(c.first); - } - } - public Couple getAttachedElement(RelativePosition localedge) - { - if (_attachedElements.containsKey(localedge)) - return _attachedElements.get(localedge); - return null; - } - public boolean hasAttachedElement(RelativePosition localedge) - { - return _attachedElements.containsKey(localedge); - } - public abstract EdgeEndPoint getEndPoint(RelativePosition r); - public abstract boolean isIn(RelativePosition r); - - public void draw(Graphics2D g2d) - { - draw(g2d,false); - } - - private HashMap> _attachedElements = new HashMap>(); - - - private Dimension getStringDimension(Graphics2D g, String s) { - FontMetrics fm = g.getFontMetrics(); - Rectangle2D r = fm.getStringBounds(s, g); - return (new Dimension((int) r.getWidth(), (int) fm.getAscent() - - fm.getDescent())); - } - - - - public void drawStringCentered(Graphics2D g2, String res, double x, - double y) { - Dimension d = getStringDimension(g2, res); - x -= (double) d.width / 2.0; - y += (double) d.height / 2.0; - if (_debug) - g2.drawRect((int) x, (int) y - d.height, d.width, d.height); - g2.drawString(res, (int) Math.round(x), (int) Math.round(y)); - } - - protected Stroke _boldStroke = new BasicStroke(2.5f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND, 3.0f); - protected Stroke _solidStroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND, 3.0f); - private float[] dash = { 5.0f, 5.0f }; - protected Stroke _dashedStroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND, 3.0f, dash, 0); - - public abstract RelativePosition getConnectedEdge(RelativePosition edge); - public abstract Point2D.Double getEdgePosition(RelativePosition edge); - public abstract void setEdgePosition(RelativePosition edge, Point2D.Double pos); - public abstract RelativePosition relativePositionFromEdgeEndPointPosition(EdgeEndPointPosition endPointPosition); - - public static boolean canConnect(GraphicalTemplateElement el1, RelativePosition e1,GraphicalTemplateElement el2, RelativePosition e2) - { - return (!el1.hasAttachedElement(e1))&&(!el2.hasAttachedElement(e2))&&(el1.isIn(e1)!=el2.isIn(e2)); - } - - - protected void drawMove(Graphics2D g2d, Point2D.Double center) - { - g2d.setStroke(_solidStroke); - g2d.setColor(CONTROL_COLOR); - g2d.fillOval((int)((center.x-Helix.MOVE_RADIUS)), (int)((center.y-Helix.MOVE_RADIUS)), (int)(2.0*Helix.MOVE_RADIUS), (int)(2.0*Helix.MOVE_RADIUS)); - g2d.setColor(BACKBONE_COLOR); - g2d.drawOval((int)((center.x-Helix.MOVE_RADIUS)), (int)((center.y-Helix.MOVE_RADIUS)), (int)(2.0*Helix.MOVE_RADIUS), (int)(2.0*Helix.MOVE_RADIUS)); - double arrowLength = Helix.MOVE_RADIUS-2.0; - double width = 3.0; - drawArrow(g2d,center,new Point2D.Double(center.x+arrowLength,center.y),width); - drawArrow(g2d,center,new Point2D.Double(center.x-arrowLength,center.y),width); - drawArrow(g2d,center,new Point2D.Double(center.x,center.y+arrowLength),width); - drawArrow(g2d,center,new Point2D.Double(center.x,center.y-arrowLength),width); - } - - protected void drawEditStart(Graphics2D g2d, Helix h, double dx,double dy,double nx,double ny) - { - Point2D.Double center = h.getCenterEditStart(); - drawEdit(g2d, center, dx,dy,nx,ny); - } - protected void drawEditEnd(Graphics2D g2d, Helix h, double dx,double dy,double nx,double ny) - { - Point2D.Double center = h.getCenterEditEnd(); - drawEdit(g2d, center, dx,dy,nx,ny); - } - - protected void drawEdit(Graphics2D g2d, Point2D.Double center, double dx,double dy,double nx,double ny) - { - g2d.setColor(CONTROL_COLOR); - g2d.fillOval((int)((center.x-Helix.EDIT_RADIUS)), (int)((center.y-Helix.EDIT_RADIUS)), (int)(2.0*Helix.EDIT_RADIUS), (int)(2.0*Helix.EDIT_RADIUS)); - g2d.setColor(BACKBONE_COLOR); - g2d.drawOval((int)((center.x-Helix.EDIT_RADIUS)), (int)((center.y-Helix.EDIT_RADIUS)), (int)(2.0*Helix.EDIT_RADIUS), (int)(2.0*Helix.EDIT_RADIUS)); - double arrowLength = Helix.EDIT_RADIUS-2.0; - double width = 3.0; - drawArrow(g2d,center,new Point2D.Double(center.x+nx*arrowLength,center.y+ny*arrowLength),width); - drawArrow(g2d,center,new Point2D.Double(center.x-nx*arrowLength,center.y-ny*arrowLength),width); - drawArrow(g2d,center,new Point2D.Double(center.x+dx*arrowLength,center.y+dy*arrowLength),width); - drawArrow(g2d,center,new Point2D.Double(center.x-dx*arrowLength,center.y-dy*arrowLength),width); - } - - protected void drawArrow(Graphics2D g2d, Point2D.Double orig, Point2D.Double dest, double width) - { - g2d.setStroke(_solidStroke); - g2d.drawLine((int)orig.x,(int)orig.y,(int)dest.x,(int)dest.y); - double dx = (orig.x-dest.x)/(orig.distance(dest)); - double dy = (orig.y-dest.y)/(orig.distance(dest)); - double nx = dy; - double ny = -dx; - g2d.drawLine((int)dest.x,(int)dest.y,(int)(dest.x-width*(-dx+nx)),(int)(dest.y-width*(-dy+ny))); - g2d.drawLine((int)dest.x,(int)dest.y,(int)(dest.x-width*(-dx-nx)),(int)(dest.y-width*(-dy-ny))); - } - - - - protected void drawAnchor(Graphics2D g2d, Point2D.Double p) - { drawAnchor(g2d,p,CONTROL_COLOR); } - - protected void drawAnchor5(Graphics2D g2d, Point2D.Double p) - { drawAnchor(g2d,p,BASE_FILL_5_COLOR); } - - protected void drawAnchor3(Graphics2D g2d, Point2D.Double p) - { drawAnchor(g2d,p,BASE_FILL_3_COLOR); } - - protected void drawAnchor(Graphics2D g2d, Point2D.Double p, Color c) - { - g2d.setColor(c); - g2d.fillOval((int)(p.x-Helix.EDGE_BASE_RADIUS),(int)(p.y-Helix.EDGE_BASE_RADIUS),(int)(2.0*Helix.EDGE_BASE_RADIUS),(int)(2.0*Helix.EDGE_BASE_RADIUS)); - g2d.setColor(BASE_COLOR); - g2d.drawOval((int)(p.x-Helix.EDGE_BASE_RADIUS),(int)(p.y-Helix.EDGE_BASE_RADIUS),(int)(2.0*Helix.EDGE_BASE_RADIUS),(int)(2.0*Helix.EDGE_BASE_RADIUS)); - - } - - protected void drawMagnet(Graphics2D g2d, Point2D.Double p) - { - drawAnchor(g2d, p, MAGNET_COLOR); - g2d.setColor(BASE_COLOR); - g2d.drawOval((int)(p.x-Helix.EDGE_BASE_RADIUS),(int)(p.y-Helix.EDGE_BASE_RADIUS),(int)(2.0*Helix.EDGE_BASE_RADIUS),(int)(2.0*Helix.EDGE_BASE_RADIUS)); - g2d.drawOval((int)(p.x-2),(int)(p.y-2),(int)(2.0*2),(int)(2.0*2)); - - } - - - - protected void drawBase(Graphics2D g2d, Point2D.Double p) - { - g2d.setColor(BASE_FILL_COLOR); - g2d.fillOval((int)(p.x-Helix.BASE_RADIUS),(int)(p.y-Helix.BASE_RADIUS),(int)(2.0*Helix.BASE_RADIUS),(int)(2.0*Helix.BASE_RADIUS)); - g2d.setColor(BASE_COLOR); - g2d.drawOval((int)(p.x-Helix.BASE_RADIUS),(int)(p.y-Helix.BASE_RADIUS),(int)(2.0*Helix.BASE_RADIUS),(int)(2.0*Helix.BASE_RADIUS)); - } - - public boolean equals(Object b) - { - if (b instanceof GraphicalTemplateElement) - { - return b==this; - } - else - return false; - } - -} diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/Helix.java b/src2/fr/orsay/lri/varna/applications/templateEditor/Helix.java deleted file mode 100644 index 4c81bed..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/Helix.java +++ /dev/null @@ -1,687 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; - -import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.Shape; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import fr.orsay.lri.varna.exceptions.ExceptionInvalidRNATemplate; -import fr.orsay.lri.varna.models.rna.RNA; -import fr.orsay.lri.varna.models.templates.RNATemplate; -import fr.orsay.lri.varna.models.templates.RNATemplate.EdgeEndPointPosition; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateHelix; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement.EdgeEndPoint; - - -public class Helix extends GraphicalTemplateElement{ - - RNATemplateHelix _h; - - public Helix(double x, double y, RNATemplate tmp, List existingRNAElements) - { - this(x,y,getNextAutomaticCaption(existingRNAElements),tmp); - } - - public Helix(double x, double y, String cap, RNATemplate tmp) - { - _h = tmp.new RNATemplateHelix(cap); - _h.setStartPosition(new Point2D.Double(x,y)); - _h.setEndPosition(new Point2D.Double(x,y)); - _h.setLength(1); - _h.setCaption(cap); - } - - public Helix(RNATemplateHelix templateHelix) { - _h = templateHelix; - } - - - private static String getNextAutomaticCaption(List existingRNAElements) { - // Find which captions are already used - Set captions = new HashSet(); - for (GraphicalTemplateElement element: existingRNAElements) { - if (element instanceof Helix) { - Helix helix = (Helix) element; - if (helix.getCaption() != null) { - captions.add(helix.getCaption()); - } - } - } - // Find a non-conflicting name for this helix - for (int i=1;;i++) { - String candidateCaption = "H" + i; - if (! captions.contains(candidateCaption)) { - return candidateCaption; - } - } - } - - public void toggleFlipped() - { - _h.setFlipped(!_h.isFlipped()); - updateAttachedUnpairedRegions(); - } - - - /** - * When an helix is moved/resized/etc... it is necessary to update - * the positions of endpoints from unpaired regions that are attached - * to the helix. This function updates the endpoints positions of - * attached unpaired regions. - */ - public void updateAttachedUnpairedRegions() { - for (RelativePosition rpos: getConnectedEdges()) { - Couple c = getAttachedElement(rpos); - if (c != null && c.second instanceof UnpairedRegion) { - UnpairedRegion unpairedRegion = (UnpairedRegion) c.second; - Point2D.Double pos = getEdgePosition(rpos); - if (c.first == RelativePosition.RP_CONNECT_START5) { - unpairedRegion.setEdge5(pos); - } else if (c.first == RelativePosition.RP_CONNECT_END3) { - unpairedRegion.setEdge3(pos); - } - } - } - } - - public double getPosX() - { - return _h.getStartPosition().x; - } - - public String getCaption() - { - return _h.getCaption(); - } - - public double getPosY() - { - return _h.getStartPosition().y; - } - - public RNATemplateHelix getTemplateElement() - { - return _h; - } - - public void setX(double x) - { - _h.getStartPosition().x = x; - } - - public void setY(double y) - { - _h.getStartPosition().y = y; - } - - public void setPos(Point2D.Double p) - { - _h.setStartPosition(p); - updateLength(); - } - - public void setPos(double x, double y) - { - setPos(new Point2D.Double(x,y)); - } - - public Point2D.Double getPos() - { - return _h.getStartPosition(); - } - - public void moveCenter(double x, double y) - { - Point2D.Double center = new Point2D.Double((_h.getStartPosition().x+_h.getEndPosition().x)/2.0,(_h.getStartPosition().y+_h.getEndPosition().y)/2.0); - double dx = x-center.x; - double dy = y-center.y; - _h.setStartPosition(new Point2D.Double(_h.getStartPosition().x+dx,_h.getStartPosition().y+dy)); - _h.setEndPosition(new Point2D.Double(_h.getEndPosition().x+dx,_h.getEndPosition().y+dy)); - } - - - public void setExtent(double x, double y) - { - setExtent(new Point2D.Double(x,y)); - } - - private void updateLength() - { - _h.setLength(getNbBP()); - } - - public void setExtent(Point2D.Double p) - { - _h.setEndPosition(p); - updateLength(); - } - - public double getExtentX() - { - return _h.getEndPosition().x; - } - - public Point2D.Double getExtent() - { - return _h.getEndPosition(); - } - - public double getExtentY() - { - return _h.getEndPosition().y; - } - - public static final double BASE_PAIR_DISTANCE = RNA.BASE_PAIR_DISTANCE; - public static final double LOOP_DISTANCE = RNA.LOOP_DISTANCE; - public static final double SELECTION_RADIUS = 15.0; - - - - - public Point2D.Double getAbsStart5() - { - double dx = (_h.getStartPosition().x-_h.getEndPosition().x)/(_h.getStartPosition().distance(_h.getEndPosition())); - double dy = (_h.getStartPosition().y-_h.getEndPosition().y)/(_h.getStartPosition().distance(_h.getEndPosition())); - double nx = dy; - double ny = -dx; - Point2D.Double start5 = new Point2D.Double((getPosX()-Helix.BASE_PAIR_DISTANCE*nx/2.0),(getPosY()-Helix.BASE_PAIR_DISTANCE*ny/2.0)); - return start5; - } - - public Point2D.Double getAbsStart3() - { - double dx = (_h.getStartPosition().x-_h.getEndPosition().x)/(_h.getStartPosition().distance(_h.getEndPosition())); - double dy = (_h.getStartPosition().y-_h.getEndPosition().y)/(_h.getStartPosition().distance(_h.getEndPosition())); - double nx = dy; - double ny = -dx; - Point2D.Double start3 = new Point2D.Double((getPosX()+Helix.BASE_PAIR_DISTANCE*nx/2.0),(getPosY()+Helix.BASE_PAIR_DISTANCE*ny/2.0)); - return start3; - } - - public Point2D.Double getAbsEnd5() - { - double dx = (_h.getStartPosition().x-_h.getEndPosition().x)/(_h.getStartPosition().distance(_h.getEndPosition())); - double dy = (_h.getStartPosition().y-_h.getEndPosition().y)/(_h.getStartPosition().distance(_h.getEndPosition())); - double nx = dy; - double ny = -dx; - Point2D.Double end5 = new Point2D.Double((getExtentX()-Helix.BASE_PAIR_DISTANCE*nx/2.0),(getExtentY()-Helix.BASE_PAIR_DISTANCE*ny/2.0)); - return end5; - } - - public Point2D.Double getAbsEnd3() - { - double dx = (_h.getStartPosition().x-_h.getEndPosition().x)/(_h.getStartPosition().distance(_h.getEndPosition())); - double dy = (_h.getStartPosition().y-_h.getEndPosition().y)/(_h.getStartPosition().distance(_h.getEndPosition())); - double nx = dy; - double ny = -dx; - Point2D.Double end3 = new Point2D.Double((getExtentX()+Helix.BASE_PAIR_DISTANCE*nx/2.0),(getExtentY()+Helix.BASE_PAIR_DISTANCE*ny/2.0)); - return end3; - } - - public Point2D.Double getStart5() - { - if (_h.isFlipped()) - return getAbsStart3(); - else - return getAbsStart5(); - - } - - public Point2D.Double getStart3() - { - if (_h.isFlipped()) - return getAbsStart5(); - else - return getAbsStart3(); - } - - public Point2D.Double getEnd5() - { - if (_h.isFlipped()) - return getAbsEnd3(); - else - return getAbsEnd5(); - } - - public Point2D.Double getEnd3() - { - if (_h.isFlipped()) - return getAbsEnd5(); - else - return getAbsEnd3(); - } - - public Polygon getBoundingPolygon() - { - double dx = (_h.getStartPosition().x-_h.getEndPosition().x)/(_h.getStartPosition().distance(_h.getEndPosition())); - double dy = (_h.getStartPosition().y-_h.getEndPosition().y)/(_h.getStartPosition().distance(_h.getEndPosition())); - double nx = dy; - double ny = -dx; - Point2D.Double start5 = new Point2D.Double((getPosX()+Helix.BASE_PAIR_DISTANCE*nx/2.0),(getPosY()+Helix.BASE_PAIR_DISTANCE*ny/2.0)); - Point2D.Double end5 = new Point2D.Double((getExtentX()+Helix.BASE_PAIR_DISTANCE*nx/2.0),(getExtentY()+Helix.BASE_PAIR_DISTANCE*ny/2.0)); - Point2D.Double start3 = new Point2D.Double((getPosX()-Helix.BASE_PAIR_DISTANCE*nx/2.0),(getPosY()-Helix.BASE_PAIR_DISTANCE*ny/2.0)); - Point2D.Double end3 = new Point2D.Double((getExtentX()-Helix.BASE_PAIR_DISTANCE*nx/2.0),(getExtentY()-Helix.BASE_PAIR_DISTANCE*ny/2.0)); - Polygon p = new Polygon(); - p.addPoint((int)start5.x, (int)start5.y); - p.addPoint((int)end5.x, (int)end5.y); - p.addPoint((int)end3.x, (int)end3.y); - p.addPoint((int)start3.x, (int)start3.y); - return p; - } - - - public Point2D.Double getCenter() - { - return new Point2D.Double((int)((_h.getStartPosition().x+_h.getEndPosition().x)/2.0), - (int)((_h.getStartPosition().y+_h.getEndPosition().y)/2.0)); - } - - - public Point2D.Double getCenterEditStart() - { - double dist = _h.getStartPosition().distance(_h.getEndPosition()); - double dx = (_h.getEndPosition().x-_h.getStartPosition().x)/(dist); - double dy = (_h.getEndPosition().y-_h.getStartPosition().y)/(dist); - return new Point2D.Double((int)(_h.getStartPosition().x+(dist-10.0)*dx), - (int)(_h.getStartPosition().y+(dist-10.0)*dy)); - } - - public Point2D.Double getCenterEditEnd() - { - double dist = _h.getStartPosition().distance(_h.getEndPosition()); - double dx = (_h.getEndPosition().x-_h.getStartPosition().x)/(dist); - double dy = (_h.getEndPosition().y-_h.getStartPosition().y)/(dist); - return new Point2D.Double((int)(_h.getStartPosition().x+(10.0)*dx), - (int)(_h.getStartPosition().y+(10.0)*dy)); - } - - - public Shape getSelectionBox() - { - double dx = (_h.getStartPosition().x-_h.getEndPosition().x)/(_h.getStartPosition().distance(_h.getEndPosition())); - double dy = (_h.getStartPosition().y-_h.getEndPosition().y)/(_h.getStartPosition().distance(_h.getEndPosition())); - double nx = dy; - double ny = -dx; - Polygon hbox = getBoundingPolygon(); - Polygon p = new Polygon(); - Point2D.Double start5 = new Point2D.Double(hbox.xpoints[0]+SELECTION_RADIUS*(dx+nx),hbox.ypoints[0]+SELECTION_RADIUS*(dy+ny)); - Point2D.Double end5 = new Point2D.Double(hbox.xpoints[1]+SELECTION_RADIUS*(-dx+nx),hbox.ypoints[1]+SELECTION_RADIUS*(-dy+ny)); - Point2D.Double end3 = new Point2D.Double(hbox.xpoints[2]+SELECTION_RADIUS*(-dx-nx),hbox.ypoints[2]+SELECTION_RADIUS*(-dy-ny));; - Point2D.Double start3 = new Point2D.Double(hbox.xpoints[3]+SELECTION_RADIUS*(dx-nx),hbox.ypoints[3]+SELECTION_RADIUS*(dy-ny));; - p.addPoint((int)start5.x, (int)start5.y); - p.addPoint((int)end5.x, (int)end5.y); - p.addPoint((int)end3.x, (int)end3.y); - p.addPoint((int)start3.x, (int)start3.y); - return p; - } - - public Shape getArea() - { - return getSelectionBox(); - } - - - public static final double EDIT_RADIUS = 10.0; - public static final double MOVE_RADIUS = 13.0; - public static final double BASE_RADIUS = 8.0; - public static final double EDGE_BASE_RADIUS = 7.0; - - - public RelativePosition getRelativePosition(double x, double y) - { - Point2D.Double current = new Point2D.Double(x,y); - Shape p = getSelectionBox(); - if (p.contains(current)) - { - if (getCenterEditStart().distance(current) getConnectedEdges() { - ArrayList result = new ArrayList(); - result.add(RelativePosition.RP_CONNECT_START5); - result.add(RelativePosition.RP_CONNECT_START3); - result.add(RelativePosition.RP_CONNECT_END5); - result.add(RelativePosition.RP_CONNECT_END3); - return result; - } - - public String toString() - { - return "Helix " + getCaption(); - } - - public RelativePosition relativePositionFromEdgeEndPointPosition( - EdgeEndPointPosition pos) { - switch (pos) { - case IN1: - return RelativePosition.RP_CONNECT_START5; - case OUT1: - return RelativePosition.RP_CONNECT_END5; - case IN2: - return RelativePosition.RP_CONNECT_END3; - case OUT2: - return RelativePosition.RP_CONNECT_START3; - default: - return null; - } - } - -} - diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/MouseControler.java b/src2/fr/orsay/lri/varna/applications/templateEditor/MouseControler.java deleted file mode 100644 index 5eb3e5d..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/MouseControler.java +++ /dev/null @@ -1,345 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; - -import java.awt.Point; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; -import java.awt.geom.Point2D; - - - -public class MouseControler implements MouseListener, MouseMotionListener, MouseWheelListener { - - private int _granularity = 8; - private final int HYSTERESIS_DISTANCE = 10; - TemplatePanel _sp; - GraphicalTemplateElement _elem; - TemplateEditorPanelUI _ui; - private GraphicalTemplateElement.RelativePosition _currentMode = Helix.RelativePosition.RP_OUTER; - private boolean movingView = false; - private Point2D.Double _clickedPos = new Point2D.Double(); - private Point _clickedPosScreen = new Point(); - - public MouseControler(TemplatePanel sp, TemplateEditorPanelUI ui) - { - _sp = sp; - _elem = null; - _ui = ui; - } - - public void mouseWheelMoved(MouseWheelEvent e) { - if (e.getWheelRotation() == -1) { - _sp.zoomIn(); - } - else { - _sp.zoomOut(); - } - e.consume(); - } - - - public void mouseClicked(MouseEvent arg0) { - } - - public void mouseEntered(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mouseExited(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - - - /** - * Get mouse position in logical coordinates, ie. those used in the template XML file. - * It differs from the screen coordinates relative to panel because of the scaling factor. - */ - public Point2D.Double getLogicalMouseCoords(MouseEvent event) { - return new Point2D.Double(event.getX()/_sp.getScaleFactor(), event.getY()/_sp.getScaleFactor()); - } - - public void mousePressed(MouseEvent arg0) { - movingView = false; - _clickedPos = new Point2D.Double(arg0.getX(), arg0.getY()); - _clickedPosScreen.x = arg0.getXOnScreen(); - _clickedPosScreen.y = arg0.getYOnScreen(); - - // middle-click - if (arg0.getButton() == MouseEvent.BUTTON2) { - movingView = true; - - } else { - - Point2D.Double logicalMousePos = getLogicalMouseCoords(arg0); - GraphicalTemplateElement elem = _sp.getElementAt(logicalMousePos.getX(), logicalMousePos.getY()); - _sp.Unselect(); - - if (elem==null) - { - if (arg0.getButton()==MouseEvent.BUTTON1 - && _ui.getSelectedTool() == TemplateEditorPanelUI.Tool.CREATE_HELIX) - { - _currentMode = Helix.RelativePosition.RP_EDIT_START; - } - else if ((arg0.getButton()==MouseEvent.BUTTON1 - && _ui.getSelectedTool() == TemplateEditorPanelUI.Tool.CREATE_UNPAIRED)) - { - // Create a new unpaired region - UnpairedRegion n = new UnpairedRegion(logicalMousePos.getX(),logicalMousePos.getY(),_sp.getTemplate()); - n.setDominantColor(_sp.nextBackgroundColor()); - _ui.addElementUI(n); - _sp.setSelected(n); - _sp.repaint(); - _elem = n; - _currentMode = GraphicalTemplateElement.RelativePosition.RP_EDIT_START; - } - } - else if (arg0.getButton()==MouseEvent.BUTTON1) - { - _currentMode = elem.getRelativePosition(logicalMousePos.getX(), logicalMousePos.getY()); - _sp.setSelected(elem); - _elem = elem; - switch (_currentMode) - { - case RP_EDIT_START: - case RP_EDIT_END: - case RP_EDIT_TANGENT_5: - case RP_EDIT_TANGENT_3: - break; - case RP_INNER_MOVE: - break; - case RP_INNER_GENERAL: - _currentMode = Helix.RelativePosition.RP_INNER_MOVE; - break; - case RP_CONNECT_END3: - case RP_CONNECT_END5: - case RP_CONNECT_START5: - case RP_CONNECT_START3: - { - Couple al = _sp.getPartner(elem, _currentMode); - boolean isConnected = (al!=null); - if (isConnected) - { - Connection c = _sp.getConnection(elem, _currentMode); - _ui.removeConnectionUI(c); - GraphicalTemplateElement p1 = c._h1; - GraphicalTemplateElement p2 = c._h2; - boolean p1IsHelix = (p1 instanceof Helix); - boolean p1IsUnpaired = (p1 instanceof UnpairedRegion); - boolean p2IsHelix = (p2 instanceof Helix); - boolean p2IsUnpaired = (p2 instanceof UnpairedRegion); - boolean p1StillAttached = (p1 == elem); - - if ((p1IsUnpaired && p2IsHelix)) - { - p1StillAttached = false; - } - if (p1StillAttached) - { - _elem = p2; - _currentMode = c._edge2; - } - else if (!p1StillAttached) - { - _elem=p1; - _currentMode = c._edge1; - } - - } - if (_elem instanceof Helix) - { - _sp.setPointerPos(new Point2D.Double(logicalMousePos.getX(),logicalMousePos.getY())); - _sp.setSelectedEdge(_currentMode); - } - _sp.setSelected(_elem); - } - break; - case RP_OUTER: - _sp.Unselect(); - _elem = null; - } - _sp.repaint(); - } - } - } - - public void mouseReleased(MouseEvent arg0) { - movingView = false; - Point2D.Double logicalMousePos = getLogicalMouseCoords(arg0); - if (_elem!=null) - { - switch (_currentMode) - { - case RP_EDIT_START: - case RP_EDIT_END: - { - if (_elem instanceof Helix) - { - Helix h = (Helix) _elem; - if (h.getPos().distance(h.getExtent())<10.0) - { - _ui.removeElementUI(_elem); - _sp.Unselect(); - } - } - } - break; - case RP_INNER_MOVE: - break; - case RP_CONNECT_END3: - case RP_CONNECT_END5: - case RP_CONNECT_START5: - case RP_CONNECT_START3: - { - GraphicalTemplateElement t = _sp.getElementAt(logicalMousePos.getX(), logicalMousePos.getY(),_elem); - if (t!=null) - { - GraphicalTemplateElement.RelativePosition edge = t.getClosestEdge(logicalMousePos.getX(), logicalMousePos.getY()); - _ui.addConnectionUI(_elem,_currentMode,t,edge); - } - _sp.setSelectedEdge(Helix.RelativePosition.RP_OUTER); - } - break; - } - _elem = null; - _sp.rescale(); - } - _sp.setSelectedEdge(Helix.RelativePosition.RP_OUTER); - _currentMode = Helix.RelativePosition.RP_OUTER; - _sp.repaint(); - } - - - private Point2D.Double projectPoint(double x, double y, Point2D.Double ref) - { - Point2D.Double result = new Point2D.Double(); - double nx = x-ref.x; - double ny = y-ref.y; - double tmp = Double.MIN_VALUE; - for (int i=0;i tmp) - { - tmp = norm; - result.x = ref.x+dx*norm; - result.y = ref.y+dy*norm; - } - } - return result; - } - - public void mouseDragged(MouseEvent arg0) - { - if (movingView) { - Point trans = new Point( - arg0.getXOnScreen() - _clickedPosScreen.x, - arg0.getYOnScreen() - _clickedPosScreen.y); - _sp.translateView(trans); - _clickedPosScreen.x = arg0.getXOnScreen(); - _clickedPosScreen.y = arg0.getYOnScreen(); - } else { - Point2D.Double logicalMousePos = getLogicalMouseCoords(arg0); - if (_elem == null) - { - switch (_currentMode) - { - case RP_EDIT_START: - { - if (_clickedPos.distance(arg0.getX(),arg0.getY())>HYSTERESIS_DISTANCE) - { - System.out.println("Creating Helix..."); - Helix h1 = new Helix(logicalMousePos.getX(),logicalMousePos.getY(),_sp.getTemplate(),_sp.getRNAComponents()); - h1.setDominantColor(_sp.nextBackgroundColor()); - _ui.addElementUI(h1); - _sp.setSelected(h1); - _sp.repaint(); - _elem = h1; - } - } - break; - - } - } - else - { - if (_elem instanceof Helix) - { - Helix h = (Helix) _elem; - switch (_currentMode) - { - case RP_EDIT_START: - { - Point2D.Double d = projectPoint(logicalMousePos.getX(),logicalMousePos.getY(),h.getPos()); - _ui.setHelixExtentUI(h, d.x,d.y); - } - break; - case RP_EDIT_END: - { - Point2D.Double d = projectPoint( logicalMousePos.getX(),logicalMousePos.getY(),h.getExtent()); - _ui.setHelixPosUI(h, d.x,d.y); - } - break; - case RP_INNER_MOVE: - _ui.moveHelixUI(h, logicalMousePos.getX(),logicalMousePos.getY()); - break; - case RP_CONNECT_END3: - case RP_CONNECT_END5: - case RP_CONNECT_START5: - case RP_CONNECT_START3: - _sp.setPointerPos(new Point2D.Double(logicalMousePos.getX(),logicalMousePos.getY())); - _sp.repaint(); - break; - } - } - else if (_elem instanceof UnpairedRegion) - { - UnpairedRegion ur = (UnpairedRegion) _elem; - Point2D.Double p = new Point2D.Double(logicalMousePos.getX(),logicalMousePos.getY()); - switch (_currentMode) - { - case RP_EDIT_TANGENT_5: - { - _ui.setEdge5TangentUI(ur,logicalMousePos.getX(),logicalMousePos.getY()); - _sp.repaint(); - break; - } - case RP_EDIT_TANGENT_3: - { - _ui.setEdge3TangentUI(ur,logicalMousePos.getX(),logicalMousePos.getY()); - _sp.repaint(); - break; - } - case RP_INNER_MOVE: - { - _ui.moveUnpairedUI(ur,logicalMousePos.getX(),logicalMousePos.getY()); - _sp.repaint(); - break; - } - case RP_CONNECT_START5: - _ui.setEdge5UI(ur,logicalMousePos.getX(),logicalMousePos.getY()); - break; - case RP_CONNECT_END3: - _ui.setEdge3UI(ur,logicalMousePos.getX(),logicalMousePos.getY()); - break; - } - _sp.repaint(); - } - } - } - } - - public void mouseMoved(MouseEvent arg0) { - // TODO Auto-generated method stub - - } -} diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEditor.java b/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEditor.java deleted file mode 100644 index fe60aae..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEditor.java +++ /dev/null @@ -1,577 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.ComponentOrientation; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.GridLayout; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; -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.KeyEvent; -import java.awt.event.KeyListener; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.BoxLayout; -import javax.swing.ButtonGroup; -import javax.swing.Icon; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JDialog; -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.JToggleButton; -import javax.swing.JToolBar; -import javax.swing.UIManager; -import javax.swing.UIManager.LookAndFeelInfo; -import javax.swing.filechooser.FileFilter; -import javax.swing.undo.UndoManager; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.applications.FileNameExtensionFilter; -import fr.orsay.lri.varna.exceptions.ExceptionInvalidRNATemplate; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionXMLGeneration; -import fr.orsay.lri.varna.models.templates.Benchmark; -import fr.orsay.lri.varna.models.templates.DrawRNATemplateCurveMethod; -import fr.orsay.lri.varna.models.templates.DrawRNATemplateMethod; -import fr.orsay.lri.varna.models.templates.RNATemplate; -import fr.orsay.lri.varna.models.templates.RNATemplateDrawingAlgorithmException; -import fr.orsay.lri.varna.models.templates.RNATemplateMapping; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement; - - - - -public class TemplateEditor extends JFrame implements KeyListener, ActionListener,DropTargetListener { - - private TemplatePanel _sk; - private VARNAPanel _vp; - private File currentFilePath = null; - private JButton saveButton; - private JScrollPane jp; - private UndoManager manager; - private JButton flipButton; - private JComboBox ellipseMethodList; - private JComboBox applyMethodList; - /*private JRadioButton ellipseButtons[]; - private JRadioButton methodButtons[]; - */ - - - public TemplateEditor() - { - init(); - clearCurrentFilePath(); - } - - public JScrollPane getJp() { - return jp; - } - - private void init() - { - try { - _vp = new VARNAPanel(" ","."); - } catch (ExceptionNonEqualLength e) { - e.printStackTrace(); - } - _vp.setNumPeriod(0); - JPanel p = new JPanel(); - p.setLayout(new GridLayout(1,2)); - - JToolBar systemBar = new JToolBar(); - JToolBar optionsBar = new JToolBar(); - JButton newButton = new JButton("New",UIManager.getIcon("FileView.fileIcon")); - newButton.setActionCommand("new"); - newButton.addActionListener(this); - newButton.addKeyListener(this); - JButton loadButton = new JButton("Open...",UIManager.getIcon("FileView.directoryIcon")); - loadButton.setActionCommand("open"); - loadButton.addActionListener(this); - loadButton.addKeyListener(this); - saveButton = new JButton("Save",UIManager.getIcon("FileView.floppyDriveIcon")); - saveButton.setActionCommand("save"); - saveButton.addActionListener(this); - saveButton.addKeyListener(this); - saveButton.setEnabled(false); - JButton saveAsButton = new JButton("Save As...",UIManager.getIcon("FileView.floppyDriveIcon")); - saveAsButton.setActionCommand("save as"); - saveAsButton.addActionListener(this); - saveAsButton.addKeyListener(this); - JButton undoButton = new JButton("Undo"); - undoButton.setActionCommand("undo"); - undoButton.addActionListener(this); - undoButton.addKeyListener(this); - JButton redoButton = new JButton("Redo"); - redoButton.setActionCommand("redo"); - redoButton.addActionListener(this); - redoButton.addKeyListener(this); - - JButton benchmarkButton = new JButton("Benchmark"); - benchmarkButton.setActionCommand("benchmark"); - benchmarkButton.addActionListener(this); - benchmarkButton.addKeyListener(this); - - DrawRNATemplateMethod applyMethods[] = DrawRNATemplateMethod.values(); - applyMethodList = new JComboBox(applyMethods); - applyMethodList.setSelectedItem(DrawRNATemplateMethod.getDefault()); - - DrawRNATemplateCurveMethod ellipseMethods[] = DrawRNATemplateCurveMethod.values(); - ellipseMethodList = new JComboBox(ellipseMethods); - ellipseMethodList.setSelectedItem(DrawRNATemplateCurveMethod.getDefault()); - - JButton applyButton = new JButton("Apply"); - applyButton.setActionCommand("apply"); - applyButton.addActionListener(this); - applyButton.addKeyListener(this); - - JButton retrieveButton = new JButton("Retrieve Templates"); - retrieveButton.setActionCommand("retrieve"); - retrieveButton.addActionListener(this); - - - flipButton = new JButton("Flip helix"); - flipButton.setActionCommand("flip"); - flipButton.addActionListener(this); - flipButton.addKeyListener(this); - flipButton.setEnabled(false); - - - systemBar.add(newButton); - systemBar.add(loadButton); - systemBar.add(saveButton); - systemBar.add(saveAsButton); - systemBar.addSeparator(); - - systemBar.addSeparator(); - systemBar.addSeparator(); - systemBar.add(benchmarkButton); - systemBar.addKeyListener(this); - - optionsBar.setLayout(new FlowLayout(FlowLayout.LEFT)); - optionsBar.add(new JLabel("Single-Stranded ")); - optionsBar.add(this.ellipseMethodList); - optionsBar.addSeparator(); - optionsBar.add(new JLabel("Layout ")); - optionsBar.add(this.applyMethodList); - optionsBar.addSeparator(); - optionsBar.add(applyButton); - optionsBar.addSeparator(); - optionsBar.add(retrieveButton); - optionsBar.doLayout(); - - /*optionsBar.add(new JLabel("Curves:")); - for (int i=0; i res = new ArrayList(); - String s = b.readLine(); - while(s!=null) - { - res.add(s); - s = b.readLine(); - } - } catch (MalformedURLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } -} diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEditorPanelUI.java b/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEditorPanelUI.java deleted file mode 100644 index 9a7725e..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEditorPanelUI.java +++ /dev/null @@ -1,112 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; - -import java.awt.geom.Point2D; - -import javax.swing.undo.UndoManager; -import javax.swing.undo.UndoableEditSupport; - -import fr.orsay.lri.varna.applications.templateEditor.GraphicalTemplateElement.RelativePosition; -import fr.orsay.lri.varna.models.templates.RNATemplate; - -public class TemplateEditorPanelUI { - - private UndoableEditSupport _undoableEditSupport; - private TemplatePanel _tp; - private Tool selectedTool = Tool.CREATE_HELIX; - - - - public enum Tool { - SELECT, CREATE_HELIX, CREATE_UNPAIRED - } - - public TemplateEditorPanelUI(TemplatePanel tp) - { - _tp = tp; - _undoableEditSupport = new UndoableEditSupport(tp); - } - - public Tool getSelectedTool() { - return selectedTool; - } - - public void setSelectedTool(Tool selectedTool) { - this.selectedTool = selectedTool; - } - - /* Generic undoable event firing for edge movement */ - public void undoableEdgeMove(GraphicalTemplateElement h, GraphicalTemplateElement.RelativePosition edge,double nx, double ny) - { - _undoableEditSupport.postEdit(new TemplateEdits.ElementEdgeMoveTemplateEdit( h,edge,nx,ny,_tp)); - h.setEdgePosition(edge, new Point2D.Double(nx,ny)); - _tp.repaint(); - } - - public void setEdge5UI(GraphicalTemplateElement h, double nx, double ny) - { undoableEdgeMove(h,GraphicalTemplateElement.RelativePosition.RP_CONNECT_START5, nx,ny); } - public void setEdge3UI(UnpairedRegion h, double nx, double ny) - { undoableEdgeMove(h,GraphicalTemplateElement.RelativePosition.RP_CONNECT_END3, nx,ny); } - public void setEdge5TangentUI(UnpairedRegion h, double nx, double ny) - { undoableEdgeMove(h,GraphicalTemplateElement.RelativePosition.RP_EDIT_TANGENT_5, nx,ny); } - public void setEdge3TangentUI(UnpairedRegion h, double nx, double ny) - { undoableEdgeMove(h,GraphicalTemplateElement.RelativePosition.RP_EDIT_TANGENT_3, nx,ny); } - public void moveUnpairedUI(UnpairedRegion u, double nx, double ny) - { undoableEdgeMove(u,GraphicalTemplateElement.RelativePosition.RP_INNER_MOVE, nx,ny); } - public void moveHelixUI(Helix h, double nx, double ny) - { undoableEdgeMove(h,GraphicalTemplateElement.RelativePosition.RP_INNER_MOVE, nx,ny); } - public void setHelixPosUI(Helix h, double nx, double ny) - { undoableEdgeMove(h,GraphicalTemplateElement.RelativePosition.RP_EDIT_START, nx,ny); } - public void setHelixExtentUI(Helix h, double nx, double ny) - { undoableEdgeMove(h,GraphicalTemplateElement.RelativePosition.RP_EDIT_END, nx,ny); } - - - public void addElementUI(GraphicalTemplateElement h) - { - _undoableEditSupport.postEdit(new TemplateEdits.ElementAddTemplateEdit( h,_tp)); - _tp.addElement(h); - } - - public void removeElementUI(GraphicalTemplateElement h) - { - _undoableEditSupport.postEdit(new TemplateEdits.ElementRemoveTemplateEdit( h,_tp)); - _tp.removeElement(h); - } - - - public void addUndoableEditListener(UndoManager manager) - { - _undoableEditSupport.addUndoableEditListener(manager); - } - - public void addConnectionUI(GraphicalTemplateElement h1, - GraphicalTemplateElement.RelativePosition e1, - GraphicalTemplateElement h2, - GraphicalTemplateElement.RelativePosition e2) - { - if (GraphicalTemplateElement.canConnect(h1, e1,h2, e2)) - { - Connection c = _tp.addConnection(h1,e1,h2,e2); - _undoableEditSupport.postEdit(new TemplateEdits.ElementAttachTemplateEdit(c,_tp)); - } - } - - public void removeConnectionUI(Connection c) - { - _undoableEditSupport.postEdit(new TemplateEdits.ElementDetachTemplateEdit(c,_tp)); - _tp.removeConnection(c); - } - - public void flipHelixUI(Helix h) - { - _undoableEditSupport.postEdit(new TemplateEdits.HelixFlipTemplateEdit(h,_tp)); - _tp.flip(h); - _tp.repaint(); - } - - public RNATemplate getTemplate() - { - return _tp.getTemplate(); - } - - -} diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEdits.java b/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEdits.java deleted file mode 100644 index d086989..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/TemplateEdits.java +++ /dev/null @@ -1,174 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; - -import java.awt.geom.Point2D; - -import javax.swing.undo.AbstractUndoableEdit; -import javax.swing.undo.CannotRedoException; -import javax.swing.undo.CannotUndoException; -import javax.swing.undo.UndoableEdit; - -public class TemplateEdits { - public static final double MAX_DISTANCE= 15.0; - - public static class ElementAddTemplateEdit extends AbstractUndoableEdit - { - private GraphicalTemplateElement _h; - private TemplatePanel _p; - public ElementAddTemplateEdit(GraphicalTemplateElement h,TemplatePanel p) - { - _h = h; - _p = p; - } - public void undo() throws CannotUndoException { - _p.removeElement(_h); - _p.repaint(); - } - public void redo() throws CannotRedoException { - _p.addElement(_h); - _p.repaint(); - } - public boolean canUndo() { return true; } - public boolean canRedo() { return true; } - public String getPresentationName() { return "Graphical element added"; } - }; - public static class ElementRemoveTemplateEdit extends AbstractUndoableEdit - { - private GraphicalTemplateElement _h; - private TemplatePanel _p; - public ElementRemoveTemplateEdit(GraphicalTemplateElement h,TemplatePanel p) - { - _h = h; - _p = p; - } - public void undo() throws CannotUndoException { - _p.addElement(_h); - _p.repaint(); - } - public void redo() throws CannotRedoException { - _p.removeElement(_h); - _p.repaint(); - } - public boolean canUndo() { return true; } - public boolean canRedo() { return true; } - public String getPresentationName() { return "Graphical element removed"; } - }; - public static class ElementAttachTemplateEdit extends AbstractUndoableEdit - { - Connection _c; - private TemplatePanel _p; - public ElementAttachTemplateEdit(Connection c, - TemplatePanel p) - { - _c = c; - _p = p; - } - public void undo() throws CannotUndoException { - _p.removeConnection(_c); - _p.repaint(); - } - public void redo() throws CannotRedoException { - _c = _p.addConnection(_c._h1,_c._edge1,_c._h2,_c._edge2); - _p.repaint(); - } - public boolean canUndo() { return true; } - public boolean canRedo() { return true; } - public String getPresentationName() { return "Graphical elements attached"; } - }; - public static class ElementDetachTemplateEdit extends AbstractUndoableEdit - { - Connection _c; - private TemplatePanel _p; - public ElementDetachTemplateEdit(Connection c, - TemplatePanel p) - { - _c = c; - _p = p; - } - public void undo() throws CannotUndoException { - _c = _p.addConnection(_c._h1,_c._edge1,_c._h2,_c._edge2); - _p.repaint(); - } - public void redo() throws CannotRedoException { - _p.removeConnection(_c); - _p.repaint(); - } - public boolean canUndo() { return true; } - public boolean canRedo() { return true; } - public String getPresentationName() { return "Graphical elements detached"; } - }; - - public static class ElementEdgeMoveTemplateEdit extends AbstractUndoableEdit - { - private GraphicalTemplateElement _ur; - GraphicalTemplateElement.RelativePosition _edge; - private double _ox; - private double _oy; - private double _nx; - private double _ny; - private TemplatePanel _p; - public ElementEdgeMoveTemplateEdit(GraphicalTemplateElement ur, GraphicalTemplateElement.RelativePosition edge, double nx, double ny, TemplatePanel p) - { - _ur = ur; - _edge = edge; - _ox = ur.getEdgePosition(edge).x; - _oy = ur.getEdgePosition(edge).y; - _nx = nx; - _ny = ny; - _p = p; - } - public void undo() throws CannotUndoException { - _ur.setEdgePosition(_edge,new Point2D.Double(_ox,_oy)); - _p.repaint(); - } - public void redo() throws CannotRedoException { - _ur.setEdgePosition(_edge,new Point2D.Double(_nx,_ny)); - _p.repaint(); - } - public boolean canUndo() { return true; } - public boolean canRedo() { return true; } - public String getPresentationName() { return "Edge moved "+_edge; } - public boolean addEdit(UndoableEdit anEdit) - { - if (anEdit instanceof ElementEdgeMoveTemplateEdit) - { - ElementEdgeMoveTemplateEdit e = (ElementEdgeMoveTemplateEdit) anEdit; - if (e._edge==_edge) - { - Point2D.Double po1 = new Point2D.Double(_ox,_oy); - Point2D.Double pn1 = new Point2D.Double(_nx,_ny); - Point2D.Double po2 = new Point2D.Double(e._ox,e._oy); - Point2D.Double pn2 = new Point2D.Double(e._nx,e._ny); - if ((_ur==e._ur)&&(pn1.equals(po2))&&(po1.distance(pn2) _RNAComponents; - private ArrayList _RNAConnections; - private Hashtable,Connection> _helixToConnection; - private TemplateEditorPanelUI _ui; - - private RNATemplate _template; - - - private static Color[] BackgroundColors = {Color.blue,Color.red,Color.cyan,Color.green,Color.lightGray,Color.magenta,Color.PINK}; - - private int _nextBackgroundColor = 0; - - private static double scaleFactorDefault = 0.7; - private double scaleFactor = scaleFactorDefault; - - - private TemplateEditor _editor; - - - public double getScaleFactor() { - return scaleFactor; - } - - public void setScaleFactor(double scaleFactor) { - this.scaleFactor = scaleFactor; - } - - public Color nextBackgroundColor() - { - Color c = BackgroundColors[_nextBackgroundColor++]; - _nextBackgroundColor = _nextBackgroundColor % BackgroundColors.length; - return new Color(c.getRed(),c.getBlue(),c.getGreen(),50); - } - - public TemplatePanel(TemplateEditor parent) - { - _editor = parent; - init(); - } - - public RNATemplate getTemplate() - { - return _template; - } - - List getRNAComponents() { - return _RNAComponents; - } - - private void init() - { - _ui = new TemplateEditorPanelUI(this); - - _RNAComponents = new ArrayList(); - _RNAConnections = new ArrayList(); - _helixToConnection = new Hashtable,Connection>(); - - _template = new RNATemplate(); - - setBackground(Color.WHITE); - MouseControler mc = new MouseControler(this,_ui); - addMouseListener(mc); - addMouseMotionListener(mc); - addMouseWheelListener(mc); - _solidStroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND, 3.0f); - float[] dash = { 5.0f, 5.0f }; - _dashedStroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND, 3.0f, dash, 0); - } - - public void addUndoableEditListener(UndoManager manager) - { - _ui.addUndoableEditListener(manager); - } - - public TemplateEditorPanelUI getTemplateUI() - { - return _ui; - } - - - public void flip(Helix h) - { - h.toggleFlipped(); - } - - public void addElement(GraphicalTemplateElement h) - { - _RNAComponents.add(h); - } - - public void removeElement(GraphicalTemplateElement h) - { - _RNAComponents.remove(h); - try { - _template.removeElement(h.getTemplateElement()); - } catch (ExceptionInvalidRNATemplate e) { - //e.printStackTrace(); - } - } - - private GraphicalTemplateElement _selected = null; - - public GraphicalTemplateElement getSelected() - { - return _selected; - } - - public void setSelected(GraphicalTemplateElement sel) - { - _selected = sel; - if (_selected instanceof Helix) { - _editor.flipButtonEnable(); - } else { - _editor.flipButtonDisable(); - } - } - - Helix.RelativePosition _relpos = Helix.RelativePosition.RP_OUTER; - - public void setSelectedEdge(Helix.RelativePosition rel) - { - _relpos = rel; - } - - public void unselectEdge(Helix.RelativePosition rel) - { - _relpos = rel; - } - - Point2D.Double _mousePos = new Point2D.Double(); - - public void setPointerPos(Point2D.Double p) - { - _mousePos = p; - } - - public void Unselect() - { - _editor.flipButtonDisable(); - _selected = null; - } - - public GraphicalTemplateElement getElement(RNATemplateElement t) - { - for(GraphicalTemplateElement t2: _RNAComponents) - if (t==t2.getTemplateElement()) - return t2; - return null; - } - - - public GraphicalTemplateElement getElementAt(double x, double y) - { - return getElementAt(x, y, null); - } - public GraphicalTemplateElement getElementAt(double x, double y, GraphicalTemplateElement excluded) - { - GraphicalTemplateElement h = null; - for (int i=0; i<_RNAComponents.size();i++) - { - GraphicalTemplateElement h2 = _RNAComponents.get(i); - if (( - (h2.getRelativePosition(x, y)== Helix.RelativePosition.RP_CONNECT_END3) - || (h2.getRelativePosition(x, y)== Helix.RelativePosition.RP_CONNECT_END5) - || (h2.getRelativePosition(x, y)== Helix.RelativePosition.RP_CONNECT_START3) - || (h2.getRelativePosition(x, y)== Helix.RelativePosition.RP_CONNECT_START5)) - && (excluded!=h2)) - { - h = h2; - } - } - if (h==null) - { h = getElementCloseTo(x, y, excluded);}; - return h; - } - - public GraphicalTemplateElement getElementCloseTo(double x, double y) - { - return getElementCloseTo(x, y, null); - } - public GraphicalTemplateElement getElementCloseTo(double x, double y, GraphicalTemplateElement excluded) - { - GraphicalTemplateElement h = null; - for (int i=0; i<_RNAComponents.size();i++) - { - GraphicalTemplateElement h2 = _RNAComponents.get(i); - if ((h2.getRelativePosition(x, y) != Helix.RelativePosition.RP_OUTER) - && (excluded!=h2)) - { - h = h2; - } - } - return h; - } - - public void addConnection(Connection c) - { - _RNAConnections.add(c); - _helixToConnection.put(new Couple(c._h1,c._edge1), c); - _helixToConnection.put(new Couple(c._h2,c._edge2), c); - try { - c._h1.attach(c._h2, c._edge1, c._edge2); - c._h2.attach(c._h1, c._edge2, c._edge1); - } catch (ExceptionInvalidRNATemplate e) { - System.out.println(e.toString());// TODO Auto-generated catch block - } - - } - - public Connection addConnection(GraphicalTemplateElement h1, GraphicalTemplateElement.RelativePosition edge1,GraphicalTemplateElement h2, GraphicalTemplateElement.RelativePosition edge2) - { - if ((h1!=h2)&&(getPartner(h1,edge1)==null)&&(getPartner(h2,edge2)==null)) - { - Connection c = new Connection(h1,edge1,h2,edge2); - addConnection(c); - return c; - } - return null; - } - - /** - * When there is already a connection in the underlying RNATemplate - * and we want to create one at the graphical level. - */ - public void addGraphicalConnection(GraphicalTemplateElement h1, GraphicalTemplateElement.RelativePosition edge1,GraphicalTemplateElement h2, GraphicalTemplateElement.RelativePosition edge2) { - //System.out.println("Connecting " + h1 + " " + edge1 + " to " + h2 + " " + edge2); - Connection c = new Connection(h1,edge1,h2,edge2); - _RNAConnections.add(c); - _helixToConnection.put(new Couple(c._h1,c._edge1), c); - _helixToConnection.put(new Couple(c._h2,c._edge2), c); - c._h1.graphicalAttach(c._h2, c._edge1, c._edge2); - c._h2.graphicalAttach(c._h1, c._edge2, c._edge1); - } - - - public void removeConnection(Connection c) - { - _RNAConnections.remove(c); - _helixToConnection.remove(new Couple(c._h1,c._edge1)); - _helixToConnection.remove(new Couple(c._h2,c._edge2)); - System.out.println("[A]"+c); - c._h1.detach(c._edge1); - } - - public boolean isInCycle(GraphicalTemplateElement el, GraphicalTemplateElement.RelativePosition edge) - { - Stack > p = new Stack>(); - Hashtable,Integer> alreadySeen = new Hashtable,Integer>(); - p.add(new Couple(el,edge)); - while(!p.empty()) - { - Couple c2 = p.pop(); - if (alreadySeen.containsKey(c2)) - { - return true; - } - else - { - alreadySeen.put(c2, new Integer(1)); - } - GraphicalTemplateElement.RelativePosition next = c2.first.getConnectedEdge(c2.second); - Couple otherEnd = new Couple(c2.first,next); - if (!alreadySeen.containsKey(otherEnd)) - { - p.push(otherEnd); - } - else - { - Couple child = getPartner(c2.first,c2.second); - if (child!=null) - { - p.push(child); - } - } - - } - - return false; - } - - private static Color[] _colors = {Color.gray,Color.pink,Color.cyan,Color.RED,Color.green,Color.orange}; - - public static Color getIndexedColor(int n) - { - return _colors[n%_colors.length]; - } - - public HashMap,Integer> buildConnectedComponents() - { - HashMap,Integer> alreadySeen = new HashMap,Integer>(); - int numConnectedComponents = 0; - for (GraphicalTemplateElement el : this._RNAComponents) - { - for (GraphicalTemplateElement.RelativePosition edge : el.getConnectedEdges()) - { - Couple c = new Couple(el,edge); - if (!alreadySeen.containsKey(c)) - { - Stack > p = new Stack>(); - p.add(c); - p.add(new Couple(el,el.getConnectedEdge(edge))); - while(!p.empty()) - { - Couple c2 = p.pop(); - if (!alreadySeen.containsKey(c2)) - { - //System.out.println(" "+numConnectedComponents+" "+c2); - c2.first.setMainColor(c2.second, getIndexedColor(numConnectedComponents)); - alreadySeen.put(c2, new Integer(numConnectedComponents)); - GraphicalTemplateElement.RelativePosition next = c2.first.getConnectedEdge(c2.second); - Couple otherEnd = new Couple(c2.first,next); - p.push(otherEnd); - Couple child = getPartner(c2.first,c2.second); - if (child!=null) - { p.push(child); } - } - } - numConnectedComponents += 1; - } - } - } - return alreadySeen; - } - - public boolean isInCycle(Connection c) - { - return isInCycle(c._h1,c._edge1); - } - - public Couple getPartner(GraphicalTemplateElement h, GraphicalTemplateElement.RelativePosition edge) - { - Connection c = getConnection(h, edge); - if (c != null) - { - if ((c._h1==h)&&(c._edge1==edge)) - { return new Couple(c._h2,c._edge2); } - else - { return new Couple(c._h1,c._edge1); } - } - else - { - return null; - } - } - - public Connection getConnection(GraphicalTemplateElement h, Helix.RelativePosition edge) - { - Couple target = new Couple(h,edge); - if (_helixToConnection.containsKey(target)) - { - return _helixToConnection.get(target); - } - else - { return null; } - } - - private boolean isConnected(Helix h, GraphicalTemplateElement.RelativePosition edge) - { - Couple partner = getPartner(h,edge); - return partner!=null; - } - - - // Aspects graphiques - - private static final Color CYCLE_COLOR = Color.red; - private static final Color NON_EXISTANT_COLOR = Color.gray.brighter(); - private static final Color CONTROL_COLOR = Color.gray.darker(); - private static final Color BACKGROUND_COLOR = Color.white; - - private Stroke _solidStroke; - private Stroke _dashedStroke; - - - - - private void drawConnections(Graphics2D g2d, Connection c) - { - GraphicalTemplateElement h1 = c._h1; - GraphicalTemplateElement.RelativePosition edge1 = c._edge1; - Point2D.Double p1 = h1.getEdgePosition(edge1); - GraphicalTemplateElement h2 = c._h2; - GraphicalTemplateElement.RelativePosition edge2 = c._edge2; - Point2D.Double p2 = h2.getEdgePosition(edge2); - if (isInCycle(c)) - { - g2d.setColor(CYCLE_COLOR); - } - else - { - g2d.setColor(GraphicalTemplateElement.BACKBONE_COLOR); - } - g2d.drawLine((int)p1.x,(int)p1.y,(int)p2.x,(int)p2.y); - } - - - public void paintComponent(Graphics g) - { - //rescale(); - - // Debug code to show drawing area -// g.setColor(Color.red); -// g.fillRect(0,0,getWidth(),getHeight()); -// g.setColor(Color.white); -// g.fillRect(10,10,getWidth()-20,getHeight()-20); - - g.setColor(Color.white); - g.fillRect(0,0,getWidth(),getHeight()); - - Graphics2D g2d = (Graphics2D) g; - g2d.scale(scaleFactor, scaleFactor); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - removeAll(); - //super.paintComponent(g2d); - - buildConnectedComponents(); - - if (_selected!=null) - { - if (_relpos != GraphicalTemplateElement.RelativePosition.RP_OUTER) - { - Point2D.Double p = _selected.getEdgePosition(_relpos); - g2d.setStroke(_solidStroke); - g2d.drawLine((int)_mousePos.x, (int)_mousePos.y, (int)p.x, (int)p.y); - } - } - for (int i=0;i<_RNAConnections.size();i++) - { - Connection c = _RNAConnections.get(i); - drawConnections(g2d,c); - } - for (int i=0;i<_RNAComponents.size();i++) - { - GraphicalTemplateElement elem = _RNAComponents.get(i); - //g2d.setColor(elem.getDominantColor()); - //g2d.fill(elem.getArea()); - if (_selected == elem) - { - elem.draw(g2d,true); - } - else - { elem.draw(g2d,false); } - } - } - - /** - * Get the bounding rectangle of the RNA components, always including the origin (0,0). - */ - public Rectangle getBoundingRectange() { - int minX = 0; - int maxX = 0; - int minY = 0; - int maxY = 0; - for(int i=0;i graphical template element mapping - Map map = new HashMap(); - - // First, we load elements - { - Iterator iter = template.classicIterator(); - while (iter.hasNext()) { - RNATemplateElement templateElement = iter.next(); - if (templateElement instanceof RNATemplateHelix) { - RNATemplateHelix templateHelix = (RNATemplateHelix) templateElement; - Helix graphicalHelix = new Helix(templateHelix); - graphicalHelix.setDominantColor(nextBackgroundColor()); - _RNAComponents.add(graphicalHelix); - map.put(templateHelix, graphicalHelix); - } else if (templateElement instanceof RNATemplateUnpairedSequence) { - RNATemplateUnpairedSequence templateSequence = (RNATemplateUnpairedSequence) templateElement; - UnpairedRegion graphicalSequence = new UnpairedRegion(templateSequence); - graphicalSequence.setDominantColor(nextBackgroundColor()); - _RNAComponents.add(graphicalSequence); - map.put(templateSequence, graphicalSequence); - } - } - } - - // Now, we load edges - { - Iterator iter = template.makeEdgeList().iterator(); - while (iter.hasNext()) { - EdgeEndPoint v1 = iter.next(); - EdgeEndPoint v2 = v1.getOtherEndPoint(); - GraphicalTemplateElement gte1 = map.get(v1.getElement()); - GraphicalTemplateElement gte2 = map.get(v2.getElement()); - RelativePosition rp1 = gte1.relativePositionFromEdgeEndPointPosition(v1.getPosition()); - RelativePosition rp2 = gte2.relativePositionFromEdgeEndPointPosition(v2.getPosition()); - addGraphicalConnection(gte1, rp1, gte2, rp2); - } - } - - zoomFit(); - //repaint(); - } - - /** - * Load a template from an XML file. - */ - public void loadFromXmlFile(File filename) { - try { - RNATemplate newTemplate = RNATemplate.fromXMLFile(filename); - loadTemplate(newTemplate); - } catch (ExceptionXmlLoading e) { - e.printStackTrace(); - JOptionPane.showMessageDialog(this, e.getMessage(), "Template loading error", JOptionPane.ERROR_MESSAGE); - } - } - - private void zoomFinish() { - rescale(); - repaint(); - } - - public void zoomIn() { - scaleFactor *= 1.2; - zoomFinish(); - } - - public void zoomOut() { - scaleFactor /= 1.2; - zoomFinish(); - } - - public void zoomReset() { - scaleFactor = scaleFactorDefault; - zoomFinish(); - } - - public void zoomFit() { - if (_RNAComponents.isEmpty()) { - zoomReset(); - } else { - Rectangle rect = getBoundingRectange(); - double areaW = (rect.width + 100); - double areaH = (rect.height + 100); - // make it cover at least the space visible in the window - scaleFactor = 1; - scaleFactor = Math.min(scaleFactor, _editor.getJp().getViewport().getSize().width / areaW); - scaleFactor = Math.min(scaleFactor, _editor.getJp().getViewport().getSize().height / areaH); - zoomFinish(); - } - } - - public void translateView(Point trans) { - int newX = _editor.getJp().getHorizontalScrollBar().getValue() - trans.x; - int newY = _editor.getJp().getVerticalScrollBar().getValue() - trans.y; - newX = Math.max(0, Math.min(newX, _editor.getJp().getHorizontalScrollBar().getMaximum())); - newY = Math.max(0, Math.min(newY, _editor.getJp().getVerticalScrollBar().getMaximum())); - _editor.getJp().getHorizontalScrollBar().setValue(newX); - _editor.getJp().getVerticalScrollBar().setValue(newY); - } -} diff --git a/src2/fr/orsay/lri/varna/applications/templateEditor/UnpairedRegion.java b/src2/fr/orsay/lri/varna/applications/templateEditor/UnpairedRegion.java deleted file mode 100644 index 363fe85..0000000 --- a/src2/fr/orsay/lri/varna/applications/templateEditor/UnpairedRegion.java +++ /dev/null @@ -1,488 +0,0 @@ -package fr.orsay.lri.varna.applications.templateEditor; -import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.Shape; -import java.awt.geom.CubicCurve2D; -import java.awt.geom.GeneralPath; -import java.awt.geom.Point2D; -import java.awt.geom.Point2D.Double; -import java.util.ArrayList; - -import fr.orsay.lri.varna.applications.templateEditor.GraphicalTemplateElement.RelativePosition; -import fr.orsay.lri.varna.exceptions.ExceptionEdgeEndpointAlreadyConnected; -import fr.orsay.lri.varna.exceptions.ExceptionInvalidRNATemplate; -import fr.orsay.lri.varna.models.geom.CubicBezierCurve; -import fr.orsay.lri.varna.models.templates.RNATemplate; -import fr.orsay.lri.varna.models.templates.RNATemplate.EdgeEndPointPosition; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateHelix; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateUnpairedSequence; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement.EdgeEndPoint; - -public class UnpairedRegion extends GraphicalTemplateElement{ - private RNATemplateUnpairedSequence _e; - public static final double DEFAULT_VECTOR_LENGTH = 35; - public static final double DEFAULT_VECTOR_DISTANCE = 35; - - private Point2D.Double[] sequenceBasesCoords = null; - - public UnpairedRegion(double x, double y, RNATemplate tmp) - { - _e = tmp.new RNATemplateUnpairedSequence(""); - _e.setVertex5(new Point2D.Double(x,y)); - _e.setVertex3(new Point2D.Double(x+DEFAULT_VECTOR_DISTANCE,y)); - _e.setInTangentVectorLength(DEFAULT_VECTOR_LENGTH); - _e.setInTangentVectorAngle(-Math.PI/2.0); - _e.setOutTangentVectorLength(DEFAULT_VECTOR_LENGTH); - _e.setOutTangentVectorAngle(-Math.PI/2.0); - updateLength(); - - } - - /** - * Build an UnpairedRegion object from a RNATemplateUnpairedSequence - * object. The RNATemplateUnpairedSequence must be connected to - * an helix on both sides. - */ - public UnpairedRegion(RNATemplateUnpairedSequence templateSequence) - { - _e = templateSequence; - } - - public Point2D.Double getEdge5() - { - RelativePosition r = RelativePosition.RP_CONNECT_START5; - Couple c = getAttachedElement(r); - return (isAnchored5()? c.second.getEdgePosition(c.first): _e.getVertex5()); - } - - public Point2D.Double getEdge3() - { - RelativePosition r = RelativePosition.RP_CONNECT_END3; - Couple c = getAttachedElement(r); - return (isAnchored3()? c.second.getEdgePosition(c.first): _e.getVertex3()); - } - - public Point2D.Double getCenter() - { - Point2D.Double p1 = getEdge5(); - Point2D.Double p2 = getEdge3(); - return new Point2D.Double((p1.x+p2.x)/2.,(p1.y+p2.y)/2.); - } - - - public void setEdge5(Point2D.Double d) - { - _e.setVertex5(d); - updateLength(); - } - - public void setEdge3(Point2D.Double d) - { - _e.setVertex3(d); - updateLength(); - } - - public void setCenter(Point2D.Double d) - { - Point2D.Double p1 = getEdge5(); - Point2D.Double p2 = getEdge3(); - double dx = p1.x-p2.x; - double dy = p1.y-p2.y; - _e.setVertex3(new Point2D.Double(d.x-dx/2.,d.y-dy/2.)); - _e.setVertex5(new Point2D.Double(d.x+dx/2.,d.y+dy/2.)); - invalidateCoords(); - } - - - public boolean isAnchored5() - { - return (_e.getIn().getOtherElement()!=null); - } - - public boolean isAnchored3() - { - return (_e.getOut().getOtherElement()!=null); - } - - - public static Shape bezToShape(CubicBezierCurve c) - { - GeneralPath p = new GeneralPath(); - int nb = 9; - double[] tab = new double[nb]; - for (int i=0;i> v = new ArrayList>(); - v.add(new Couple(p.distance(p5),RelativePosition.RP_CONNECT_START5)); - v.add(new Couple(p.distance(p3),RelativePosition.RP_CONNECT_END3)); - v.add(new Couple(p.distance(t5),RelativePosition.RP_EDIT_TANGENT_5)); - v.add(new Couple(p.distance(t3),RelativePosition.RP_EDIT_TANGENT_3)); - v.add(new Couple(p.distance(ct),RelativePosition.RP_INNER_MOVE)); - double dist = java.lang.Double.MAX_VALUE; - RelativePosition r = RelativePosition.RP_OUTER; - - for (Couple c : v) - { - if (c.first c = getAttachedElement(edge); - getEndPoint(edge).disconnect(); - } - - // Call the parent class detach function, which will also take care to disconnect this other endpoint of this edge - super.detach(edge); - } - - public void setEdgePosition(RelativePosition edge, Point2D.Double pos) { - switch(edge) - { - case RP_CONNECT_START5: - setEdge5(pos); - break; - case RP_INNER_MOVE: - setCenter(pos); - break; - case RP_CONNECT_END3: - setEdge3(pos); - break; - case RP_EDIT_TANGENT_5: - updateControl5(pos); - break; - case RP_EDIT_TANGENT_3: - updateControl3(pos); - break; - } - } - - public ArrayList getConnectedEdges() { - ArrayList result = new ArrayList(); - result.add(RelativePosition.RP_CONNECT_START5); - result.add(RelativePosition.RP_CONNECT_END3); - return result; - } - - public RNATemplateElement getTemplateElement() { - return _e; - } - - - public RelativePosition relativePositionFromEdgeEndPointPosition( - EdgeEndPointPosition pos) { - switch (pos) { - case IN1: - return RelativePosition.RP_CONNECT_START5; - case OUT1: - return RelativePosition.RP_CONNECT_END3; - default: - return null; - } - } - - -} diff --git a/src2/fr/orsay/lri/varna/components/ActionEditor.java b/src2/fr/orsay/lri/varna/components/ActionEditor.java deleted file mode 100644 index 204024f..0000000 --- a/src2/fr/orsay/lri/varna/components/ActionEditor.java +++ /dev/null @@ -1,54 +0,0 @@ -package fr.orsay.lri.varna.components; - -import java.awt.Component; -import java.awt.Event; -import java.awt.event.ActionListener; -import java.util.EventObject; - -import javax.swing.AbstractCellEditor; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JTable; -import javax.swing.table.TableCellEditor; - -public class ActionEditor extends AbstractCellEditor implements TableCellEditor { - - JButton _btn = new JButton(); - - public ActionEditor (ActionListener a) { - // add all elments you need to your panel - _btn.addActionListener(a); - } - - public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int vColIndex) { - _btn.setText(value.toString()); - _btn.setActionCommand(value.toString()+"-"+rowIndex); - // set all elemnts of you panel to the according values - // or add dynamically an action listener - - return _btn; - } - public Object getCellEditorValue() - { - return ""; - } - - public boolean shouldSelectCell(EventObject anEvent) - { - return super.shouldSelectCell(anEvent); - - } - - public boolean isCellEditable(EventObject anEvent) - { - return super.isCellEditable(anEvent); - } - - public boolean stopCellEditing() - { - return super.stopCellEditing(); - } - - -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/components/ActionRenderer.java b/src2/fr/orsay/lri/varna/components/ActionRenderer.java deleted file mode 100644 index ee88270..0000000 --- a/src2/fr/orsay/lri/varna/components/ActionRenderer.java +++ /dev/null @@ -1,30 +0,0 @@ - -package fr.orsay.lri.varna.components; - - -import java.awt.Color; -import java.awt.Component; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JTable; -import javax.swing.border.Border; -import javax.swing.table.TableCellRenderer; - -public class ActionRenderer extends JButton implements TableCellRenderer { - /** - * - */ - private static final long serialVersionUID = 1L; - - public ActionRenderer() { - } - - public Component getTableCellRendererComponent(JTable table, Object button, - boolean isSelected, boolean hasFocus, int row, int column) { - this.setText(button.toString()); - return this; - } -} - diff --git a/src2/fr/orsay/lri/varna/components/AnnotationTableModel.java b/src2/fr/orsay/lri/varna/components/AnnotationTableModel.java deleted file mode 100644 index c84f72e..0000000 --- a/src2/fr/orsay/lri/varna/components/AnnotationTableModel.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - 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.components; - -import java.util.ArrayList; - -import javax.swing.table.AbstractTableModel; - -public class AnnotationTableModel extends AbstractTableModel { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String[] columnNames = { "Annotation" }; - private ArrayList> data = new ArrayList>(); - - - public AnnotationTableModel(ArrayList annot) { - ArrayList ligne; - for (int i = 0; i < annot.size(); i++) { - ligne = new ArrayList(); - ligne.add(annot.get(i)); - data.add(ligne); - } - - } - - public int getColumnCount() { - return columnNames.length; - } - - public int getRowCount() { - return data.size(); - } - - public String getColumnName(int col) { - return columnNames[col]; - } - - public Object getValueAt(int row, int col) { - return data.get(row).get(col); - } - - /* - * JTable uses this method to determine the default renderer/ editor for - * each cell. If we didn't implement this method, then the last column would - * contain text ("true"/"false"), rather than a check box. - */ - @SuppressWarnings("unchecked") - public Class getColumnClass(int c) { - return getValueAt(0, c).getClass(); - } - - public boolean isCellEditable(int row, int col) { - // Note that the data/cell address is constant, - // no matter where the cell appears onscreen. - if (col < 1) { - return false; - } else { - return true; - } - } - - public void setValueAt(Object value, int row, int col) { - data.get(row).set(col, value); - fireTableCellUpdated(row, col); - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/components/BaseSpecialColorEditor.java b/src2/fr/orsay/lri/varna/components/BaseSpecialColorEditor.java deleted file mode 100644 index d39d74e..0000000 --- a/src2/fr/orsay/lri/varna/components/BaseSpecialColorEditor.java +++ /dev/null @@ -1,104 +0,0 @@ - -package fr.orsay.lri.varna.components; - - -import java.awt.Color; -import java.awt.Component; - -import javax.swing.AbstractCellEditor; -import javax.swing.JButton; -import javax.swing.JColorChooser; -import javax.swing.JDialog; -import javax.swing.JTable; -import javax.swing.table.TableCellEditor; - -import fr.orsay.lri.varna.controlers.ControleurBaseSpecialColorEditor; -import fr.orsay.lri.varna.views.VueBases; - -public class BaseSpecialColorEditor extends AbstractCellEditor implements - TableCellEditor { - /** - * - */ - private static final long serialVersionUID = 1L; - private Color currentColor; - private JButton button; - private JColorChooser colorChooser; - private JDialog dialog; - protected static final String EDIT = "edit"; - private VueBases _vueBases; - private ControleurBaseSpecialColorEditor _controleurSpecialColorEditor; - - public BaseSpecialColorEditor(VueBases vueBases) { - // Set up the editor (from the table's point of view), - // which is a button. - // This button brings up the color chooser dialog, - // which is the editor from the user's point of view. - button = new JButton(); - button.setActionCommand(EDIT); - _controleurSpecialColorEditor = new ControleurBaseSpecialColorEditor(this); - button.addActionListener(_controleurSpecialColorEditor); - button.setBorderPainted(false); - fireEditingStopped(); - _vueBases = vueBases; - - // Set up the dialog that the button brings up. - colorChooser = new JColorChooser(); - dialog = JColorChooser.createDialog(button, "Pick a Color", true, // modal - colorChooser, _controleurSpecialColorEditor, // OK button - // handler - null); // no CANCEL button handler - } - - // Implement the one CellEditor method that AbstractCellEditor doesn't. - public Object getCellEditorValue() { - return currentColor; - } - - // Implement the one method defined by TableCellEditor. - public Component getTableCellEditorComponent(JTable table, Object value, - boolean isSelected, int row, int column) { - currentColor = (Color) value; - return button; - } - - public static long getSerialVersionUID() { - return serialVersionUID; - } - - public Color getCurrentColor() { - return currentColor; - } - - public JButton getButton() { - return button; - } - - public JColorChooser getColorChooser() { - return colorChooser; - } - - public JDialog getDialog() { - return dialog; - } - - public static String getEDIT() { - return EDIT; - } - - public VueBases get_vueBases() { - return _vueBases; - } - - public ControleurBaseSpecialColorEditor get_controleurSpecialColorEditor() { - return _controleurSpecialColorEditor; - } - - public void setCurrentColor(Color currentColor) { - this.currentColor = currentColor; - } - - public void callFireEditingStopped() { - fireEditingStopped(); - } -} diff --git a/src2/fr/orsay/lri/varna/components/BaseTableModel.java b/src2/fr/orsay/lri/varna/components/BaseTableModel.java deleted file mode 100644 index cf04d61..0000000 --- a/src2/fr/orsay/lri/varna/components/BaseTableModel.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - 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.components; - -import java.awt.Color; -import java.util.ArrayList; - -import javax.swing.table.AbstractTableModel; - -import fr.orsay.lri.varna.models.BaseList; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModelBaseStyle; - - -public class BaseTableModel extends AbstractTableModel { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String[] columnNames = { "Numbers", "Base", "Outline Color", "Inner Color", - "Name Color", "Number Color" }; - private ArrayList> data = new ArrayList>(); - private ArrayList _bases; - private boolean _singleBases = true; - - public BaseTableModel(ArrayList bases) { - _bases = bases; - ArrayList ligne; - for (int i = 0; i < bases.size(); i++) { - ligne = new ArrayList(); - BaseList bl = bases.get(i); - if (bl.size()!=1) - { - _singleBases = false; - } - ligne.add(bl.getNumbers()); - ligne.add(bl.getContents()); - ligne.add(bl.getAverageOutlineColor()); - ligne.add(bl.getAverageInnerColor()); - ligne.add(bl.getAverageNameColor()); - ligne.add(bl.getAverageNumberColor()); - this.data.add(ligne); - } - - } - - public int getColumnCount() { - return columnNames.length; - } - - public int getRowCount() { - return data.size(); - } - - public String getColumnName(int col) { - return columnNames[col]; - } - - public Object getValueAt(int row, int col) { - return data.get(row).get(col); - } - - /* - * JTable uses this method to determine the default renderer/ editor for - * each cell. If we didn't implement this method, then the last column would - * contain text ("true"/"false"), rather than a check box. - */ - @SuppressWarnings("unchecked") - public Class getColumnClass(int c) { - return getValueAt(0, c).getClass(); - } - - public boolean isCellEditable(int row, int col) { - // Note that the data/cell address is constant, - // no matter where the cell appears onscreen. - if (col < 1) { - return false; - } else { - return true; - } - } - - public void setValueAt(Object value, int row, int col) { - data.get(row).set(col, value); - if (col == 1 && _singleBases) - { - ModeleBase mb = _bases.get(row).getBases().get(0); - mb.setContent(value.toString()); - } - fireTableCellUpdated(row, col); - - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/components/ColorRenderer.java b/src2/fr/orsay/lri/varna/components/ColorRenderer.java deleted file mode 100644 index fa0c285..0000000 --- a/src2/fr/orsay/lri/varna/components/ColorRenderer.java +++ /dev/null @@ -1,52 +0,0 @@ - -package fr.orsay.lri.varna.components; - - -import java.awt.Color; -import java.awt.Component; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JTable; -import javax.swing.border.Border; -import javax.swing.table.TableCellRenderer; - -public class ColorRenderer extends JLabel implements TableCellRenderer { - /** - * - */ - private static final long serialVersionUID = 1L; - Border unselectedBorder = null; - Border selectedBorder = null; - boolean isBordered = true; - - public ColorRenderer(boolean isBordered) { - this.isBordered = isBordered; - setOpaque(true); // MUST do this for background to show up. - } - - public Component getTableCellRendererComponent(JTable table, Object color, - boolean isSelected, boolean hasFocus, int row, int column) { - Color newColor = (Color) color; - setBackground(newColor); - if (isBordered) { - if (isSelected) { - if (selectedBorder == null) { - selectedBorder = BorderFactory.createMatteBorder(2, 5, 2, - 5, table.getSelectionBackground()); - } - setBorder(selectedBorder); - } else { - if (unselectedBorder == null) { - unselectedBorder = BorderFactory.createMatteBorder(2, 5, 2, - 5, table.getBackground()); - } - setBorder(unselectedBorder); - } - } - - setToolTipText("RGB value: " + newColor.getRed() + ", " - + newColor.getGreen() + ", " + newColor.getBlue()); - return this; - } -} diff --git a/src2/fr/orsay/lri/varna/components/GradientEditorPanel.java b/src2/fr/orsay/lri/varna/components/GradientEditorPanel.java deleted file mode 100644 index f6d835a..0000000 --- a/src2/fr/orsay/lri/varna/components/GradientEditorPanel.java +++ /dev/null @@ -1,344 +0,0 @@ -package fr.orsay.lri.varna.components; - -import java.awt.Color; -import java.awt.Cursor; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; - -import javax.swing.JColorChooser; -import javax.swing.JPanel; - -import fr.orsay.lri.varna.models.rna.ModeleColorMap; - -public class GradientEditorPanel extends JPanel implements MouseListener, MouseMotionListener{ - ModeleColorMap _mcm; - - public GradientEditorPanel (ModeleColorMap mcm) - { - _mcm = mcm; - this.addMouseListener( this); - this.addMouseMotionListener(this); - } - - public void setColorMap(ModeleColorMap mcm) - { - _mcm = mcm; - repaint(); - firePropertyChange("PaletteChanged","a","b"); - } - - public ModeleColorMap getColorMap() - { - return _mcm; - } - - private final static int TRIGGERS_SEMI_WIDTH = 2; - private final static int PALETTE_HEIGHT = 11; - private final static int REMOVE_HEIGHT = 11; - private final static int TOLERANCE = 5; - private final static int GAP = 4; - private final Color EDGES = Color.gray.brighter(); - private final Color BUTTONS = Color.LIGHT_GRAY.brighter(); - - public int getStartChoose() - { - return getHeight()-PALETTE_HEIGHT-REMOVE_HEIGHT-GAP-1; - } - - public int getEndChoose() - { - return getStartChoose()+PALETTE_HEIGHT; - } - - public int getStartRemove() - { - return getEndChoose()+GAP; - } - - public int getEndRemove() - { - return getStartRemove()+REMOVE_HEIGHT; - } - - private int getStripeHeight() - { - return getHeight()-PALETTE_HEIGHT-REMOVE_HEIGHT-2*GAP-1; - } - - private Color alterColor(Color c, int inc) - { - int nr = Math.min(Math.max(c.getRed()+inc, 0),255); - int ng = Math.min(Math.max(c.getGreen()+inc, 0),255); - int nb = Math.min(Math.max(c.getBlue()+inc, 0),255); - return new Color(nr,ng,nb); - } - - public void paintComponent(Graphics g) - { - super.paintComponent(g); - Graphics2D g2d = (Graphics2D) g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - int height = getStripeHeight(); - double v1 = _mcm.getMinValue(); - double v2 = _mcm.getMaxValue(); - for (int i=0;i<=getWidth();i++) - { - double ratio = (((double)i)/((double)getWidth())); - double val = v1+(v2-v1)*ratio; - g2d.setColor(_mcm.getColorForValue(val)); - g2d.drawLine(i, 0, i, height); - } - for(int i=0;i<_mcm.getNumColors();i++) - { - double val = _mcm.getValueAt(i); - Color c = _mcm.getColorAt(i); - double norm = (val-_mcm.getMinValue())/(_mcm.getMaxValue()-_mcm.getMinValue()); - int x = (int)(norm*(getWidth()-1)); - // Target - g2d.setColor(c); - g2d.fillRect(x-TRIGGERS_SEMI_WIDTH+1, 0, 2*TRIGGERS_SEMI_WIDTH-1, getHeight()-1); - g2d.setColor(EDGES); - g2d.drawLine(x-TRIGGERS_SEMI_WIDTH, 0, x-TRIGGERS_SEMI_WIDTH, getHeight()); - g2d.drawLine(x+TRIGGERS_SEMI_WIDTH, 0, x+TRIGGERS_SEMI_WIDTH, getHeight()); - - if (i==0) - { - // Choose Color - g2d.setColor(EDGES); - g2d.drawRect(x,height+GAP,PALETTE_HEIGHT,2*PALETTE_HEIGHT+GAP); - g2d.setColor(c); - g2d.fillRect(x+1,height+GAP+1,PALETTE_HEIGHT-1,2*PALETTE_HEIGHT+GAP-1); - } - else if (i==_mcm.getNumColors()-1) - { - // Choose Color - g2d.setColor(EDGES); - g2d.drawRect(x-PALETTE_HEIGHT,height+GAP,PALETTE_HEIGHT,2*PALETTE_HEIGHT+GAP); - g2d.setColor(c); - g2d.fillRect(x-PALETTE_HEIGHT+1,height+GAP+1,PALETTE_HEIGHT-1,2*PALETTE_HEIGHT+GAP-1); - } - else - { - // Choose Color - g2d.setColor(EDGES); - g2d.drawRect(x-PALETTE_HEIGHT/2,height+GAP,PALETTE_HEIGHT,PALETTE_HEIGHT); - g2d.setColor(alterColor(c,-15)); - g2d.fillRect(x-PALETTE_HEIGHT/2+1,height+GAP+1,PALETTE_HEIGHT-1,PALETTE_HEIGHT-1); - g2d.setColor(c); - g2d.fillOval(x-PALETTE_HEIGHT/2+1,height+GAP+1,PALETTE_HEIGHT-1,PALETTE_HEIGHT-1); - g2d.setColor(alterColor(c,10)); - g2d.fillOval(x-PALETTE_HEIGHT/2+1+2,height+GAP+1+2,PALETTE_HEIGHT-1-4,PALETTE_HEIGHT-1-4); - - - // Remove Color - g2d.setColor(EDGES); - g2d.drawRect(x-PALETTE_HEIGHT/2,height+2*GAP+PALETTE_HEIGHT,REMOVE_HEIGHT,REMOVE_HEIGHT); - g2d.setColor(BUTTONS); - g2d.fillRect(x-PALETTE_HEIGHT/2+1,height+2*GAP+1+PALETTE_HEIGHT,REMOVE_HEIGHT-1,REMOVE_HEIGHT-1); - int xcross1 = x-PALETTE_HEIGHT/2+2; - int ycross1 = height+2*GAP+PALETTE_HEIGHT +2; - int xcross2 = xcross1+REMOVE_HEIGHT-4; - int ycross2 = ycross1+REMOVE_HEIGHT-4; - g2d.setColor(Color.red); - g2d.drawLine(xcross1, ycross1, xcross2 , ycross2); - g2d.drawLine(xcross1, ycross2, xcross2 , ycross1); - } - } - - } - - private boolean isChooseColor(int x, int y) - { - if (_selectedIndex != -1) - { - if ((_selectedIndex ==0)||(_selectedIndex == _mcm.getNumColors()-1)) - return (y<=getEndRemove() && y>=getStartChoose() && Math.abs(getXPos(_selectedIndex)-x)<=PALETTE_HEIGHT); - if (y<=getEndChoose() && y>=getStartChoose()) - { - return Math.abs(getXPos(_selectedIndex)-x)<=PALETTE_HEIGHT/2; - } - } - return false; - } - - private boolean isRemove(int x, int y) - { - if (_selectedIndex != -1) - { - if ((_selectedIndex ==0)||(_selectedIndex == _mcm.getNumColors()-1)) - return false; - if (y<=getEndRemove() && y>=getStartRemove()) - { - return Math.abs(getXPos(_selectedIndex)-x)<=PALETTE_HEIGHT/2; - } - } - return false; - } - - private int getXPos(int i) - { - double val = _mcm.getValueAt(i); - double norm = (val-_mcm.getMinValue())/(_mcm.getMaxValue()-_mcm.getMinValue()); - return (int)(norm*(getWidth()-1)); - } - - - private int locateSelectedIndex(int x, int y) - { - double dist = Double.MAX_VALUE; - int index = -1; - for(int i=0;i<_mcm.getNumColors();i++) - { - int xp = getXPos(i); - double tmpDist = Math.abs(x-xp); - if (tmpDistTOLERANCE) - { - double val = _mcm.getMinValue()+ arg0.getX()*(_mcm.getMaxValue()-_mcm.getMinValue())/(getWidth()-1); - Color nc = JColorChooser.showDialog(this, "Choose new color" ,_mcm.getColorAt(_selectedIndex)); - if (nc != null) - { - _mcm.addColor(val, nc); - repaint(); - firePropertyChange("PaletteChanged","a","b"); - } - } - } - } - - public void mouseEntered(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mouseExited(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - - public void mousePressed(MouseEvent arg0) { - requestFocus(); - _selectedIndex = locateSelectedIndex(arg0.getX(),arg0.getY()); - if (_selectedIndex!=-1) - { - if (isChooseColor(arg0.getX(),arg0.getY())) - { - Color nc = JColorChooser.showDialog(this, "Choose new color" ,_mcm.getColorAt(_selectedIndex)); - if (nc != null) - { - double nv = _mcm.getValueAt(_selectedIndex); - replaceEntry(_selectedIndex, nc, nv); - _selectedIndex = -1; - } - } - } - } - - public void mouseReleased(MouseEvent arg0) { - _selectedIndex = -1; - } - - private void replaceEntry(int index, Color nc, double nv) - { - ModeleColorMap cm = new ModeleColorMap(); - for(int i=0;i<_mcm.getNumColors();i++) - { - if (i!=index) - { - double val = _mcm.getValueAt(i); - Color c = _mcm.getColorAt(i); - cm.addColor(val, c); - } - else - { - cm.addColor(nv, nc); - } - } - _mcm = cm; - repaint(); - firePropertyChange("PaletteChanged","a","b"); - } - - private void removeEntry(int index) - { - ModeleColorMap cm = new ModeleColorMap(); - for(int i=0;i<_mcm.getNumColors();i++) - { - if (i!=index) - { - double val = _mcm.getValueAt(i); - Color c = _mcm.getColorAt(i); - cm.addColor(val, c); - } - } - _mcm = cm; - repaint(); - firePropertyChange("PaletteChanged","a","b"); - } - - - public void mouseDragged(MouseEvent arg0) { - if ((_selectedIndex!=-1)&&(_selectedIndex!=0)&&(_selectedIndex!=_mcm.getNumColors()-1)) - { - Color c = _mcm.getColorAt(_selectedIndex); - double val = _mcm.getMinValue()+ arg0.getX()*(_mcm.getMaxValue()-_mcm.getMinValue())/(getWidth()-1); - replaceEntry(_selectedIndex, c, val); - } - } - - public void mouseMoved(MouseEvent arg0) { - Cursor c = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); - _selectedIndex = locateSelectedIndex(arg0.getX(),arg0.getY()); - if (_selectedIndex!=-1) - { - if (isChooseColor(arg0.getX(),arg0.getY())) - { - c = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); - } - else if ((_selectedIndex != 0)&&(_selectedIndex != _mcm.getNumColors()-1)) - { - if (isRemove(arg0.getX(),arg0.getY())) - { - c = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); - } - else if (Math.abs(getXPos(_selectedIndex)-arg0.getX())<=TOLERANCE) - { - c = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR); - } - else if (arg0.getY() r.y+r.height/2) - { - dropTargetIndex += 1; - } - } - //System.out.println(dropTargetIndex); - repaint(); -} - -public void drop (DropTargetDropEvent dtde) { - //System.out.println ("drop()!"); - if (dtde.getSource() != dropTarget) { - //System.out.println ("rejecting for bad source (" + - // dtde.getSource().getClass().getName() + ")"); - dtde.rejectDrop(); - return; - } - Point dropPoint = dtde.getLocation(); - int index = locationToIndex (dropPoint); - if (index != -1) - { - Rectangle r = getCellBounds(index,index); - if (dropPoint.y > r.y+r.height/2) - { - index += 1; - } - } - - //System.out.println ("drop index is " + index); - boolean dropped = false; - try { - if ((index == -1) || (index == draggedIndex)|| (index == draggedIndex+1)) { - //System.out.println ("dropped onto self"); - dtde.rejectDrop(); - return; - } - dtde.acceptDrop (DnDConstants.ACTION_MOVE); - //System.out.println ("accepted"); - Object dragged = - dtde.getTransferable().getTransferData(localObjectFlavor); - // move items - note that indicies for insert will - // change if [removed] source was before target - //System.out.println ("drop " + draggedIndex + " to " + index); - boolean sourceBeforeTarget = (draggedIndex < index); - //System.out.println ("source is" + - // (sourceBeforeTarget ? "" : " not") + - // " before target"); - //System.out.println ("insert at " + - // (sourceBeforeTarget ? index-1 : index)); - DefaultListModel mod = (DefaultListModel) getModel(); - mod.remove (draggedIndex); - mod.add ((sourceBeforeTarget ? index-1 : index), dragged); - dropped = true; - } catch (Exception e) { - e.printStackTrace(); - } - dtde.dropComplete (dropped); -} - -private class ReorderableListCellRenderer -extends DefaultListCellRenderer { -boolean isTargetCell; -boolean isLastItem; -public ReorderableListCellRenderer() { - super(); -} -public Component getListCellRendererComponent (JList list, - Object value, - int index, - boolean isSelected, boolean hasFocus) { - isTargetCell = (index == dropTargetIndex); - isLastItem = (index == list.getModel().getSize()-1) && (dropTargetIndex == list.getModel().getSize()); - boolean showSelected = isSelected; - return super.getListCellRendererComponent (list, value, - index, showSelected, - hasFocus); -} -public void paintComponent (Graphics g) { - super.paintComponent(g); - if (isTargetCell) { - g.setColor(Color.black); - g.drawLine (0, 0, getSize().width, 0); - } - if (isLastItem) { - g.setColor(Color.black); - g.drawLine (0, getSize().height-1, getSize().width, getSize().height-1); - } - } -} - -private class RJLTransferable implements Transferable { - Object object; - public RJLTransferable (Object o) { - object = o; - } - public Object getTransferData(DataFlavor df) - throws UnsupportedFlavorException, IOException { - if (isDataFlavorSupported (df)) - return object; - else - throw new UnsupportedFlavorException(df); - } - public boolean isDataFlavorSupported (DataFlavor df) { - return (df.equals (localObjectFlavor)); - } - public DataFlavor[] getTransferDataFlavors () { - return supportedFlavors; } -} - - -} diff --git a/src2/fr/orsay/lri/varna/components/VARNAConsole.java b/src2/fr/orsay/lri/varna/components/VARNAConsole.java deleted file mode 100644 index 2b8b8a9..0000000 --- a/src2/fr/orsay/lri/varna/components/VARNAConsole.java +++ /dev/null @@ -1,119 +0,0 @@ -package fr.orsay.lri.varna.components; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.io.IOException; - -import javax.swing.JButton; -import javax.swing.JEditorPane; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurScriptParser; -import fr.orsay.lri.varna.models.VARNAConfig; - -public class VARNAConsole extends JFrame implements ActionListener, FocusListener, KeyListener { - - private VARNAPanel _vp; - - private JButton _quitButton; - private JPanel _contentPanel; - private JPanel _quitPanel; - private JTextField _input; - private JEditorPane _output; - private JScrollPane _scrolls; - - public VARNAConsole(VARNAPanel vp) - { - _vp = vp; - init(); - } - - private void init() - { - _quitButton = new JButton("Exit"); - _quitPanel = new JPanel(); - _contentPanel = new JPanel(); - _input = new JTextField("Your command here..."); - _output = new JEditorPane(); - _scrolls = new JScrollPane(_output); - - _input.addFocusListener(this); - _input.addKeyListener(this); - - _output.setText(VARNAConfig.getFullName()+" console\n"); - _output.setPreferredSize(new Dimension(500,300)); - _output.setEditable(false); - - _quitPanel.add(_quitButton); - - _quitButton.addActionListener(this); - - _contentPanel.setLayout(new BorderLayout()); - _contentPanel.add(_scrolls,BorderLayout.CENTER); - _contentPanel.add(_input,BorderLayout.SOUTH); - - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(_contentPanel,BorderLayout.CENTER); - getContentPane().add(_quitPanel,BorderLayout.SOUTH); - - pack(); - } - -public void actionPerformed(ActionEvent arg0) { - setVisible(false); -} - -private boolean _firstFocus = true; - -public void focusGained(FocusEvent arg0) { - if (_firstFocus) - { - _input.setSelectionStart(0); - _input.setSelectionEnd(_input.getText().length()); - _firstFocus = false; - } -} - -public void focusLost(FocusEvent arg0) { - // TODO Auto-generated method stub - -} - -public void keyPressed(KeyEvent arg0) { - // TODO Auto-generated method stub - -} - -public void keyReleased(KeyEvent arg0) { - // TODO Auto-generated method stub - -} - -public void keyTyped(KeyEvent arg0) { - // TODO Auto-generated method stub - char c = arg0.getKeyChar(); - if (c=='\n') - { - try { - ControleurScriptParser.executeScript(_vp,_input.getText()); - } catch (Exception e) { - _output.setText(_output.getText()+e.getMessage()+'\n'); - e.printStackTrace(); - } - } -} - - - -} diff --git a/src2/fr/orsay/lri/varna/components/ZoomWindow.java b/src2/fr/orsay/lri/varna/components/ZoomWindow.java deleted file mode 100644 index 4003e69..0000000 --- a/src2/fr/orsay/lri/varna/components/ZoomWindow.java +++ /dev/null @@ -1,185 +0,0 @@ -package fr.orsay.lri.varna.components; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Polygon; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.geom.GeneralPath; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.awt.geom.Point2D.Double; -import java.awt.image.BufferedImage; -import java.awt.image.ImageObserver; - -import javax.swing.JPanel; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.export.SwingGraphics; -import fr.orsay.lri.varna.models.export.VueVARNAGraphics; - -public class ZoomWindow extends JPanel implements ImageObserver, Runnable, MouseMotionListener, MouseListener { - - VARNAPanel _vp = null; - BufferedImage _bi = null; - Rectangle2D.Double rnaRect = null; - - public ZoomWindow(VARNAPanel vp) - { - _vp = vp; - addMouseMotionListener(this); - addMouseListener(this); - } - - - public synchronized void setPanel(VARNAPanel vp) - { - _vp = vp; - } - - - - public synchronized void drawPanel() - { - if (getWidth()>0 && getHeight()>0) - { - _bi= new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_4BYTE_ABGR); - Graphics2D g2 = _bi.createGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - VueVARNAGraphics g2D = new SwingGraphics(g2); - rnaRect =_vp.renderRNA(g2D,new Rectangle2D.Double(0,0,getWidth(),getHeight()),false,true); - - Point2D.Double p1 = _vp.panelToLogicPoint(new Point2D.Double(0.,0.)); - Point2D.Double p2 = _vp.panelToLogicPoint(new Point2D.Double(_vp.getWidth(),_vp.getHeight())); - - double w = p2.x-p1.x; - double h = p2.y-p1.y; - - Rectangle2D.Double rnaBox = _vp.getRNA().getBBox(); - - double ratiox = w/rnaBox.width; - double ratioy = h/rnaBox.height; - - Rectangle2D.Double rvisible = new Rectangle2D.Double(rnaRect.x+rnaRect.width*(double)(p1.x-rnaBox.x)/(double)rnaBox.width, - rnaRect.y+rnaRect.height*(double)(p1.y-rnaBox.y)/(double)rnaBox.height, - ratiox*rnaRect.width, - ratioy*rnaRect.height); - - //g2D.drawRect(rleft.x,rleft.y,rleft.width,rleft.height); - - Color shade = new Color(.9f,.9f,.9f,.4f); - - g2.setStroke(new BasicStroke(1.0f)); - - g2.setColor(shade); - - /*Polygon north = new Polygon(new int[]{0,getWidth(),(int)rvisible.x, - (int)(rvisible.x+rvisible.width+1),},new int[]{},1);*/ - g2.fillRect(0,0,getWidth(),(int)rvisible.y); - g2.fillRect(0,(int)rvisible.y,(int)rvisible.x,(int)rvisible.height+1); - g2.fillRect((int)(rvisible.x+rvisible.width),(int)rvisible.y,(int)(getHeight()-(rvisible.x+rvisible.width)),(int)(rvisible.height+1)); - g2.fillRect(0,(int)(rvisible.y+rvisible.height),getWidth(),(int)(getHeight()-(rvisible.y+rvisible.height))); - - g2.setColor(new Color(.7f,.7f,.7f,.3f)); - g2.draw(rvisible); - g2.drawLine(0, - 0, - (int)rvisible.x, - (int)rvisible.y); - g2D.drawLine(getWidth(), - 0, - rvisible.x+rvisible.width, - rvisible.y); - g2D.drawLine(getWidth(), - getHeight(), - rvisible.x+rvisible.width, - rvisible.y+rvisible.height); - g2D.drawLine(0, - getHeight(), - rvisible.x, - rvisible.y+rvisible.height); - - g2.dispose(); - } - } - - public void paintComponent(Graphics g) - { - setBackground(_vp.getBackground()); - super.paintComponent(g); - drawPanel(); - if (_bi!=null) - { - g.drawImage(_bi,0,0,this); - } - } - - public void run() { - while(true) - { - repaint(); - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - } - - - public void mouseDragged(MouseEvent e) { - // TODO Auto-generated method stub - - } - - - public void mouseMoved(MouseEvent e) { - // TODO Auto-generated method stub - - } - - - public void mouseClicked(MouseEvent e) { - /*if (rnaRect!=null) - { - int x= e.getX(); - int y= e.getY(); - double ratioX = ((double)(x-rnaRect.getMinX())/((double)rnaRect.width)); - double ratioY = ((double)(y-rnaRect.getMinY())/((double)rnaRect.height)); - _vp.centerViewOn(ratioX,ratioY ); - }*/ - } - - - public void mousePressed(MouseEvent e) { - // TODO Auto-generated method stub - - } - - - public void mouseReleased(MouseEvent e) { - // TODO Auto-generated method stub - - } - - - public void mouseEntered(MouseEvent e) { - // TODO Auto-generated method stub - - } - - - public void mouseExited(MouseEvent e) { - // TODO Auto-generated method stub - - } - -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurBPHeightIncrement.java b/src2/fr/orsay/lri/varna/controlers/ControleurBPHeightIncrement.java deleted file mode 100644 index 87866e1..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurBPHeightIncrement.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - 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.controlers; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.views.VueBPHeightIncrement; - - -public class ControleurBPHeightIncrement implements ChangeListener { - - private VueBPHeightIncrement _vsbb; - - public ControleurBPHeightIncrement(VueBPHeightIncrement vsbb) { - _vsbb = vsbb; - } - - public void stateChanged(ChangeEvent e) { - _vsbb.get_vp().setBPHeightIncrement(_vsbb.getIncrement()); - _vsbb.get_vp().drawRNA(); - _vsbb.get_vp().repaint(); - } - -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurBaseSpecialColorEditor.java b/src2/fr/orsay/lri/varna/controlers/ControleurBaseSpecialColorEditor.java deleted file mode 100644 index b0700cc..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurBaseSpecialColorEditor.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - 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.controlers; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; - -import fr.orsay.lri.varna.components.BaseSpecialColorEditor; -import fr.orsay.lri.varna.models.BaseList; -import fr.orsay.lri.varna.models.rna.ModeleBase; - -/** - * BH SwingJS - additions here to allow asynchronous JColorChooser - */ -public class ControleurBaseSpecialColorEditor implements ActionListener, ComponentListener { // BH SwingJS - - private BaseSpecialColorEditor _specialColorEditor; - - private int _selectedRow; - private int _selectedCol; - private Color _selectedColor; - private String _selectedColTitle; - - public ControleurBaseSpecialColorEditor(BaseSpecialColorEditor specialColorEditor) { - _specialColorEditor = specialColorEditor; - } - - /** - * Handles events from the editor button and from the dialog's OK button. - */ - public void actionPerformed(ActionEvent e) { - if (BaseSpecialColorEditor.getEDIT().equals(e.getActionCommand())) { - // The user has clicked the cell, so - // bring up the dialog. - _specialColorEditor.getButton().setBackground( - _specialColorEditor.getCurrentColor()); - _specialColorEditor.getColorChooser().setColor( - _specialColorEditor.getCurrentColor()); - - // BH SwingJS in JavaScript, this is not modal. - // We have to set a callback to stop the editing. - - _specialColorEditor.getDialog().removeComponentListener(this); - _specialColorEditor.getDialog().addComponentListener(this); - _specialColorEditor.getDialog().setVisible(true); - - - // Make the renderer reappear. - // BH SwingJS not so fast... - //_specialColorEditor.callFireEditingStopped(); - - } else { // User pressed dialog's "OK" button. - _specialColorEditor.setCurrentColor(_specialColorEditor - .getColorChooser().getColor()); - - _selectedRow = _specialColorEditor.get_vueBases().getTable() - .getSelectedRow(); - - _selectedCol = _specialColorEditor.get_vueBases().getTable() - .getSelectedColumn(); - - _selectedColor = _specialColorEditor.getCurrentColor(); - - _selectedColTitle = _specialColorEditor.get_vueBases() - .getSpecialTableModel().getColumnName(_selectedCol); - BaseList lb = _specialColorEditor.get_vueBases().getDataAt(_selectedRow); - for(ModeleBase mb: lb.getBases()) - { - applyColor(_selectedColTitle, _selectedColor,mb); - } - _specialColorEditor.get_vueBases().get_vp().repaint(); - } - } - - - private void applyColor(String titreCol, Color couleur, ModeleBase mb) { - if (titreCol.equals("Inner Color")) { - mb.getStyleBase() - .setBaseInnerColor(couleur); - } else if (titreCol.equals("Outline Color")) { - mb.getStyleBase() - .setBaseOutlineColor(couleur); - } else if (titreCol.equals("Name Color")) { - mb.getStyleBase() - .setBaseNameColor(couleur); - } else if (titreCol.equals("Number Color")) { - mb.getStyleBase() - .setBaseNumberColor(couleur); - } - - } - - - @Override - public void componentResized(ComponentEvent e) { - } - - @Override - public void componentMoved(ComponentEvent e) { - } - - @Override - public void componentShown(ComponentEvent e) { - } - - @Override - public void componentHidden(ComponentEvent e) { - - _specialColorEditor.callFireEditingStopped(); // BH SwingJS -- need to catch this - - } - -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurBlinkingThread.java b/src2/fr/orsay/lri/varna/controlers/ControleurBlinkingThread.java deleted file mode 100644 index c01619d..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurBlinkingThread.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - 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.controlers; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.Timer; - -import fr.orsay.lri.varna.VARNAPanel; - -/** - * BH SwingJS converted to Timer mechanism for compatibility with JavaScript - * - */ -public class ControleurBlinkingThread extends Thread implements ActionListener { - public static final long DEFAULT_FREQUENCY = 50; - private long _period; - private VARNAPanel _parent; - private double _minVal, _maxVal, _val, _incr; - private boolean _increasing = true; - private boolean _active = false; - - public ControleurBlinkingThread(VARNAPanel vp) { - this(vp, DEFAULT_FREQUENCY, 0, 1.0, 0.0, 0.2); - } - - public ControleurBlinkingThread(VARNAPanel vp, long period, double minVal, - double maxVal, double val, double incr) { - _parent = vp; - _period = period; - _minVal = minVal; - _maxVal = maxVal; - _incr = incr; - } - - public void setActive(boolean b) { - if (_active == b) - {} - else - { - _active = b; - if (_active) { - interrupt(); - } - } - } - - public boolean getActive() { - return _active; - } - - - public double getVal() { - return _val; - } - - protected final int START = 0; - protected final int LOOP = 1; - protected final int STOP = -1; - - protected int nextMode = START; - private Timer timer; - - - public void interrupt() { - super.interrupt(); - stopTimer(); - run(); - } - - @Override - public void actionPerformed(ActionEvent e) { - run(); - } - public void run() { - // same as: - // while (true) { - // try { - // if (_active) { - // sleep(_period); - // if (_increasing) { - // _val = Math.min(_val + _incr, _maxVal); - // if (_val == _maxVal) { - // _increasing = false; - // } - // } else { - // _val = Math.max(_val - _incr, _minVal); - // if (_val == _minVal) { - // _increasing = true; - // } - // } - // _parent.repaint(); - // } else { - // sleep(10000); - // } - // } catch (InterruptedException e) { - // } - // } - long delay = 0; - while (true) { - try { - switch (nextMode) { - case START: - if (_active) { - delay = _period; - nextMode = LOOP; - } else { - delay = 10000; - nextMode = START; - } - startTimer(delay); - return; - case STOP: - break; - case LOOP: - if (_increasing) { - _val = Math.min(_val + _incr, _maxVal); - if (_val == _maxVal) { - _increasing = false; - } - } else { - _val = Math.max(_val - _incr, _minVal); - if (_val == _minVal) { - _increasing = true; - } - } - _parent.repaint(); - nextMode = START; - continue; - } - sleep(0); - } catch (InterruptedException e) { - // ignore?? - } - break; - } - } - - private void startTimer(long delay) { - stopTimer(); - timer = new Timer((int) delay, this); - timer.setRepeats(false); - timer.start(); - } - - private void stopTimer() { - if (timer != null) { - timer.stop(); - timer = null; - } - } - -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurBorder.java b/src2/fr/orsay/lri/varna/controlers/ControleurBorder.java deleted file mode 100644 index dd54466..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurBorder.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - 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.controlers; - -import java.awt.Dimension; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.views.VueBorder; - - -public class ControleurBorder implements ChangeListener { - - private VueBorder _vb; - - public ControleurBorder(VueBorder vb) { - _vb = vb; - } - - public void stateChanged(ChangeEvent e) { - if (_vb.getDimension().getHeight() < _vb.get_vp().getHeight() - && _vb.getDimension().getWidth() < _vb.get_vp().getWidth()) { - _vb.get_vp().setBorderSize(_vb.getDimension()); - _vb.get_vp().setMinimumSize( - new Dimension(_vb.get_vp().getBorderSize().width * 2, _vb - .get_vp().getBorderSize().height * 2)); - _vb.get_vp().repaint(); - } - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurClicMovement.java b/src2/fr/orsay/lri/varna/controlers/ControleurClicMovement.java deleted file mode 100644 index 4212106..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurClicMovement.java +++ /dev/null @@ -1,688 +0,0 @@ -/* - 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.controlers; - -import java.awt.Component; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Vector; - -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; -import fr.orsay.lri.varna.models.rna.ModeleBasesComparison; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.RNA; - - -/** - * Controller of the mouse click - * - * @author darty - * - */ -public class ControleurClicMovement implements MouseListener, - MouseMotionListener, PopupMenuListener { - private VARNAPanel _vp; - private boolean _presenceMenuSelection; - private JMenu _submenuSelection; - public Point _spawnPoint; - public Point _initialPoint; - public Point _prevPoint; - public Point _currentPoint; - - public static final double MIN_SELECTION_DISTANCE = 40.0; - public static final double HYSTERESIS_DISTANCE = 10.0; - - private ModeleBase _selectedBase = null; - - - public enum MouseStates { - NONE, - MOVE_ELEMENT, - MOVE_OR_SELECT_ELEMENT, - SELECT_ELEMENT, - SELECT_REGION_OR_UNSELECT, - SELECT_REGION, - CREATE_BP, - POPUP_MENU, - MOVE_ANNOTATION, - }; - private MouseStates _currentState = MouseStates.NONE; - - - - public ControleurClicMovement(VARNAPanel _vuep) { - _vp = _vuep; - _vp.getPopup().addPopupMenuListener(this); - _presenceMenuSelection = false; - } - - public void mouseClicked(MouseEvent arg0) { - } - - public void mouseEntered(MouseEvent arg0) { - } - - public void mouseExited(MouseEvent arg0) { - } - - public void mousePressed(MouseEvent arg0) - { - _vp.requestFocus(); - boolean button1 = (arg0.getButton() == MouseEvent.BUTTON1); - boolean button2 = (arg0.getButton() == MouseEvent.BUTTON2); - boolean button3 = (arg0.getButton() == MouseEvent.BUTTON3); - boolean shift = arg0.isShiftDown(); - boolean ctrl = arg0.isControlDown(); - boolean alt = arg0.isAltDown(); - _vp.removeSelectedAnnotation(); - if (button1 && !ctrl && !alt && !shift) - { - if (_vp.isModifiable()) - { - _currentState = MouseStates.MOVE_OR_SELECT_ELEMENT; - if (_vp.getRealCoords() != null - && _vp.getRealCoords().length != 0 - && _vp.getRNA().get_listeBases().size() != 0) - { - _selectedBase = _vp.getNearestBase(arg0.getX(),arg0.getY(),false,false); - TextAnnotation selectedAnnotation = _vp.getNearestAnnotation(arg0.getX(), arg0.getY()); - _initialPoint = new Point(arg0.getX(),arg0.getY()); - _currentPoint = new Point(_initialPoint); - _prevPoint = new Point(_initialPoint); - if (_selectedBase != null) - { - if (_vp.getRNA().get_drawMode() == RNA.DRAW_MODE_RADIATE) - { - _vp.highlightSelectedBase(_selectedBase); - } else { - if (!_vp.getSelectionIndices().contains(_selectedBase.getIndex())) - { - _vp.highlightSelectedBase(_selectedBase); - } - else - { - // Otherwise, keep current selection as it is and move it - } - } - } - else - { - if (selectedAnnotation != null) - { - _currentState = MouseStates.MOVE_ANNOTATION; - _vp.set_selectedAnnotation(selectedAnnotation); - _vp.highlightSelectedAnnotation(); - } - else - { - _vp.clearSelection(); - _selectedBase = null; - _currentState = MouseStates.SELECT_REGION_OR_UNSELECT; - _initialPoint = new Point(arg0.getX(),arg0.getY()); - _prevPoint = new Point(_initialPoint); - _currentPoint = new Point(_initialPoint); - } - } - } - } - } - else if (button1 && ctrl && !alt && !shift) - { - _selectedBase = _vp.getNearestBase(arg0.getX(),arg0.getY(),false,false); - if (_selectedBase != null) - { - _vp.clearSelection(); - _currentState = MouseStates.CREATE_BP; - _vp.highlightSelectedBase(_selectedBase); - _vp.setOriginLink(_vp.logicToPanel(_selectedBase.getCoords())); - _initialPoint = new Point(arg0.getX(),arg0.getY()); - _currentPoint = new Point(_initialPoint); - } - } - else if (button1 && !ctrl && !alt && shift) - { - _currentState = MouseStates.SELECT_ELEMENT; - _initialPoint = new Point(arg0.getX(),arg0.getY()); - _currentPoint = new Point(_initialPoint); - } - else if (button3) - { - _currentState = MouseStates.POPUP_MENU; - if (_presenceMenuSelection) { - _vp.getPopupMenu().removeSelectionMenu(); - } - if ((_vp.getRealCoords() != null) && _vp.getRNA().get_listeBases().size() != 0) { - updateNearestBase(arg0); - // on insere dans le menu les nouvelles options - addMenu(arg0); - if (_vp.get_selectedAnnotation() != null) - _vp.highlightSelectedAnnotation(); - } - // affichage du popup menu - if (_vp.getRNA().get_drawMode() == RNA.DRAW_MODE_LINEAR) { - _vp.getPopup().get_rotation().setEnabled(false); - } else { - _vp.getPopup().get_rotation().setEnabled(true); - } - _vp.getPopup().updateDialog(); - _vp.getPopup().show(_vp, arg0.getX(), arg0.getY()); - } - _vp.repaint(); - } - - public void mouseDragged(MouseEvent me) { - if ((_currentState == MouseStates.MOVE_OR_SELECT_ELEMENT)||(_currentState == MouseStates.MOVE_ELEMENT)) - { - _vp.lockScrolling(); - - _currentState = MouseStates.MOVE_ELEMENT; - // si on deplace la souris et qu'une base est selectionnée - if (_selectedBase != null) { - if (_vp.getRNA().get_drawMode() == RNA.DRAW_MODE_RADIATE) { - _vp.highlightSelectedStem(_selectedBase); - // dans le cas radiale on deplace une helice - _vp.getVARNAUI().UIMoveHelixAtom(_selectedBase.getIndex(), _vp.panelToLogicPoint(new Point2D.Double(me.getX(), me.getY()))); - } else { - // dans le cas circulaire naview ou line on deplace une base - _currentPoint = new Point(me.getX(), me.getY()); - moveSelection(_prevPoint,_currentPoint); - _prevPoint = new Point(_currentPoint); - } - _vp.repaint(); - } - } - else if (_currentState == MouseStates.MOVE_ANNOTATION) - { - if (_vp.get_selectedAnnotation()!=null) - { - Point2D.Double p = _vp.panelToLogicPoint(new Point2D.Double(me.getX(), me.getY())); - _vp.get_selectedAnnotation().setAncrage(p.x,p.y); - _vp.repaint(); - } - } - else if ((_currentState == MouseStates.SELECT_ELEMENT)||(_currentState == MouseStates.SELECT_REGION_OR_UNSELECT)) - { - if (_initialPoint.distance(me.getX(),me.getY())>HYSTERESIS_DISTANCE) - _currentState = MouseStates.SELECT_REGION; - } - else if (_currentState == MouseStates.SELECT_REGION) - { - _currentPoint = new Point(me.getX(),me.getY()); - int minx = Math.min(_currentPoint.x, _initialPoint.x); - int miny = Math.min(_currentPoint.y, _initialPoint.y); - int maxx = Math.max(_currentPoint.x, _initialPoint.x); - int maxy = Math.max(_currentPoint.y, _initialPoint.y); - _vp.setSelectionRectangle(new Rectangle(minx,miny,maxx-minx,maxy-miny)); - } - else if (_currentState == MouseStates.CREATE_BP) - { - if (_initialPoint.distance(me.getX(),me.getY())>HYSTERESIS_DISTANCE) - { - ModeleBase newSelectedBase = _vp.getNearestBase(me.getX(),me.getY(),false,false); - _vp.setHoverBase(newSelectedBase); - if (newSelectedBase==null) - { - _vp.setDestinationLink(new Point2D.Double(me.getX(),me.getY())); - _vp.clearSelection(); - _vp.addToSelection(_selectedBase.getIndex()); - } - else - { - ModeleBase mborig = _selectedBase; - _vp.clearSelection(); - _vp.addToSelection(newSelectedBase.getIndex()); - _vp.addToSelection(mborig.getIndex()); - _vp.setDestinationLink(_vp.logicToPanel(newSelectedBase.getCoords())); - } - _vp.repaint(); - } - - } - } - - - public void mouseReleased(MouseEvent arg0) { - if (arg0.getButton() == MouseEvent.BUTTON1) - { - _vp.fireBaseClicked(_selectedBase, arg0); - //System.out.println(""+_currentState); - - if (_currentState == MouseStates.MOVE_ELEMENT) - { - _vp.clearSelection(); - _selectedBase = null; - _vp.unlockScrolling(); - _vp.removeSelectedAnnotation(); - } - else if (_currentState == MouseStates.SELECT_REGION_OR_UNSELECT) - { - _vp.clearSelection(); - _selectedBase = null; - _vp.removeSelectedAnnotation(); - } - else if (_currentState == MouseStates.SELECT_ELEMENT) - { - if (_vp.getRealCoords() != null - && _vp.getRealCoords().length != 0 - && _vp.getRNA().get_listeBases().size() != 0) - { - int selectedIndex = _vp.getNearestBaseIndex(arg0.getX(),arg0.getY(),false,false); - if (selectedIndex !=-1) - { - _vp.toggleSelection(selectedIndex); - } - } - _selectedBase = null; - } - else if (_currentState == MouseStates.SELECT_REGION) - { - _vp.removeSelectionRectangle(); - } - else if (_currentState == MouseStates.CREATE_BP) - { - if (_initialPoint.distance(arg0.getX(),arg0.getY())>HYSTERESIS_DISTANCE) - { - int selectedIndex = _vp.getNearestBaseIndex(arg0.getX(),arg0.getY(),false,false); - if (selectedIndex>=0) - { - ModeleBase mb = _vp.getNearestBase(arg0.getX(),arg0.getY(),false,false); - ModeleBase mborig = _selectedBase; - ModeleBP msbp = new ModeleBP(mb,mborig); - if (mb!=mborig) - { - _vp.getVARNAUI().UIAddBP(mb.getIndex(),mborig.getIndex(),msbp); - } - } - } - _vp.removeLink(); - _vp.clearSelection(); - _vp.repaint(); - } - else - { - _vp.clearSelection(); - } - - } - _currentState = MouseStates.NONE; - _vp.repaint(); - } - - - private void addMenu(MouseEvent arg0) { - // creation du menu - _submenuSelection = new JMenu("Selection"); - addCurrent(); - // ajout des option sur base - addMenuBase(); - // ajout des option sur paire de base - if (_vp.getRNA().get_listeBases().get(_vp.getNearestBase()) - .getElementStructure() != -1) { - addMenuBasePair(); - } - - // detection renflement - detectBulge(); - // detection 3' - detect3Prime(); - // detection 5' - detect5Prime(); - // detection boucle - detectLoop(); - // detection d'helice - detectHelix(); - // detection tige - detectStem(); - // Ajout de toutes bases - addAllBase(); - // detection d'annotation - detectAnnotation(arg0); - - _vp.getPopup().addSelectionMenu(_submenuSelection); - _presenceMenuSelection = true; - } - - private void detectAnnotation(MouseEvent arg0) { - if (_vp.getListeAnnotations().size() != 0) { - double dist = Double.MAX_VALUE; - double d2; - Point2D.Double position; - for (TextAnnotation textAnnot : _vp.getListeAnnotations()) { - // calcul de la distance - position = textAnnot.getCenterPosition(); - position = _vp.transformCoord(position); - d2 = Math.sqrt(Math.pow((position.x - arg0.getX()), 2) - + Math.pow((position.y - arg0.getY()), 2)); - // si la valeur est inferieur au minimum actuel - if (dist > d2) { - _vp.set_selectedAnnotation(textAnnot); - dist = d2; - } - } - _submenuSelection.addSeparator(); - _vp.getPopup().addAnnotationMenu(_submenuSelection,true); - } - } - - private void detectBulge() { - int indiceB = _vp.getNearestBase(); - ArrayList indices = _vp.getRNA().findBulge(indiceB); - if ((indices.size() > 0) - && (_vp.getRNA().getHelixCountOnLoop(_vp.getNearestBase()) == 2)) { - JMenu submenuBulge = new JMenu("Bulge"); - submenuBulge.addChangeListener(new ControleurSelectionHighlight( - new Vector(indices), _vp, submenuBulge)); - submenuBulge.setActionCommand("bulge"); - if (!_vp.isModifiable()) - submenuBulge.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenuBulge); - _submenuSelection.add(submenuBulge); - } - } - - private void detectHelix() { - int indiceH = _vp.getNearestBase(); - ArrayList indices = _vp.getRNA().findHelix(indiceH); - if (indices.size() != 0) { - // ajout menu helice - JMenu submenuHelix = new JMenu("Helix"); - submenuHelix.addChangeListener(new ControleurSelectionHighlight( - new Vector(indices), _vp, submenuHelix)); - submenuHelix.setActionCommand("helix"); - if (!_vp.isModifiable()) - submenuHelix.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenuHelix); - submenuHelix.addSeparator(); - _vp.getPopupMenu().addAnnotationMenu(submenuHelix); - _submenuSelection.add(submenuHelix); - } - } - - private void detectStem() { - int indiceS = _vp.getNearestBase(); - ArrayList indices = _vp.getRNA().findStem(indiceS); - if (indices.size() > 0) { - JMenu submenuStem = new JMenu("Stem"); - submenuStem.addChangeListener(new ControleurSelectionHighlight( - new Vector(indices), _vp, submenuStem)); - submenuStem.setActionCommand("stem"); - if (!_vp.isModifiable()) - submenuStem.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenuStem); - _submenuSelection.add(submenuStem); - } - } - - private void detect3Prime() { - // detection 3' - int indice3 = _vp.getNearestBase(); - ArrayList indices = _vp.getRNA().find3Prime(indice3); - if (indices.size() != 0) { - JMenu submenu3Prime = new JMenu("3'"); - submenu3Prime.addChangeListener(new ControleurSelectionHighlight( - new Vector(indices), _vp, submenu3Prime)); - submenu3Prime.setActionCommand("3'"); - if (!_vp.isModifiable()) - submenu3Prime.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenu3Prime); - _submenuSelection.add(submenu3Prime); - } - } - - private void detect5Prime() { - int indice5 = _vp.getNearestBase(); - ArrayList indices = _vp.getRNA().find5Prime(indice5); - if (indices.size() != 0) { - JMenu submenu5Prime = new JMenu("5'"); - submenu5Prime.addChangeListener(new ControleurSelectionHighlight( - new Vector(indices), _vp, submenu5Prime)); - submenu5Prime.setActionCommand("5'"); - if (!_vp.isModifiable()) - submenu5Prime.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenu5Prime); - _submenuSelection.add(submenu5Prime); - } - } - - private void detectLoop() { - int indexL = _vp.getNearestBase(); - if (_vp.getRNA().get_listeBases().get(indexL).getElementStructure() == -1) { - ArrayList listLoop = _vp.getRNA().findLoop(indexL); - JMenu submenuLoop = new JMenu("Loop"); - submenuLoop.addChangeListener(new ControleurSelectionHighlight( - listLoop, _vp, submenuLoop)); - submenuLoop.setActionCommand("loop1"); - if (!_vp.isModifiable()) - submenuLoop.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenuLoop); - submenuLoop.addSeparator(); - _vp.getPopupMenu().addAnnotationMenu(submenuLoop); - _submenuSelection.add(submenuLoop); - } else { - ArrayList listLoop1 = _vp.getRNA().findLoopForward(indexL); - if (listLoop1.size() > 0) { - JMenu submenuLoop1 = new JMenu("Forward loop"); - submenuLoop1 - .addChangeListener(new ControleurSelectionHighlight( - listLoop1, _vp, submenuLoop1)); - submenuLoop1.setActionCommand("loop1"); - if (!_vp.isModifiable()) - submenuLoop1.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenuLoop1); - submenuLoop1.addSeparator(); - _vp.getPopupMenu().addAnnotationMenu(submenuLoop1); - _submenuSelection.add(submenuLoop1); - } - ArrayList listLoop2 = _vp.getRNA() - .findLoopBackward(indexL); - if (listLoop2.size() > 0) { - JMenu submenuLoop2 = new JMenu("Backward loop"); - submenuLoop2 - .addChangeListener(new ControleurSelectionHighlight( - listLoop2, _vp, submenuLoop2)); - submenuLoop2.setActionCommand("loop2"); - if (!_vp.isModifiable()) - submenuLoop2.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenuLoop2); - submenuLoop2.addSeparator(); - _vp.getPopupMenu().addAnnotationMenu(submenuLoop2); - _submenuSelection.add(submenuLoop2); - } - } - } - - private void addCurrent() { - Collection mbs = _vp.getSelection().getBases(); - if (mbs.size()>0) - { - JMenu submenuAll = new JMenu("Current"); - submenuAll.addChangeListener(new ControleurSelectionHighlight( - mbs, _vp, submenuAll)); - submenuAll.setActionCommand("current"); - if (!_vp.isModifiable()) - submenuAll.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenuAll); - _submenuSelection.add(submenuAll); - } - } - - - private void addMenuBase() { - JMenu submenuBase = new JMenu(); - ModeleBase mb = _vp.getRNA().get_listeBases().get(_vp.getNearestBase()); - if (mb instanceof ModeleBasesComparison) { - submenuBase.setText("Base #" + (mb.getBaseNumber()) + ":" - + ((ModeleBasesComparison) mb).getBases()); - } else { - submenuBase.setText("Base #" + (mb.getBaseNumber()) + ":" - + ((ModeleBaseNucleotide) mb).getBase()); - } - submenuBase.addChangeListener(new ControleurSelectionHighlight(mb - .getIndex(), _vp, submenuBase)); - submenuBase.setActionCommand("base"); - // option disponible seulement en mode modifiable - if (!_vp.isModifiable()) - submenuBase.setEnabled(false); - - JMenuItem baseChar = new JMenuItem("Edit base"); - baseChar.setActionCommand("baseChar"); - baseChar.addActionListener(_vp.getPopupMenu().get_controleurMenu()); - submenuBase.add(baseChar); - _vp.getPopupMenu().addColorOptions(submenuBase); - submenuBase.addSeparator(); - _vp.getPopupMenu().addAnnotationMenu(submenuBase); - _submenuSelection.add(submenuBase); - } - - private void addAllBase() { - ArrayList indices = _vp.getRNA().findAll(); - JMenu submenuAll = new JMenu("All"); - submenuAll.addChangeListener(new ControleurSelectionHighlight( - new Vector(indices), _vp, submenuAll)); - submenuAll.setActionCommand("all"); - if (!_vp.isModifiable()) - submenuAll.setEnabled(false); - _vp.getPopupMenu().addColorOptions(submenuAll); - _submenuSelection.add(submenuAll); - } - - private void addMenuBasePair() { - int indiceBP = _vp.getNearestBase(); - ArrayList indices = _vp.getRNA().findPair(indiceBP); - ModeleBase base = _vp.getRNA() - .get_listeBases().get(_vp.getNearestBase()); - if (base.getElementStructure() != -1) { - JMenu submenuBasePair = new JMenu(); - ModeleBase partner = _vp - .getRNA().get_listeBases().get( - base.getElementStructure()); - submenuBasePair - .addChangeListener(new ControleurSelectionHighlight( - indices, _vp, submenuBasePair)); - submenuBasePair.setText("Base pair #(" - + (Math.min(base.getBaseNumber(), partner - .getBaseNumber())) - + "," - + (Math.max(base.getBaseNumber(), partner - .getBaseNumber())) + ")"); - submenuBasePair.setActionCommand("bp"); - // option disponible seulement en mode modifiable - if (!_vp.isModifiable()) - submenuBasePair.setEnabled(false); - - JMenuItem basepair = new JMenuItem("Edit BP"); - basepair.setActionCommand("basepair"); - basepair.addActionListener(_vp.getPopupMenu() - .get_controleurMenu()); - - _vp.getPopupMenu().addColorOptions(submenuBasePair); - Component[] comps = submenuBasePair.getMenuComponents(); - int offset = -1; - for (int i = 0; i < comps.length; i++) { - Component c = comps[i]; - if (c instanceof JMenuItem) { - JMenuItem jmi = (JMenuItem) c; - if (jmi.getActionCommand().contains(",BPColor")) { - offset = i; - } - } - } - if (offset != -1) { - submenuBasePair.insert(basepair, offset); - } else { - submenuBasePair.add(basepair); - } - _submenuSelection.add(submenuBasePair); - } - } - - private void updateNearestBase(MouseEvent arg0) { - int i = _vp.getNearestBaseIndex(arg0.getX(),arg0.getY(),true,false); - if (i!=-1) - _vp.setNearestBase(i); - } - - - - - public void mouseMoved(MouseEvent arg0) { - _selectedBase = _vp.getNearestBase(arg0.getX(),arg0.getY()); - TextAnnotation selectedAnnotation = _vp.getNearestAnnotation(arg0.getX(),arg0.getY()); - _vp.setHoverBase(_selectedBase); - if (_selectedBase != null) - { - } - else if (selectedAnnotation!=null) - { - _vp.set_selectedAnnotation(selectedAnnotation); - _vp.highlightSelectedAnnotation(); - _vp.repaint(); - } - _vp.setLastSelectedPosition(new Point2D.Double(arg0.getX(),arg0.getY())); - } - - - - private void moveSelection(Point prev, Point cur) - { - Point2D.Double p1 = _vp.panelToLogicPoint(new Point2D.Double(prev.x,prev.y)); - Point2D.Double p2 = _vp.panelToLogicPoint(new Point2D.Double(cur.x,cur.y)); - double dx = (p2.x - p1.x); - double dy = (p2.y - p1.y); - - if (_vp.isModifiable()) - { - double ndx = dx; - double ndy = dy; - if (_vp.getRNA().get_drawMode() == RNA.DRAW_MODE_LINEAR) - { - ndy=0.0; - } - _vp.getVARNAUI().UIShiftBaseCoord(_vp.getSelectionIndices(), ndx, ndy); - _vp.fireLayoutChanged(); - - } - } - - - public void popupMenuCanceled(PopupMenuEvent arg0) { - } - - public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) { - _vp.resetAnnotationHighlight(); - _selectedBase = null; - } - - public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) { - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurDemoTextField.java b/src2/fr/orsay/lri/varna/controlers/ControleurDemoTextField.java deleted file mode 100644 index fd87fc6..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurDemoTextField.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - 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.controlers; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.Stack; - -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.DefaultHighlighter; -import javax.swing.text.Highlighter; - -import fr.orsay.lri.varna.applications.VARNAOnlineDemo; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; - -/** - * It controls the sequence and structure text fields and changes their color if - * they have different lengths or unbalanced parentheses. - * - * @author darty - * - */ -public class ControleurDemoTextField implements CaretListener { - private VARNAOnlineDemo _vod; - private String _oldSeq, _oldStruct; - private Highlighter _hilit; - private Highlighter.HighlightPainter _painter; - private final Color COLORERROR = Color.RED; - private final Color COLORWARNING = Color.ORANGE; - - public ControleurDemoTextField(VARNAOnlineDemo VOD) { - _vod = VOD; - _oldSeq = _vod.get_seq().getText(); - _oldStruct = _vod.get_struct().getText(); - _hilit = new DefaultHighlighter(); - _painter = new DefaultHighlighter.DefaultHighlightPainter(Color.BLACK); - _vod.get_struct().setHighlighter(_hilit); - } - - // if there is any change - public void caretUpdate(CaretEvent e) { - if (_oldStruct != _vod.get_struct().getText() - || _oldSeq != _vod.get_seq().getText()) { - ArrayList infos = new ArrayList(); - _vod.get_info().removeAll(); - _hilit.removeAllHighlights(); - _oldStruct = _vod.get_struct().getText(); - _oldSeq = _vod.get_seq().getText(); - int nbPO = 0, nbPF = 0; - // compte les parentheses ouvrantes et fermantes - Stack p = new Stack(); - boolean pb = false; - for (int i = 0; i < _vod.get_struct().getText().length(); i++) { - if (_vod.get_struct().getText().charAt(i) == '(') { - nbPO++; - p.push(i); - } else if (_vod.get_struct().getText().charAt(i) == ')') { - nbPF++; - if (p.size() == 0) { - try { - _hilit.addHighlight(i, i + 1, _painter); - } catch (BadLocationException e1) { - _vod.get_varnaPanel().errorDialog(e1); - } - pb = true; - } else - p.pop(); - } - } - - // si le nombre de parentheses ouvrantes/fermantes est different - if (pb || p.size() > 0) { - // colorie en rouge - if (pb) { - infos.add("too many closing parentheses"); - } - if (p.size() > 0) { - int indice; - while (!p.isEmpty()) { - indice = p.pop(); - try { - _hilit.addHighlight(indice, indice + 1, _painter); - } catch (BadLocationException e1) { - _vod.get_varnaPanel().errorDialog(e1); - } - } - infos.add("too many opening parentheses"); - } - _vod.get_info().setForeground(COLORERROR); - _vod.get_seq().setForeground(COLORERROR); - _vod.get_struct().setForeground(COLORERROR); - } else { - try { - // redraw the new RNA - _vod.get_varnaPanel().drawRNA(_vod.get_seq().getText(), - _vod.get_struct().getText(), - _vod.get_varnaPanel().getRNA().get_drawMode()); - } catch (ExceptionNonEqualLength e1) { - _vod.get_varnaPanel().errorDialog(e1); - } - // verifie la longueur de la structure et de la sequence - if (_vod.get_seq().getText().length() != _vod.get_struct() - .getText().length()) { - // colorie en orange - infos.add("different lenghts"); - _vod.get_seq().setForeground(COLORWARNING); - _vod.get_struct().setForeground(COLORWARNING); - } else { - // sinon colorie en noir - _vod.get_seq().setForeground(Color.black); - _vod.get_struct().setForeground(Color.black); - } - } - _vod.get_varnaPanel().getVARNAUI().UIReset(); - String info = new String(); - if (infos.size() != 0) { - info += infos.get(0); - for (int i = 1; i < infos.size(); i++) { - info += ", " + infos.get(i); - } - info += "."; - } - _vod.get_info().setText(info); - } - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurDraggedMolette.java b/src2/fr/orsay/lri/varna/controlers/ControleurDraggedMolette.java deleted file mode 100644 index 8668faa..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurDraggedMolette.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - 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.controlers; - -import java.awt.Point; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; - -import fr.orsay.lri.varna.VARNAPanel; - - -/** - * Controller of the mouse for scroll wheel click and dragged events - * - * @author darty - * - */ -public class ControleurDraggedMolette implements MouseListener, - MouseMotionListener { - private VARNAPanel _vp; - /** - * true if the right button is pressed
- * false if not - */ - private static Boolean _rightButtonClick; - /** - * The vector which contains the direction of the mouse movement - */ - private static Point _direction; - /** - * The position of the cursor before the mouse drag - */ - private static Point _avant; - /** - * The position of the cursor after the mouse drag - */ - private static Point _apres; - - public ControleurDraggedMolette(VARNAPanel vp) { - _vp = vp; - _rightButtonClick = false; - _avant = _apres = _direction = new Point(); - } - - public void mouseDragged(MouseEvent e) { - // si le bon boutton a été pressé - if (_rightButtonClick) { - _apres = e.getPoint(); - _direction = new Point(_apres.x - _avant.x, _apres.y - _avant.y); - _vp.setTranslation(new Point(_vp.getTranslation().x + _direction.x, - _vp.getTranslation().y + _direction.y)); - _avant = _apres; - _vp.checkTranslation(); - _vp.repaint(); - } - } - - public void mouseMoved(MouseEvent e) { - } - - public void mouseClicked(MouseEvent e) { - } - - public void mouseEntered(MouseEvent e) { - } - - public void mouseExited(MouseEvent e) { - } - - public void mousePressed(MouseEvent e) { - // lors du clic, la position du curseur est enregistrée - _avant = e.getPoint(); - // si le boutton molette est pressé ou si le boutton gauche et shift - // sont pressés - if (e.getButton() == MouseEvent.BUTTON2) - { - _rightButtonClick = true; - } - else - { - _rightButtonClick = false; - } - - - } - - public void mouseReleased(MouseEvent e) { - // si le boutton molette est relaché ou si le boutton gauche et shift - // sont relachés - if (e.getButton() == MouseEvent.BUTTON2) - _rightButtonClick = false; - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurGlobalRescale.java b/src2/fr/orsay/lri/varna/controlers/ControleurGlobalRescale.java deleted file mode 100644 index 7e464b6..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurGlobalRescale.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - 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.controlers; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.VARNAEdits; -import fr.orsay.lri.varna.views.VueGlobalRescale; -import fr.orsay.lri.varna.views.VueGlobalRotation; - - -public class ControleurGlobalRescale implements ChangeListener { - - private VueGlobalRescale _vGR; - private double _oldScale; - private VARNAPanel _vp; - - public ControleurGlobalRescale(VueGlobalRescale vGR, VARNAPanel vp) { - _vGR = vGR; - _oldScale = 1.0; - _vp = vp; - } - - public void stateChanged(ChangeEvent e) { - _vp.getVARNAUI().UIGlobalRescale(_vGR.getScale()/_oldScale); - _oldScale = _vGR.getScale(); - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurGlobalRotation.java b/src2/fr/orsay/lri/varna/controlers/ControleurGlobalRotation.java deleted file mode 100644 index e3dc8a8..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurGlobalRotation.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - 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.controlers; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.VARNAEdits; -import fr.orsay.lri.varna.views.VueGlobalRotation; - - -public class ControleurGlobalRotation implements ChangeListener { - - private VueGlobalRotation _vGR; - private double _oldAngle; - private VARNAPanel _vp; - - public ControleurGlobalRotation(VueGlobalRotation vGR, VARNAPanel vp) { - _vGR = vGR; - _oldAngle = 0; - _vp = vp; - } - - public void stateChanged(ChangeEvent e) { - _vp.getVARNAUI().UIGlobalRotation(_vGR.getAngle() - _oldAngle); - _oldAngle = _vGR.getAngle(); - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurInterpolator.java b/src2/fr/orsay/lri/varna/controlers/ControleurInterpolator.java deleted file mode 100644 index 827f762..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurInterpolator.java +++ /dev/null @@ -1,660 +0,0 @@ -/* - 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.controlers; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.Vector; - -import javax.swing.Timer; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.exceptions.MappingException; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.RNA; - -public class ControleurInterpolator extends Thread implements ActionListener { - - private static final int START = 0; - private static final int LOOP = 1; - private static final int END = 2; - - VARNAPanel _vpn; - protected int _numSteps = 25; // BH SwingJS - private long _timeDelay = /** @j2sNative 2 || */15; - private boolean _running = false; - Targets _d = new Targets(); - protected int _step; // BH SwingJS - protected boolean _firstHalf; // BH SwingJS - - public ControleurInterpolator(VARNAPanel vpn) { - _vpn = vpn; - } - - public synchronized void addTarget(RNA target, Mapping mapping) { - addTarget(target, null, mapping); - } - - - public synchronized void addTarget(RNA target, VARNAConfig conf, Mapping mapping) { - _d.add(new TargetsHolder(target,conf,mapping)); - } - - public synchronized void addTarget(RNA target) { - addTarget(target, null, Mapping.DefaultOutermostMapping(_vpn.getRNA() - .get_listeBases().size(), target.get_listeBases().size())); - } - - public boolean isInterpolationInProgress() - { - return _running; - } - - private Point2D.Double computeDestination(Point2D pli, Point2D pri, - Point2D pi, int i, int n, Point2D plf, Point2D prf) { - Point2D.Double plm = new Point2D.Double( - (pli.getX() + plf.getX()) / 2.0, - (pli.getY() + plf.getY()) / 2.0); - Point2D.Double prm = new Point2D.Double( - (pri.getX() + prf.getX()) / 2.0, - (pri.getY() + prf.getY()) / 2.0); - Point2D.Double pm = new Point2D.Double(((n - i) * plm.getX() + i - * prm.getX()) - / n, ((n - i) * plm.getY() + i * prm.getY()) / n); - Point2D.Double v = new Point2D.Double(pm.getX() - pi.getX(), pm.getY() - - pi.getY()); - Point2D.Double pf = new Point2D.Double(pi.getX() + 2.0 * v.getX(), pi - .getY() - + 2.0 * v.getY()); - return pf; - } - - private Vector> clusterIndices(int numIndices, - int[] mappedIndices) throws MappingException { - int[] indices = new int[numIndices]; - for (int i = 0; i < numIndices; i++) { - indices[i] = i; - } - return clusterIndices(indices, mappedIndices); - } - - /** - * Builds and returns an interval array, alternating unmatched regions and - * matched indices. Namely, returns a vector of vector such that the vectors - * found at odd positions contain those indices that are NOT associated with - * any other base in the current mapping. On the other hand, vectors found - * at even positions contain only one mapped index.
- * Ex: If indices=[1,2,3,4,5] and mappedIndices= - * [2,5] then the function will return - * [[1],[2],[3,4],[5],[]]. - * - * @param indices - * The total list of indices - * @param mappedIndices - * Matched indices, should be a subset of indices - * @return A clustered array - * @throws MappingException - * If one of the parameters is an empty array - */ - private Vector> clusterIndices(int[] indices, - int[] mappedIndices) throws MappingException { - if ((mappedIndices.length == 0) || (indices.length == 0)) { - throw new MappingException( - "Mapping Error: Cannot cluster indices in an empty mapping"); - } - Vector> res = new Vector>(); - - Arrays.sort(indices); - Arrays.sort(mappedIndices); - int i, j = 0, k; - Vector tmp = new Vector(); - for (i = 0; (i < indices.length) && (j < mappedIndices.length); i++) { - if (indices[i] == mappedIndices[j]) { - res.add(tmp); - tmp = new Vector(); - tmp.add(indices[i]); - res.add(tmp); - tmp = new Vector(); - j++; - } else { - tmp.add(indices[i]); - } - } - k = i; - for (i = k; (i < indices.length); i++) { - tmp.add(indices[i]); - } - res.add(tmp); - return res; - } - - - - public void run() { - while (true) - { - TargetsHolder d = _d.get(); - _running = true; - try{ - nextTarget(d.target,d.conf,d.mapping); - } - catch(Exception e) - { - System.err.println(e); - e.printStackTrace(); - } - _running = false; - /** - * @j2sNative - * - * break; - */ - } - - } - - /** - * Compute the centroid of the RNA bases that have their indexes - * in the given array. - */ - private static Point2D.Double computeCentroid(ArrayList rnaBases, int[] indexes) { - double centroidX = 0, centroidY = 0; - for (int i=0; i= maxnumsteps) { - // If things go bad (for example f''(x) keeps being 0) - // we need to give up after what we consider to be too many steps. - // In practice this can happen only in pathological cases - // like f being constant, which is very unlikely. - result = x_n_plus_1; - break; - } - x_n = x_n_plus_1; - } - - // We now have either found the min or the max at x = result. - // If we have the max at x we know the min is at x+pi. - if (f(result + Math.PI) < f(result)) { - result = result + Math.PI; - } - - return result; - } - - - } - - - /** - * We suppose we have two lists of points. The coordinates of the first - * list of points are X1 and Y1, and X2 and Y2 for the second list. - * We suppose that the centroids of [X1,Y1] and [X2,Y2] are both (0,0). - * This function computes the rotation to apply to the second set of - * points such that the RMSD (Root mean square deviation) between them - * is minimum. The returned angle is in radians. - */ - private static double minimizeRotateRMSD(double[] X1, double[] Y1, double[] X2, double[] Y2) { - MinimizeRMSD minimizer = new MinimizeRMSD(X1, Y1, X2, Y2); - return minimizer.computeOptimalTheta(); - } - - - /** - * Move rna2 using a rotation so that it would move as little as possible - * (in the sense that we minimize the RMSD) when transforming - * it to rna1 using the given mapping. - */ - public static void moveNearOtherRNA(RNA rna1, RNA rna2, Mapping mapping) { - int[] rna1MappedElems = mapping.getSourceElems(); - int[] rna2MappedElems = mapping.getTargetElems(); - ArrayList rna1Bases = rna1.get_listeBases(); - ArrayList rna2Bases = rna2.get_listeBases(); - int n = rna1MappedElems.length; - - // If there is less than 2 points, it is useless to rotate the RNA. - if (n < 2) return; - - // We can now assume that n >= 2. - - // Compute the centroids of both RNAs - Point2D.Double rna1MappedElemsCentroid = computeCentroid(rna1Bases, rna1MappedElems); - Point2D.Double rna2MappedElemsCentroid = computeCentroid(rna2Bases, rna2MappedElems); - - // Compute the optimal rotation - // We first compute coordinates for both RNAs, changing the origins - // to be the centroids. - double[] X1 = new double[rna1MappedElems.length]; - double[] Y1 = new double[rna1MappedElems.length]; - double[] X2 = new double[rna2MappedElems.length]; - double[] Y2 = new double[rna2MappedElems.length]; - for (int i=0; i currBases = source.get_listeBases(); - ArrayList destBases = _target.get_listeBases(); - Vector> intArrSource = new Vector>(); - Vector> intArrTarget = new Vector>(); - // Building interval arrays - intArrSource = clusterIndices(currBases.size(), _mapping - .getSourceElems()); - intArrTarget = clusterIndices(destBases.size(), _mapping - .getTargetElems()); - - // Duplicating source and target coordinates - final Point2D.Double[] initPosSource = new Point2D.Double[currBases - .size()]; - final Point2D.Double[] finalPosTarget = new Point2D.Double[destBases - .size()]; - - for (int i = 0; i < currBases.size(); i++) { - Point2D tmp = currBases.get(i).getCoords(); - initPosSource[i] = new Point2D.Double(tmp.getX(), tmp.getY()); - } - for (int i = 0; i < destBases.size(); i++) { - Point2D tmp = destBases.get(i).getCoords(); - finalPosTarget[i] = new Point2D.Double(tmp.getX(), tmp.getY()); - } - - /** - * Assigning final (Source) and initial (Target) coordinates - */ - final Point2D.Double[] finalPosSource = new Point2D.Double[initPosSource.length]; - final Point2D.Double[] initPosTarget = new Point2D.Double[finalPosTarget.length]; - // Final position of source model - for (int i = 0; i < finalPosSource.length; i++) { - if (_mapping.getPartner(i) != Mapping.UNKNOWN) { - Point2D dest; - dest = finalPosTarget[_mapping.getPartner(i)]; - finalPosSource[i] = new Point2D.Double(dest.getX(), dest - .getY()); - } - } - - for (int i = 0; i < intArrSource.size(); i += 2) { - int matchedNeighborLeft, matchedNeighborRight; - if (i == 0) { - matchedNeighborLeft = intArrSource.get(1).get(0); - matchedNeighborRight = intArrSource.get(1).get(0); - } else if (i == intArrSource.size() - 1) { - matchedNeighborLeft = intArrSource.get( - intArrSource.size() - 2).get(0); - matchedNeighborRight = intArrSource.get( - intArrSource.size() - 2).get(0); - } else { - matchedNeighborLeft = intArrSource.get(i - 1).get(0); - matchedNeighborRight = intArrSource.get(i + 1).get(0); - } - Vector v = intArrSource.get(i); - for (int j = 0; j < v.size(); j++) { - int index = v.get(j); - finalPosSource[index] = computeDestination( - initPosSource[matchedNeighborLeft], - initPosSource[matchedNeighborRight], - initPosSource[index], j + 1, v.size() + 1, - finalPosSource[matchedNeighborLeft], - finalPosSource[matchedNeighborRight]); - } - } - for (int i = 0; i < initPosTarget.length; i++) { - if (_mapping.getAncestor(i) != Mapping.UNKNOWN) { - Point2D dest; - dest = initPosSource[_mapping.getAncestor(i)]; - initPosTarget[i] = new Point2D.Double(dest.getX(), dest.getY()); - } - } - for (int i = 0; i < intArrTarget.size(); i += 2) { - int matchedNeighborLeft, matchedNeighborRight; - if (i == 0) { - matchedNeighborLeft = intArrTarget.get(1).get(0); - matchedNeighborRight = intArrTarget.get(1).get(0); - } else if (i == intArrTarget.size() - 1) { - matchedNeighborLeft = intArrTarget.get( - intArrTarget.size() - 2).get(0); - matchedNeighborRight = intArrTarget.get( - intArrTarget.size() - 2).get(0); - } else { - matchedNeighborLeft = intArrTarget.get(i - 1).get(0); - matchedNeighborRight = intArrTarget.get(i + 1).get(0); - } - Vector v = intArrTarget.get(i); - for (int j = 0; j < v.size(); j++) { - int index = v.get(j); - initPosTarget[index] = computeDestination( - finalPosTarget[matchedNeighborLeft], - finalPosTarget[matchedNeighborRight], - finalPosTarget[index], j + 1, v.size() + 1, - initPosTarget[matchedNeighborLeft], - initPosTarget[matchedNeighborRight]); - } - } - - mode = START; - _loop = new Runnable(){ - - @Override - public void run() { - int i = _step; - RNA current = (_firstHalf ? source : _target); - if (i == _numSteps / 2) { - _vpn.showRNA(_target); - current = _target; - _firstHalf = false; - if (_conf!=null) - {_vpn.setConfig(_conf);} - - for (int j = 0; j < initPosSource.length; j++) { - source.setCoord(j, initPosSource[j]); - } - } - ArrayList currBases = current.get_listeBases(); - for (int j = 0; j < currBases.size(); j++) { - ModeleBase m = currBases.get(j); - Point2D mpc, mnc; - if (_firstHalf) { - mpc = initPosSource[j]; - mnc = finalPosSource[j]; - } else { - mpc = initPosTarget[j]; - mnc = finalPosTarget[j]; - } - m.setCoords(new Point2D.Double(((_numSteps - 1 - i) - * mpc.getX() + (i) * mnc.getX()) - / (_numSteps - 1), ((_numSteps - 1 - i) - * mpc.getY() + i * mnc.getY()) - / (_numSteps - 1))); - } - _vpn.repaint(); - } - - }; - actionPerformed(null); - } else { - _end.run(); - } - } catch (MappingException e) { - e.printStackTrace(); - _end.run(); - }catch (Exception e) { - e.printStackTrace(); - _end.run(); - } - - - } - - private class TargetsHolder - { - public RNA target; - public VARNAConfig conf; - public Mapping mapping; - public TargetsHolder(RNA t, VARNAConfig c, Mapping m) - { - target = t; - conf = c; - mapping = m; - } - } - - private class Targets - { - LinkedList _d = new LinkedList(); - public Targets() { - // BH j2s SwingJS added only to remove Eclipse warning - } - public synchronized void add(TargetsHolder d) - { - _d.addLast(d); - - @SuppressWarnings("unused") - Runnable interpolator = ControleurInterpolator.this; - /** - * BH SwingJS no notify() - * @j2sNative - * - * interpolator.run(); - * - */ - { - notify(); - } - } - - public synchronized TargetsHolder get() { - - /** - * BH SwingJS no wait() - * - * @j2sNative - * - * - */ - { - while (_d.size() == 0) { - try { - wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - TargetsHolder x = _d.getLast(); - _d.clear(); - return x; - } - } - - - @Override - public void actionPerformed(ActionEvent e) { - runAnimation(); - } - - private int mode; - - private void runAnimation() { - switch (mode) { - case START: - _firstHalf = true; - _step = 0; - mode = LOOP; - // Fall through - case LOOP: - if (_step < _numSteps) { - _loop.run(); - ++_step; - break; - } - mode = END; - // Fall through - case END: - _end.run(); - return; - } - Timer t = new Timer((int) _timeDelay, this); - t.setRepeats(false); - t.start(); - // try { - // for (int i = 0; i < _numSteps; i++) { - // _step = i; - // loop.run(); - // - // sleep(_timeDelay); - // } - // end.run(); - // } catch (InterruptedException e) { - // e.printStackTrace(); - // end.run(); - // } - } - -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurJCheckBoxMenuItem.java b/src2/fr/orsay/lri/varna/controlers/ControleurJCheckBoxMenuItem.java deleted file mode 100644 index 825c58c..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurJCheckBoxMenuItem.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - 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.controlers; - -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; - -import fr.orsay.lri.varna.VARNAPanel; - - -/** - * Controller of check box menu items to repaint if item state changes - * - * @author darty - * - */ -public class ControleurJCheckBoxMenuItem implements ItemListener { - - private VARNAPanel _vp; - - public ControleurJCheckBoxMenuItem(VARNAPanel v) { - _vp = v; - } - - public void itemStateChanged(ItemEvent e) { - _vp.repaint(); - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurMenu.java b/src2/fr/orsay/lri/varna/controlers/ControleurMenu.java deleted file mode 100644 index 22c082f..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurMenu.java +++ /dev/null @@ -1,738 +0,0 @@ -/* - 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.controlers; - - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.text.ParseException; -import java.util.ArrayList; - -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JColorChooser; -import javax.swing.JOptionPane; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.exceptions.ExceptionExportFailed; -import fr.orsay.lri.varna.exceptions.ExceptionJPEGEncoding; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; -import fr.orsay.lri.varna.exceptions.ExceptionWritingForbidden; -import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.RNA; -import fr.orsay.lri.varna.views.VueBPThickness; -import fr.orsay.lri.varna.views.VueMenu; - -/** - * This listener controls menu items - * - * @author darty - * - */ -public class ControleurMenu implements InterfaceVARNAListener, - ActionListener { - - private VARNAPanel _vp; - @SuppressWarnings("unused") - private VueMenu _vm; - private String _type; - private String _color; - private Object _source; - - /** - * Creates the menu listener - * - * @param _varnaPanel - * The VARNAPanel - */ - public ControleurMenu(VARNAPanel _varnaPanel, VueMenu _vueMenu) { - _vp = _varnaPanel; - _vm = _vueMenu; - _vp.getRNA().addVARNAListener(this); - } - - public void actionPerformed(ActionEvent e) { - String[] temp = e.getActionCommand().split(","); - _source = e.getSource(); - _type = temp[0]; - if (temp.length > 1) - _color = temp[1]; - else - _color = ""; - // selon l'option choisie dans le menu: - if (!optionRedraw()) - if (!optionExport()) - if (!optionImport()) - if (!optionRNADisplay()) - if (!optionTitle()) - if (!optionColorMap()) - if (!optionView()) - if (!optionBase()) - if (!optionBasePair()) - if (!optionLoop()) - if (!option3prime()) - if (!option5prime()) - if (!optionHelix()) - if (!optionStem()) - if (!optionBulge()) - if (!optionAnnotation()) - if (!optionEditRNA()) - _vp.errorDialog(new Exception("Uknown action command '"+_type+"'")); - } - - private boolean optionEditRNA() - { - if (_type.equals("editallbps")) { - _vp.getVARNAUI().UIEditAllBasePairs(); - } - else if (_type.equals("editallbases")) { - _vp.getVARNAUI().UIEditAllBases(); - } - else return false; - return true; - } - - private boolean optionAnnotation() { - if (!_type.contains("annotation")) - return false; - // a partir du menu principale (gestion des annotations) - if (_type.equals("annotationsaddPosition")) { - _vp.getVARNAUI().UIAnnotationsAddPosition(_vp.getPopup().getSpawnPoint().x,_vp.getPopup().getSpawnPoint().y); - } else if (_type.equals("annotationsaddBase")) { - _vp.getVARNAUI().UIAnnotationsAddBase(_vp.getPopup().getSpawnPoint().x,_vp.getPopup().getSpawnPoint().y); - } else if (_type.equals("annotationsaddLoop")) { - _vp.getVARNAUI().UIAnnotationsAddLoop(_vp.getPopup().getSpawnPoint().x,_vp.getPopup().getSpawnPoint().y); - } else if (_type.equals("annotationsaddChemProb")) { - _vp.getVARNAUI().UIAnnotationsAddChemProb(_vp.getPopup().getSpawnPoint().x,_vp.getPopup().getSpawnPoint().y); - } else if (_type.equals("annotationsaddRegion")) { - _vp.getVARNAUI().UIAnnotationsAddRegion(_vp.getPopup().getSpawnPoint().x,_vp.getPopup().getSpawnPoint().y); - } else if (_type.equals("annotationsaddHelix")) { - _vp.getVARNAUI().UIAnnotationsAddHelix(_vp.getPopup().getSpawnPoint().x,_vp.getPopup().getSpawnPoint().y); - } else if (_type.equals("annotationsautohelices")) { - _vp.getVARNAUI().UIAutoAnnotateHelices(); - } else if (_type.equals("annotationsautointerior")) { - _vp.getVARNAUI().UIAutoAnnotateInteriorLoops(); - } else if (_type.equals("annotationsautoterminal")) { - _vp.getVARNAUI().UIAutoAnnotateTerminalLoops(); - } else if (_type.equals("annotationsautohelices")) { - _vp.getVARNAUI().UIAutoAnnotateHelices(); - } else if (_type.equals("annotationsremove")) { - _vp.getVARNAUI().UIAnnotationsRemove(); - } else if (_type.equals("annotationsautoextremites")) { - _vp.getVARNAUI().UIAutoAnnotateStrandEnds(); - } else if (_type.equals("annotationsedit")) { - _vp.getVARNAUI().UIAnnotationsEdit(); - // a partir du menu selection (annotation la plus proche) - } else if (_type.equals("Selectionannotationremove")) { - _vp.getVARNAUI().UIAnnotationRemoveFromAnnotation(_vp.get_selectedAnnotation()); - } else if (_type.equals("Selectionannotationedit")) { - _vp.getVARNAUI().UIAnnotationEditFromAnnotation(_vp.get_selectedAnnotation()); - - // a partir d'une structure(base, loop, helix) dans l'arn - // (annotation li� a la structure) - } else if (_type.endsWith("annotationadd")||_type.contains("annotationremove")||_type.contains("annotationedit")) - { - try { - TextAnnotation.AnchorType type = trouverAncrage(); - ArrayList listeIndex = new ArrayList(); - switch(type) - { - case BASE: - listeIndex.add(_vp.getNearestBase()); - case LOOP: - if (_type.startsWith("loop1")) - listeIndex = _vp.getRNA().findLoopForward(_vp.getNearestBase()); - else if (_type.startsWith("loop2")) - listeIndex = _vp.getRNA().findLoopBackward(_vp.getNearestBase()); - else - listeIndex = _vp.getRNA().findLoop(_vp.getNearestBase()); - break; - case HELIX: - listeIndex = _vp.getRNA().findHelix(_vp.getNearestBase()); - break; - } - if (_type.endsWith("annotationadd")) - { _vp.getVARNAUI().UIAnnotationAddFromStructure(type,listeIndex); } - else if (_type.contains("annotationremove")) - { _vp.getVARNAUI().UIAnnotationRemoveFromStructure(trouverAncrage(),listeIndex); } - else if (_type.contains("annotationedit")) - { _vp.getVARNAUI().UIAnnotationEditFromStructure(trouverAncrage(),listeIndex); } - - } catch (Exception e2) { - e2.printStackTrace(); - } - } else - return false; - return true; - } - - private TextAnnotation.AnchorType trouverAncrage() { - if (_type.contains("loop")) - return TextAnnotation.AnchorType.LOOP; - if (_type.contains("helix")) - return TextAnnotation.AnchorType.HELIX; - if (_type.contains("base")) - return TextAnnotation.AnchorType.BASE; - errorDialog(new Exception("probleme d'identification de l'ancrage")); - return TextAnnotation.AnchorType.POSITION; - } - - private boolean option5prime() { - return colorBases(); - } - - private boolean option3prime() { - return colorBases(); - } - - private boolean optionBulge() { - return colorBases(); - } - - private boolean optionStem() { - return colorBases(); - } - - private boolean optionHelix() { - return colorBases(); - } - - private boolean colorBases() { - // System.out.println(_type); - ArrayList listBase = new ArrayList(); - String phrase = "Choose new " + _type; - if (_color.equals("InnerColor")) { - phrase += " inner color"; - Color c = JColorChooser.showDialog(_vp, phrase, - VARNAConfig.BASE_INNER_COLOR_DEFAULT); - if (c != null) { - listBase = listSwitchType(_type); - for (int i = 0; i < listBase.size(); i++) { - _vp.getRNA().get_listeBases().get(listBase.get(i)) - .getStyleBase().setBaseInnerColor(c); - } - _vp.repaint(); - } - } else if (_color.equals("OutlineColor")) { - phrase += " outline color"; - Color c = JColorChooser.showDialog(_vp, phrase, - VARNAConfig.BASE_OUTLINE_COLOR_DEFAULT); - if (c != null) { - listBase = listSwitchType(_type); - for (int i = 0; i < listBase.size(); i++) { - _vp.getRNA().get_listeBases().get(listBase.get(i)) - .getStyleBase().setBaseOutlineColor(c); - } - _vp.repaint(); - } - } else if (_color.equals("NameColor")) { - phrase += " name color"; - Color c = JColorChooser.showDialog(_vp, phrase, - VARNAConfig.BASE_NAME_COLOR_DEFAULT); - if (c != null) { - listBase = listSwitchType(_type); - for (int i = 0; i < listBase.size(); i++) { - _vp.getRNA().get_listeBases().get(listBase.get(i)) - .getStyleBase().setBaseNameColor(c); - } - _vp.repaint(); - } - } else if (_color.equals("NumberColor")) { - phrase += " number color"; - Color c = JColorChooser.showDialog(_vp, phrase, - VARNAConfig.BASE_NUMBER_COLOR_DEFAULT); - if (c != null) { - listBase = listSwitchType(_type); - for (int i = 0; i < listBase.size(); i++) { - _vp.getRNA().get_listeBases().get(listBase.get(i)) - .getStyleBase().setBaseNumberColor(c); - } - _vp.repaint(); - } - } else if (_color.equals("BPColor")) { - phrase += " base-pair color"; - Color c = JColorChooser.showDialog(_vp, phrase, - VARNAConfig.BASE_NUMBER_COLOR_DEFAULT); - if (c != null) { - listBase = listSwitchType(_type); - for (int i = 0; i < listBase.size(); i++) - { - for (ModeleBP msbp:_vp.getRNA().getBPsAt(listBase.get(i))) - { - if (msbp!=null) { - msbp.getStyle().setCustomColor(c); - } - } - } - _vp.repaint(); - } - } else if (_color.equals("BPColor")) { - phrase += " base-pair color"; - Color c = JColorChooser.showDialog(_vp, phrase, - VARNAConfig.BASE_NUMBER_COLOR_DEFAULT); - if (c != null) { - listBase = listSwitchType(_type); - for (int i = 0; i < listBase.size(); i++) { - ModeleBase mb = _vp.getRNA().get_listeBases().get( - listBase.get(i)); - if (mb.getElementStructure() != -1) { - mb.getStyleBP().getStyle().setCustomColor(c); - } - } - _vp.repaint(); - } - } else if (_color.equals("BPThickness")) { - listBase = listSwitchType(_type); - // System.out.println(listBase.size()); - ArrayList styleBPs = new ArrayList(); - for (int i = 0; i < listBase.size(); i++) { - ModeleBase mb = _vp.getRNA().get_listeBases().get( - listBase.get(i)); - if (mb.getElementStructure() != -1) { - styleBPs.add(mb.getStyleBP()); - } - } - VueBPThickness vbpt = new VueBPThickness(_vp, styleBPs); - if (JOptionPane.showConfirmDialog(_vp, vbpt.getPanel(), - "Set base pair(s) thickness", JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION) { - vbpt.restoreThicknesses(); - _vp.repaint(); - } - } else - return false; - return true; - } - - private ArrayList listSwitchType(String _type) { - if (_type.equals("helix")) - return _vp.getRNA().findHelix(_vp.getNearestBase()); - if (_type.equals("current")) { - return _vp.getSelectionIndices(); - } - if (_type.equals("allBases")) { - return _vp.getRNA().findAll(); - } - if (_type.equals("loop1")) { - return _vp.getRNA().findLoopForward(_vp.getNearestBase()); - } - if (_type.equals("loop2")) { - return _vp.getRNA().findLoopBackward(_vp.getNearestBase()); - } - if (_type.equals("stem")) - return _vp.getRNA().findStem(_vp.getNearestBase()); - if (_type.equals("base")) { - ArrayList list = new ArrayList(); - list.add(_vp.getNearestBase()); - return list; - } - if (_type.equals("basepair") || _type.equals("bpcolor") - || _type.equals("bp")) { - ArrayList list = new ArrayList(); - int i = _vp.getNearestBase(); - list.add(i); - ModeleBase mb = _vp.getRNA().get_listeBases().get(i); - int j = mb.getElementStructure(); - if (mb.getElementStructure() != -1) { - list.add(i); - list.add(j); - } - return list; - } - if (_type.equals("5'")) - return _vp.getRNA().findNonPairedBaseGroup(_vp.getNearestBase()); - if (_type.equals("3'")) - return _vp.getRNA().findNonPairedBaseGroup(_vp.getNearestBase()); - if (_type.equals("bulge")) - return _vp.getRNA().findNonPairedBaseGroup(_vp.getNearestBase()); - if (_type.equals("all")) - return _vp.getRNA().findAll(); - return new ArrayList(); - } - - private boolean optionLoop() { - return colorBases(); - } - - private boolean optionBase() { - if (_type.equals("baseChar")) { - _vp.getVARNAUI().UISetBaseCharacter(); - return true; - } else { - return colorBases(); - } - } - - private boolean optionBasePair() { - if (_type.equals("basepair")) { - _vp.getVARNAUI().UIEditBasePair(); - return true; - } else if (_type.equals("bpcolor")) { - _vp.getVARNAUI().UIColorBasePair(); - return true; - } else if (_type.equals("thickness")) { - _vp.getVARNAUI().UIThicknessBasePair(); - return true; - } - return false; - } - - - - private boolean optionView() { - if (_type.equals("background")) { - _vp.getVARNAUI().UISetBackground(); - } else if (_type.equals("shownc")) { - _vp.getVARNAUI().UIToggleShowNCBP(); - } else if (_type.equals("showbackbone")) { - _vp.getVARNAUI().UIToggleDrawBackbone(); - } else if (_type.equals("shownp")) { - _vp.getVARNAUI().UIToggleShowNonPlanar(); - } else if (_type.equals("spaceBetweenBases")) { - _vp.getVARNAUI().UISetSpaceBetweenBases(); - } else if (_type.equals("bpheightincrement")) { - _vp.getVARNAUI().UISetBPHeightIncrement(); - } else if (_type.equals("borderSize")) { - _vp.getVARNAUI().UISetBorder(); - } else if (_type.startsWith("zoom")) { - if (_type.equals("zoom")) { - _vp.getVARNAUI().UICustomZoom(); - } else { - String factor = _type.substring("zoom".length()); - double pc = Integer.parseInt(factor); - pc /= 100.0; - _vp.setZoom(new Double(pc)); - _vp.repaint(); - } - } else if (_type.equals("rotation")) { - _vp.getVARNAUI().UIGlobalRotation(); - } else if (_type.equals("rescale")) { - _vp.getVARNAUI().UIGlobalRescale(); - } else - return false; - return true; - } - - - private boolean optionTitle() { - if (_type.equals("titleDisplay")) { - _vp.getVARNAUI().UISetTitleFont(); - } else if (_type.equals("setTitle")) { - _vp.getVARNAUI().UISetTitle(); - } else if (_type.equals("titleColor")) { - _vp.getVARNAUI().UISetTitleColor(); - } else - return false; - return true; - } - - - private boolean optionColorMap() { - if (_type.equals("toggleshowcolormap")) { - _vp.getVARNAUI().UIToggleColorMap(); - } else if (_type.equals("colormapcaption")) { - _vp.getVARNAUI().UISetColorMapCaption(); - } else if (_type.equals("colormapstyle")) { - _vp.getVARNAUI().UISetColorMapStyle(); - } else if (_type.equals("colormaploadvalues")) { - _vp.getVARNAUI().UILoadColorMapValues(); - } else if (_type.equals("colormapvalues")) { - _vp.getVARNAUI().UISetColorMapValues(); - } else - return false; - return true; - } - - private boolean optionRNADisplay() { - // les options d'affichages generales - if (_type.equals("gaspin")) { - _vp.getVARNAUI().UIToggleGaspinMode(); - } else if (_type.equals("backbone")) { - _vp.getVARNAUI().UISetBackboneColor(); - } else if (_type.equals("bonds")) { - Color c = JColorChooser.showDialog(_vp, "Choose new bonds color", - _vp.getBackground()); - if (c != null) { - _vp.setDefaultBPColor(c); - _vp.repaint(); - } - } else if (_type.equals("basecolorforBP")) { - if (_source != null) { - if (_source instanceof JCheckBoxMenuItem) { - JCheckBoxMenuItem check = (JCheckBoxMenuItem) _source; - _vp.setUseBaseColorsForBPs(check.getState()); - _vp.repaint(); - } - } - } else if (_type.equals("bpstyle")) { - _vp.getVARNAUI().UISetBPStyle(); - } else if (_type.equals("specialbasecolored")) { - _vp.getVARNAUI().UIToggleColorSpecialBases(); - } else if (_type.equals("showwarnings")) { - _vp.getVARNAUI().UIToggleShowWarnings(); - } else if (_type.equals("dashbasecolored")) { - _vp.getVARNAUI().UIToggleColorGapsBases(); - } else if (_type.equals("numPeriod")) { - _vp.getVARNAUI().UISetNumPeriod(); - } else if (_type.equals("eachKind")) { - if (_vp.getRNA().get_listeBases() != null) { - _vp.getVARNAUI().UIBaseTypeColor(); - } else { - _vp.emitWarning("No base"); - } - } else if (_type.equals("eachCouple")) { - if (_vp.getRNA().get_listeBases() != null - && _vp.getRNA().get_listeBases().size() != 0) { - _vp.getVARNAUI().UIBasePairTypeColor(); - } else { - _vp.emitWarning("No base"); - } - } else if (_type.equals("eachBase")) { - if (_vp.getRNA().get_listeBases() != null - && _vp.getRNA().get_listeBases().size() != 0) { - _vp.getVARNAUI().UIBaseAllColor(); - } else { - _vp.emitWarning("No base"); - } - } else if (_type.equals("specialBasesColor")) { - _vp.getVARNAUI().UIPickSpecialBasesColor(); - } else if (_type.equals("dashBasesColor")) { - _vp.getVARNAUI().UIPickGapsBasesColor(); - } else - return colorBases(); - return true; - } - - private boolean optionImport() { - if (_type.equals("userInput")) { - try { - _vp.getVARNAUI().UIManualInput(); - } catch (ParseException e1) { - errorDialog(e1); - } catch (ExceptionNonEqualLength e2) { - errorDialog(e2); - } - } else if (_type.equals("file")) { - try { - _vp.getVARNAUI().UIFile(); - } catch (ExceptionNonEqualLength e1) { - errorDialog(e1); - } - } else if (_type.equals("print")) { - _vp.getVARNAUI().UIPrint(); - } else if (_type.equals("about")) { - _vp.getVARNAUI().UIAbout(); - } else - return false; - return true; - } - - private boolean optionRedraw() { - if (_type.equals("reset")) { - _vp.getVARNAUI().UIReset(); - } else if (_type.equals("circular")) { - _vp.getVARNAUI().UICircular(); - } else if (_type.equals("radiate")) { - _vp.getVARNAUI().UIRadiate(); - } else if (_type.equals("naview")) { - _vp.getVARNAUI().UINAView(); - } else if (_type.equals("varnaview")) { - _vp.getVARNAUI().UIVARNAView(); - } else if (_type.equals("motifview")) { - _vp.getVARNAUI().UIMOTIFView(); - } else if (_type.equals("line")) { - _vp.getVARNAUI().UILine(); - } else if (_type.equals("flat")) { - _vp.getVARNAUI().UIToggleFlatExteriorLoop(); - } else - return false; - return true; - } - - private boolean optionExport() { - if (_type.equals("saveas")) { - try { - _vp.getVARNAUI().UISaveAs(); - } catch (ExceptionExportFailed e1) { - errorDialog(e1); - } catch (ExceptionPermissionDenied e1) { - errorDialog(e1); - } - } else if (_type.equals("dbn")) { - try { - _vp.getVARNAUI().UISaveAsDBN(); - } catch (ExceptionExportFailed e) { - errorDialog(e); - } catch (ExceptionPermissionDenied e) { - errorDialog(e); - } - } else if (_type.equals("bpseq")) { - try { - _vp.getVARNAUI().UISaveAsBPSEQ(); - } catch (ExceptionExportFailed e) { - errorDialog(e); - } catch (ExceptionPermissionDenied e) { - errorDialog(e); - } - } else if (_type.equals("ct")) { - try { - _vp.getVARNAUI().UISaveAsCT(); - } catch (ExceptionExportFailed e) { - errorDialog(e); - } catch (ExceptionPermissionDenied e) { - errorDialog(e); - } - } else if (_type.equals("eps")) { - try { - _vp.getVARNAUI().UIExportEPS(); - } catch (ExceptionWritingForbidden e1) { - errorDialog(e1); - } catch (ExceptionExportFailed e) { - errorDialog(e); - } - } else if (_type.equals("tikz")) { - try { - _vp.getVARNAUI().UIExportTIKZ(); - } catch (ExceptionWritingForbidden e1) { - errorDialog(e1); - } catch (ExceptionExportFailed e) { - errorDialog(e); - } - } else if (_type.equals("xfig")) { - try { - _vp.getVARNAUI().UIExportXFIG(); - } catch (ExceptionWritingForbidden e1) { - errorDialog(e1); - } catch (ExceptionExportFailed e) { - errorDialog(e); - } - } else if (_type.equals("svg")) { - try { - _vp.getVARNAUI().UIExportSVG(); - } catch (ExceptionWritingForbidden e1) { - errorDialog(e1); - } catch (ExceptionExportFailed e) { - errorDialog(e); - } - } else if (_type.equals("jpeg")) { - try { - _vp.getVARNAUI().UIExportJPEG(); - } catch (ExceptionJPEGEncoding e1) { - errorDialog(e1); - } catch (ExceptionExportFailed e1) { - errorDialog(e1); - } - } else if (_type.equals("png")) { - try { - _vp.getVARNAUI().UIExportPNG(); - } catch (ExceptionExportFailed e1) { - errorDialog(e1); - } - } else - return false; - return true; - } - - /** - * Return the extension of a file, it means the string after the last dot of - * the file name - * - * @param f - * The file - * @return null if the file name have no dot
- * ext if the file name contains a dot - */ - public String getExtension(File f) { - String s = f.getName(); - return getExtension(s); - } - - /** - * Return the extension of a string, it means the string after the last dot - * of the path - * - * @param s - * The strnig o the path - * @return null if the path have no dot
- * ext if the path contains a dot - */ - public String getExtension(String s) { - String ext = null; - int i = s.lastIndexOf('.'); - - if (i > 0 && i < s.length() - 1) { - ext = s.substring(i + 1).toLowerCase(); - } - return ext; - } - - /** - * Open an error message dialog with the exception message - * - * @param e1 - * The Exception - */ - public void errorDialog(Exception e1) { - if (_vp.isErrorsOn()) - JOptionPane.showMessageDialog(_vp, e1.getMessage(), "VARNA Error", - JOptionPane.ERROR_MESSAGE); - } - - public void onStructureRedrawn() { - // TODO Auto-generated method stub - - } - - public void onWarningEmitted(String s) { - if (_vp.isErrorsOn()) - JOptionPane.showMessageDialog(_vp,s, "VARNA Warning", - JOptionPane.ERROR_MESSAGE); - } - - public void onLoad(String path) { - // TODO Auto-generated method stub - - } - - public void onLoaded() { - // TODO Auto-generated method stub - - } - - public void onUINewStructure(VARNAConfig v, RNA r) { - // TODO Auto-generated method stub - - } - - public void onZoomLevelChanged() { - // TODO Auto-generated method stub - - } - - public void onTranslationChanged() { - // TODO Auto-generated method stub - - } - - -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurMolette.java b/src2/fr/orsay/lri/varna/controlers/ControleurMolette.java deleted file mode 100644 index 5783525..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurMolette.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - 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.controlers; - -import java.awt.Point; -import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; - -import fr.orsay.lri.varna.VARNAPanel; - - -/** - * Listener which control the zoom-in and zoom-out with mouse wheel. - * - * @author DARTY Kevin - */ -public class ControleurMolette implements MouseWheelListener { - - private VARNAPanel _vp; - public ControleurMolette(VARNAPanel vuep) { - _vp = vuep; - } - - public void mouseWheelMoved(MouseWheelEvent e) { - if (_vp.isFocusOwner()) - { - // Roulement vers le haut => zoom in - if (e.getWheelRotation() == -1) { - _vp.getVARNAUI().UIZoomIn(); - } - // Roulement vers le bas => zoom out - else { - _vp.getVARNAUI().UIZoomOut(); - } - } - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurNumPeriod.java b/src2/fr/orsay/lri/varna/controlers/ControleurNumPeriod.java deleted file mode 100644 index 5a6aca8..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurNumPeriod.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - 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.controlers; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.views.VueNumPeriod; - - -public class ControleurNumPeriod implements ChangeListener { - - private VueNumPeriod _vnp; - - public ControleurNumPeriod(VueNumPeriod vnp) { - _vnp = vnp; - } - - public void stateChanged(ChangeEvent e) { - _vnp.get_vp().setNumPeriod(_vnp.getNumPeriod()); - _vnp.get_vp().repaint(); - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurScriptParser.java b/src2/fr/orsay/lri/varna/controlers/ControleurScriptParser.java deleted file mode 100644 index 4688f91..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurScriptParser.java +++ /dev/null @@ -1,551 +0,0 @@ -package fr.orsay.lri.varna.controlers; - -import java.awt.Color; -import java.io.StreamTokenizer; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Vector; - -import javax.swing.JOptionPane; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation.ChemProbAnnotationType; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; -import fr.orsay.lri.varna.models.rna.RNA; - -public class ControleurScriptParser { - private static String SCRIPT_ERROR_PREFIX = "Error"; - - - private static class Command{ - Function _f; - Vector _argv; - public Command(Function f, Vector argv) - { - _f = f; - _argv = argv; - } - }; - - private static abstract class Argument{ - ArgumentType _t; - - public Argument(ArgumentType t) - { - _t = t; - } - - public ArgumentType getType() - { - return _t; - } - - public abstract String toString(); - - }; - - - private static class NumberArgument extends Argument{ - Number _val; - public NumberArgument(Number val) - { - super(ArgumentType.NUMBER_TYPE); - _val = val; - } - public Number getNumber() - { - return _val; - } - public String toString() - { - return _val.toString(); - } - }; - - private static class ColorArgument extends Argument{ - Color _val; - public ColorArgument(Color val) - { - super(ArgumentType.COLOR_TYPE); - _val = val; - } - public Color getColor() - { - return _val; - } - public String toString() - { - return _val.toString(); - } - }; - - private static class BooleanArgument extends Argument{ - boolean _val; - public BooleanArgument(boolean val) - { - super(ArgumentType.BOOLEAN_TYPE); - _val = val; - } - public boolean getBoolean() - { - return _val; - } - public String toString() - { - return ""+_val; - } - }; - - private static class StringArgument extends Argument{ - String _val; - public StringArgument(String val) - { - super(ArgumentType.STRING_TYPE); - _val = val; - } - public String toString() - { - return _val.toString(); - } - }; - - private static class ArrayArgument extends Argument{ - Vector _val; - public ArrayArgument(Vector val) - { - super(ArgumentType.ARRAY_TYPE); - _val = val; - } - public int getSize() - { - return _val.size(); - } - public Argument getArgument(int i) - { - return _val.get(i); - } - public String toString() - { - return _val.toString(); - } - }; - - - private enum ArgumentType{ - STRING_TYPE, - NUMBER_TYPE, - BOOLEAN_TYPE, - ARRAY_TYPE, - COLOR_TYPE - }; - - - private enum Function{ - ADD_CHEM_PROB("addchemprob",new ArgumentType[] {ArgumentType.NUMBER_TYPE,ArgumentType.NUMBER_TYPE,ArgumentType.STRING_TYPE,ArgumentType.NUMBER_TYPE,ArgumentType.COLOR_TYPE,ArgumentType.BOOLEAN_TYPE}), - ERASE_SEQ("eraseseq",new ArgumentType[] {}), - RESET_CHEM_PROB("resetchemprob",new ArgumentType[] {}), - SET_COLOR_MAP_MIN("setcolormapminvalue",new ArgumentType[]{ArgumentType.NUMBER_TYPE}), - SET_COLOR_MAP_MAX("setcolormapmaxvalue",new ArgumentType[]{ArgumentType.NUMBER_TYPE}), - SET_COLOR_MAP("setcolormap",new ArgumentType[]{ArgumentType.STRING_TYPE}), - SET_CUSTOM_COLOR_MAP("setcustomcolormap",new ArgumentType[]{ArgumentType.ARRAY_TYPE}), - SET_SEQ("setseq",new ArgumentType[]{ArgumentType.STRING_TYPE}), - SET_STRUCT("setstruct",new ArgumentType[]{ArgumentType.STRING_TYPE}), - SET_STRUCT_SMOOTH("setstructsmooth",new ArgumentType[] {ArgumentType.STRING_TYPE}), - SET_TITLE("settitle",new ArgumentType[] {ArgumentType.STRING_TYPE}), - SET_RNA("setrna",new ArgumentType[]{ArgumentType.STRING_TYPE,ArgumentType.STRING_TYPE}), - SET_RNA_SMOOTH("setrnasmooth",new ArgumentType[]{ArgumentType.STRING_TYPE,ArgumentType.STRING_TYPE}), - SET_SELECTION("setselection",new ArgumentType[]{ArgumentType.ARRAY_TYPE}), - SET_VALUES("setvalues",new ArgumentType[]{ArgumentType.ARRAY_TYPE}), - TOGGLE_SHOW_COLOR_MAP("toggleshowcolormap",new ArgumentType[]{}), - REDRAW("redraw",new ArgumentType[] {ArgumentType.STRING_TYPE}), - UNKNOWN("N/A",new ArgumentType[] {}); - - String _funName; - ArgumentType[] _args; - Function(String funName, ArgumentType[] args) - { - _funName = funName; - _args = args; - } - ArgumentType[] getPrototype() - { - return this._args; - } - String getFunName() - { - return this._funName; - } - - }; - - private static Hashtable _name2Fun = new Hashtable(); - private static Hashtable _fun2Prot = new Hashtable(); - - - private static void initFunctions() - { - if (_name2Fun.size()>0) - { return; } - Function[] funs = Function.values(); - for(int i=0;i cmds = parseScript(cmdtxt); - for(int i=0;i vals = new ArrayList(); - for (int j=0;j parseArguments(StreamTokenizer st, boolean parType) throws Exception - { - Vector result = new Vector(); - while((st.ttype!=')' && parType) || (st.ttype!=']' && !parType)) - { - st.nextToken(); - //System.out.println(""+ (parType?"Par.":"Bra.")+" "+(char)st.ttype); - switch(st.ttype) - { - case(StreamTokenizer.TT_NUMBER): - { - result.add(new NumberArgument(st.nval)); - } - break; - case(StreamTokenizer.TT_WORD): - { - Color c = parseColor(st.sval); - if (c!=null) - { - result.add(new ColorArgument(c)); - } - else - { - Boolean b = parseBoolean(st.sval); - if (b!=null) - { - result.add(new BooleanArgument(b)); - } - else - { - result.add(new StringArgument(st.sval)); - } - } - } - break; - case('"'): - { - result.add(new StringArgument(st.sval)); - } - break; - case('['): - { - result.add(new ArrayArgument(parseArguments(st, false))); - } - break; - case('('): - { - result.add(new ArrayArgument(parseArguments(st, true))); - } - break; - case(')'): - { - if (parType) - return result; - else - throw new Exception(SCRIPT_ERROR_PREFIX+": Opening "+(parType?"parenthesis":"bracket")+" matched with a closing "+(!parType?"parenthesis":"bracket")); - } - case(']'): - { - if (!parType) - return result; - else - throw new Exception(SCRIPT_ERROR_PREFIX+": Opening "+(parType?"parenthesis":"bracket")+" matched with a closing "+(!parType?"parenthesis":"bracket")); - } - case(','): - break; - case(StreamTokenizer.TT_EOF): - { - throw new Exception(SCRIPT_ERROR_PREFIX+": Unmatched opening "+(parType?"parenthesis":"bracket")); - } - - } - } - return result; - } - - - private static Command parseCommand(String cmd) throws Exception - { - int cut = cmd.indexOf("("); - if (cut==-1) - { - throw new Exception(SCRIPT_ERROR_PREFIX+": Syntax error"); - } - String fun = cmd.substring(0,cut); - Function f = getFunction(fun); - if (f==Function.UNKNOWN) - { throw new Exception(SCRIPT_ERROR_PREFIX+": Unknown function \""+fun+"\""); } - StreamTokenizer st = new StreamTokenizer(new StringReader(cmd.substring(cut+1))); - st.eolIsSignificant(false); - st.parseNumbers(); - st.quoteChar('\"'); - st.ordinaryChar('='); - st.ordinaryChar(','); - st.ordinaryChar('['); - st.ordinaryChar(']'); - st.ordinaryChar('('); - st.ordinaryChar(')'); - st.wordChars('#', '#'); - Vector argv = parseArguments(st,true); - checkArgs(f,argv); - Command result = new Command(f,argv); - return result; - } - - private static boolean checkArgs(Function f, Vector argv) throws Exception - { - ArgumentType[] argtypes = getPrototype(f); - if (argtypes.length!=argv.size()) - throw new Exception(SCRIPT_ERROR_PREFIX+": Wrong number of argument for function \""+f+"\"."); - for (int i=0;i parseScript(String cmd) throws Exception - { - initFunctions(); - Vector cmds = new Vector(); - String[] data = cmd.split(";"); - for (int i=0;i _selection; - private VARNAPanel _target; - private JMenuItem _parent; - - public ControleurSelectionHighlight(int elem, VARNAPanel v, JMenuItem parent) { - ArrayList sel = new ArrayList(); - sel.add(elem); - _selection = v.getRNA().getBasesAt(sel); - _target = v; - _parent = parent; - } - - public ControleurSelectionHighlight(Vector sel, VARNAPanel v, - JMenuItem parent) { - this(new ArrayList(sel), v, parent); - } - - public ControleurSelectionHighlight(ArrayList sel, VARNAPanel v, - JMenuItem parent) { - this(v.getRNA().getBasesAt(sel),v,parent); - } - - public ControleurSelectionHighlight(Collection sel, VARNAPanel v, - JMenuItem parent) { - _selection = sel; - _target = v; - _parent = parent; - } - - public void stateChanged(ChangeEvent e) { - if (_parent.isSelected()) { - _target.saveSelection(); - _target.setSelection(_selection); - } else { - _target.restoreSelection(); - } - - } - -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurSliderLabel.java b/src2/fr/orsay/lri/varna/controlers/ControleurSliderLabel.java deleted file mode 100644 index c78544e..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurSliderLabel.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - 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.controlers; - -import javax.swing.JLabel; -import javax.swing.JSlider; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -public class ControleurSliderLabel implements ChangeListener { - - private JLabel _l; - private double _factor = 1.0; - - public ControleurSliderLabel(JLabel zoomAmountValueLabel) { - _l = zoomAmountValueLabel; - _factor = 1.0; - } - - public ControleurSliderLabel(JLabel zoomAmountValueLabel, boolean percent) { - _l = zoomAmountValueLabel; - if (percent) - _factor = 0.01; - } - - public ControleurSliderLabel(JLabel zoomAmountValueLabel, double factor) { - _l = zoomAmountValueLabel; - _factor = factor; - } - - public void stateChanged(ChangeEvent e) { - double value = ((JSlider) e.getSource()).getValue(); - value *= _factor; - _l.setText(String.valueOf(value)); - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurSpaceBetweenBases.java b/src2/fr/orsay/lri/varna/controlers/ControleurSpaceBetweenBases.java deleted file mode 100644 index 2ae40a1..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurSpaceBetweenBases.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - 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.controlers; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.views.VueSpaceBetweenBases; - - -public class ControleurSpaceBetweenBases implements ChangeListener { - - private VueSpaceBetweenBases _vsbb; - - public ControleurSpaceBetweenBases(VueSpaceBetweenBases vsbb) { - _vsbb = vsbb; - } - - public void stateChanged(ChangeEvent e) { - _vsbb.get_vp().setSpaceBetweenBases(_vsbb.getSpace()); - _vsbb.get_vp().drawRNA(); - _vsbb.get_vp().repaint(); - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurTableAnnotations.java b/src2/fr/orsay/lri/varna/controlers/ControleurTableAnnotations.java deleted file mode 100644 index 5db2797..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurTableAnnotations.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - 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.controlers; - -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; - -import javax.swing.JTable; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation; -import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; -import fr.orsay.lri.varna.views.VueAnnotation; -import fr.orsay.lri.varna.views.VueChemProbAnnotation; -import fr.orsay.lri.varna.views.VueHighlightRegionEdit; - - -/** - * Mouse action and motion listener for AnnotationTableModel - * - * @author Darty@lri.fr - * - */ -public class ControleurTableAnnotations implements MouseListener, - MouseMotionListener { - public static final int REMOVE = 0, EDIT = 1; - private JTable _table; - private VARNAPanel _vp; - private int _type; - - /** - * - * @param table - * @param vp - * @param type - * : REMOVE = 0, EDIT = 1 - */ - public ControleurTableAnnotations(JTable table, VARNAPanel vp, int type) { - _table = table; - _vp = vp; - _type = type; - } - - public void mouseClicked(MouseEvent arg0) { - switch (_type) { - case EDIT: - edit(); - break; - case REMOVE: - remove(); - break; - default: - break; - } - } - - /** - * if remove case - */ - private void remove() { - _vp.set_selectedAnnotation(null); - Object o = _table.getValueAt(_table.getSelectedRow(), 0); - if (o instanceof TextAnnotation) { - if (!_vp.removeAnnotation((TextAnnotation) o)) - _vp.errorDialog(new Exception("Impossible de supprimer")); - _table.setValueAt("Deleted!", _table.getSelectedRow(), 0); - } - else if (o instanceof ChemProbAnnotation) { - _vp.getRNA().removeChemProbAnnotation((ChemProbAnnotation) o); - _table.setValueAt("Deleted!", _table.getSelectedRow(), 0); - } - else if (o instanceof HighlightRegionAnnotation) { - _vp.getRNA().removeHighlightRegion((HighlightRegionAnnotation) o); - _table.setValueAt("Deleted!", _table.getSelectedRow(), 0); - } - _vp.repaint(); - } - - /** - * if edit case - */ - private void edit() { - Object o = _table.getValueAt(_table - .getSelectedRow(), 0); - if (o instanceof TextAnnotation) - { - TextAnnotation textAnnot = (TextAnnotation) o; - VueAnnotation vueAnnotation; - vueAnnotation = new VueAnnotation(_vp, textAnnot, false); - vueAnnotation.show(); - }else if (o instanceof HighlightRegionAnnotation) - { - HighlightRegionAnnotation annot = (HighlightRegionAnnotation) o; - HighlightRegionAnnotation an = annot.clone(); - VueHighlightRegionEdit vueAnnotation = new VueHighlightRegionEdit(_vp,annot); - if (!vueAnnotation.show()) - { - annot.setBases(an.getBases()); - annot.setFillColor(an.getFillColor()); - annot.setOutlineColor(an.getOutlineColor()); - annot.setRadius(an.getRadius()); - } - }else if (o instanceof ChemProbAnnotation) - { - ChemProbAnnotation annot = (ChemProbAnnotation) o; - ChemProbAnnotation an = annot.clone(); - VueChemProbAnnotation vueAnnotation = new VueChemProbAnnotation(_vp,annot); - if (!vueAnnotation.show()) - { - annot.setColor(an.getColor()); - annot.setIntensity(an.getIntensity()); - annot.setType(an.getType()); - annot.setOut(an.isOut()); - } - } - - } - - public void mouseEntered(MouseEvent arg0) { - } - - public void mouseExited(MouseEvent arg0) { - _vp.set_selectedAnnotation(null); - _vp.repaint(); - } - - public void mousePressed(MouseEvent arg0) { - } - - public void mouseReleased(MouseEvent arg0) { - } - - public void mouseDragged(MouseEvent arg0) { - } - - /** - * update selected annotation - */ - public void mouseMoved(MouseEvent arg0) { - if (_table.rowAtPoint(arg0.getPoint()) < 0) - return; - Object o = _table.getValueAt(_table.rowAtPoint(arg0.getPoint()), 0); - if (o.getClass().equals(TextAnnotation.class) - && o != _vp.get_selectedAnnotation()) { - _vp.set_selectedAnnotation((TextAnnotation) o); - _vp.repaint(); - } - } - -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurVARNAPanelKeys.java b/src2/fr/orsay/lri/varna/controlers/ControleurVARNAPanelKeys.java deleted file mode 100644 index 8dc6eac..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurVARNAPanelKeys.java +++ /dev/null @@ -1,412 +0,0 @@ -/* - 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.controlers; - -import java.awt.Point; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.geom.Point2D; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.views.VueUI; - - -/** - * VARNAPanel Shortcuts Controller - * - * @author darty - * - */ -public class ControleurVARNAPanelKeys implements KeyListener, FocusListener { - - private VARNAPanel _vp; - - - public ControleurVARNAPanelKeys(VARNAPanel vp) { - _vp = vp; - } - - public void mouseClicked(MouseEvent e) { - } - - public void mouseEntered(MouseEvent e) { - // prise du focus - //_vp.requestFocus(); - - } - - public void mouseExited(MouseEvent e) { - } - - public void mousePressed(MouseEvent e) { - } - - public void mouseReleased(MouseEvent e) { - } - - public void keyPressed(KeyEvent e) { - boolean controlDown = (e.getModifiersEx() & (KeyEvent.CTRL_DOWN_MASK)) == KeyEvent.CTRL_DOWN_MASK; - boolean shiftDown = (e.getModifiersEx() & (KeyEvent.SHIFT_DOWN_MASK)) == KeyEvent.SHIFT_DOWN_MASK; - boolean altDown = (e.getModifiersEx() & (KeyEvent.ALT_DOWN_MASK)) == KeyEvent.ALT_DOWN_MASK; - VueUI ui = _vp.getVARNAUI(); - try { - switch (e.getKeyCode()) { - case (KeyEvent.VK_A): - if (controlDown) { - ui.UIAbout(); - } - break; - case (KeyEvent.VK_B): - if (controlDown) { - ui.UISetBorder(); - } - else - if (altDown) { - ui.UIToggleDrawBackbone(); - } - break; - case (KeyEvent.VK_C): - if (shiftDown && controlDown) { - ui.UISetColorMapCaption(); - } - break; - case (KeyEvent.VK_D): - if (controlDown) { - if (shiftDown) { - ui.UIPickGapsBasesColor(); - } else { - ui.UIToggleColorGapsBases(); - } - } - break; - case (KeyEvent.VK_E): - if (controlDown) { - ui.UIToggleShowNonPlanar(); - } - break; - case (KeyEvent.VK_F): - if (controlDown) { - ui.UIToggleFlatExteriorLoop(); - } - break; - case (KeyEvent.VK_G): - if (controlDown) { - ui.UISetBackground(); - } - else if (!shiftDown && altDown) { - ui.UIToggleGaspinMode(); - } - break; - case (KeyEvent.VK_H): - if (controlDown && !shiftDown) { - ui.UISetBPHeightIncrement(); - } - else if (controlDown && shiftDown) - { - Point2D.Double p = _vp.getLastSelectedPosition(); - ui.UIAnnotationsAddPosition((int)p.x,(int)p.y); - } - break; - case (KeyEvent.VK_J): - if (controlDown) { - if (shiftDown) { - ui.UIPickSpecialBasesColor(); - } else { - ui.UIToggleColorSpecialBases(); - } - } - break; - case (KeyEvent.VK_K): - if (controlDown && shiftDown) { - ui.UILoadColorMapValues(); - } - else if (controlDown) { - ui.UISetBackboneColor(); - } - break; - case (KeyEvent.VK_L): - if (shiftDown && controlDown) { - ui.UIToggleColorMap(); - } else if (controlDown) - { - ui.UISetColorMapStyle(); - } else if (shiftDown) - { - ui.UISetColorMapValues(); - } - break; - case (KeyEvent.VK_M): - if (controlDown) { - ui.UISetNumPeriod(); - } else if (shiftDown && altDown) { - ui.UIToggleModifiable(); - } - break; - case (KeyEvent.VK_N): - if (controlDown) { - ui.UIManualInput(); - } - break; - case (KeyEvent.VK_O): - if (controlDown) { - ui.UIFile(); - } - break; - case (KeyEvent.VK_P): - if (controlDown && shiftDown) { - ui.UISetBPStyle(); - } - else if (controlDown && !shiftDown) { - ui.UIPrint(); - } - break; - case (KeyEvent.VK_Q): - if (controlDown && !shiftDown && !altDown) { - _vp.getVARNAUI().UIAutoAnnotateHelices(); - } - else if (controlDown && shiftDown && !altDown) { - _vp.getVARNAUI().UIAutoAnnotateTerminalLoops(); - } - else if (!controlDown && shiftDown && altDown) { - _vp.getVARNAUI().UIAutoAnnotateInteriorLoops(); - } - else if (controlDown && !shiftDown && altDown) { - _vp.getVARNAUI().UIAutoAnnotateStrandEnds(); - } - break; - case (KeyEvent.VK_R): - if (controlDown) { - if (shiftDown) { - ui.UIReset(); - } else { - ui.UIGlobalRotation(); - } - } - break; - case (KeyEvent.VK_S): - if (controlDown) { - if (shiftDown) { - ui.UISetSpaceBetweenBases(); - } else { - ui.UISaveAs(); - } - } - break; - case (KeyEvent.VK_T): - if (controlDown) { - if (shiftDown) { - ui.UISetTitleFont(); - } else if (altDown) { - ui.UISetTitleColor(); - } else { - ui.UISetTitle(); - } - } - break; - case (KeyEvent.VK_U): - if (controlDown && !shiftDown && !altDown) { - _vp.getVARNAUI().UIBaseTypeColor(); - } else if (!controlDown && shiftDown && !altDown) { - _vp.getVARNAUI().UIBasePairTypeColor(); - } else if (!controlDown && !shiftDown && altDown) { - _vp.getVARNAUI().UIBaseAllColor(); - } - break; - case (KeyEvent.VK_W): - if (controlDown) { - ui.UIToggleShowNCBP(); - } - break; - case (KeyEvent.VK_X): - if (controlDown) { - ui.UIExport(); - } - break; - case (KeyEvent.VK_Y): - if (controlDown) { - ui.UIRedo(); - } - break; - - case (KeyEvent.VK_Z): - if (controlDown && !shiftDown) { - ui.UIUndo(); - } - else if (controlDown && shiftDown) { - ui.UIRedo(); - } - else if (!controlDown && !shiftDown) { - ui.UICustomZoom(); - } - break; - case (KeyEvent.VK_1): - if (controlDown) { - ui.UILine(); - } - break; - case (KeyEvent.VK_2): - if (controlDown) { - ui.UICircular(); - } - break; - case (KeyEvent.VK_3): - if (controlDown) { - ui.UIRadiate(); - } - break; - case (KeyEvent.VK_4): - if (controlDown) { - ui.UINAView(); - } - break; - case (KeyEvent.VK_5): - if (controlDown) { - ui.UIVARNAView(); - } - break; - case (KeyEvent.VK_6): - if (controlDown) { - ui.UIMOTIFView(); - } - break; - - // Navigation control keys (Zoom in/out, arrow keys ...) - case (KeyEvent.VK_DOWN): - if (_vp.getZoom() > 1) { - _vp.setTranslation(new Point(_vp.getTranslation().x,_vp.getTranslation().y-5)); - _vp.checkTranslation(); - } - break; - case (KeyEvent.VK_UP): - if (_vp.getZoom() > 1) { - _vp.setTranslation(new Point(_vp.getTranslation().x,_vp.getTranslation().y+5)); - _vp.checkTranslation(); - } - break; - case (KeyEvent.VK_LEFT): - if (_vp.getZoom() > 1) { - _vp.setTranslation(new Point(_vp.getTranslation().x+5,_vp.getTranslation().y)); - _vp.checkTranslation(); - } - break; - case (KeyEvent.VK_RIGHT): - if (_vp.getZoom() > 1) { - _vp.setTranslation(new Point(_vp.getTranslation().x-5,_vp.getTranslation().y)); - _vp.checkTranslation(); - } - break; - case (KeyEvent.VK_EQUALS): - case (KeyEvent.VK_PLUS): - ui.UIZoomIn(); - break; - case (KeyEvent.VK_MINUS): - ui.UIZoomOut(); - break; - } - } catch (Exception e1) { - _vp.errorDialog(e1); - } - _vp.repaint(); - } - - /** - * if ((e.getKeyCode() == KeyEvent.VK_PLUS)||(e.getKeyChar() == '+')) { - * _vp.getVARNAUI().UIZoomIn(); } else if (e.getKeyCode() == - * KeyEvent.VK_MINUS) { _vp.getVARNAUI().UIZoomOut(); } // 1 pour Redraw - * Radiate else if (e.getKeyChar() == KeyEvent.VK_1) { - * _vp.getVARNAUI().UIRadiate(); } // 2 pour Redraw Circular else if - * (e.getKeyChar() == KeyEvent.VK_2) { _vp.getVARNAUI().UICircular(); } // 3 - * pour Redraw NAView else if (e.getKeyChar() == KeyEvent.VK_3) { - * _vp.getVARNAUI().UINAView(); } - * - * // 4 for RNA on a line else if (e.getKeyChar() == KeyEvent.VK_4) { - * _vp.getVARNAUI().UILine(); } // 5 fun arn random coord else if - * (e.isControlDown() && e.getKeyChar() == KeyEvent.VK_9) { for (int i = 0; - * i < _vp.getRNA().get_listeBases().size(); i++) { - * _vp.getRNA().get_listeBases().get(i).set_coords( new - * Point2D.Double(_vp.getWidth() * Math.random(), _vp.getHeight() * - * Math.random())); _vp.getRNA().get_listeBases().get(i).set_center( new - * Point2D.Double(_vp.getWidth() / 2 Math.random(), _vp.getHeight() / 2 - * Math.random())); } } // 6 fun random arn structure else if - * (e.isControlDown() & e.getKeyChar() == KeyEvent.VK_8) { try { - * _vp.drawRNA(_vp.getRNA().getListeBasesToString(), getRandomRNA(), _vp - * .getRNA().get_drawMode()); } catch (ExceptionNonEqualLength e1) { - * _vp.errorDialog(e1); } } _vp.repaint(); } - **/ - - public String getRandomRNA() { - int pile = 0, j, i = 0; - double l; - String fun = ""; - while (i < 2000) { - if (Math.random() > 0.5) { - j = 0; - l = Math.random() * 10; - while (j < l) { - fun += '.'; - i++; - j++; - } - } else { - if (Math.random() > 0.5 && pile > 0) { - j = 0; - l = Math.random() * 5; - while (j < l && pile > 0) { - fun += ')'; - pile--; - j++; - i++; - } - } else { - j = 0; - l = Math.random() * 5; - while (j < l) { - fun += '('; - pile++; - j++; - i++; - } - - } - } - } - while (pile > 0) { - fun += ')'; - pile--; - } - return fun; - } - - public void keyReleased(KeyEvent e) { - } - - public void keyTyped(KeyEvent e) { - } - - public void focusGained(FocusEvent arg0) { - _vp.repaint(); - } - - public void focusLost(FocusEvent arg0) { - _vp.repaint(); - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurVueAnnotation.java b/src2/fr/orsay/lri/varna/controlers/ControleurVueAnnotation.java deleted file mode 100644 index 74da336..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurVueAnnotation.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - 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.controlers; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JColorChooser; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.views.VueAnnotation; -import fr.orsay.lri.varna.views.VueUI; - -/** - * Annotation View Controller - * - * @author Darty@lri.fr - * - */ -public class ControleurVueAnnotation implements CaretListener, ChangeListener, - ActionListener { - - protected VueAnnotation _vueAnnot; - - /** - * Creates a ControleurVueAnnotation - * - * @param vueAnnot - */ - public ControleurVueAnnotation(VueAnnotation vueAnnot) { - _vueAnnot = vueAnnot; - } - - public void caretUpdate(CaretEvent arg0) { - _vueAnnot.update(); - } - - public void stateChanged(ChangeEvent arg0) { - _vueAnnot.update(); - } - - public void actionPerformed(ActionEvent arg0) { - if (arg0.getActionCommand().equals("setcolor")) { - final VueUI vui = _vueAnnot.get_vp().getVARNAUI(); // BH SwingJS - vui.showColorDialog("Pick a color", _vueAnnot.getTextAnnotation().getColor(), new Runnable() { - - @Override - public void run() { - Color c = (Color) vui.dialogReturnValue; - if (c != null) - _vueAnnot.updateColor(c); - _vueAnnot.update(); - } - - }); - -//was: Color c = JColorChooser.showDialog(_vueAnnot.get_vp(), -// "Pick a color", _vueAnnot.getTextAnnotation().getColor()); -// if (c != null) { -// _vueAnnot.updateColor(c); -// } - - } - _vueAnnot.update(); - } -} diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurZoom.java b/src2/fr/orsay/lri/varna/controlers/ControleurZoom.java deleted file mode 100644 index 7987fd3..0000000 --- a/src2/fr/orsay/lri/varna/controlers/ControleurZoom.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - 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.controlers; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.views.VueZoom; - - -public class ControleurZoom implements ChangeListener { - - private VueZoom _vz; - - public ControleurZoom(VueZoom vz) { - _vz = vz; - } - - public void stateChanged(ChangeEvent e) { - _vz.get_vp().setZoom(_vz.getZoom()); - _vz.get_vp().repaint(); - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionDrawingAlgorithm.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionDrawingAlgorithm.java deleted file mode 100644 index 6ed626e..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionDrawingAlgorithm.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.orsay.lri.varna.exceptions; - -/** - * Exceptions of this class, or of a derived class, - * are thrown by the RNA drawing algorithms. - * - * @author Raphael Champeimont - */ -public class ExceptionDrawingAlgorithm extends Exception { - private static final long serialVersionUID = -8705033963886770829L; - - public ExceptionDrawingAlgorithm(String message) { - super(message); - } - - public ExceptionDrawingAlgorithm() { - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionEdgeEndpointAlreadyConnected.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionEdgeEndpointAlreadyConnected.java deleted file mode 100644 index 8c0a98c..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionEdgeEndpointAlreadyConnected.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.orsay.lri.varna.exceptions; - - -/** - * Thrown by an EdgeEndPoint when it is already connected and you try - * to connect it. - * - * @author Raphael Champeimont - */ -public class ExceptionEdgeEndpointAlreadyConnected extends ExceptionInvalidRNATemplate { - private static final long serialVersionUID = 3978166870034913842L; - - public ExceptionEdgeEndpointAlreadyConnected(String message) { - super(message); - } - - public ExceptionEdgeEndpointAlreadyConnected() { - super("Edge endpoint is already connected"); - } - -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionExportFailed.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionExportFailed.java deleted file mode 100644 index c04911b..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionExportFailed.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - 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.exceptions; - -/** - * Exception for export problems - * - * @author darty - * - */ -public class ExceptionExportFailed extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String _errorMessage; - private String _path; - - public ExceptionExportFailed(String errorMessage, String path) { - _errorMessage = errorMessage; - _path = path; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return "Export failed, File " + _path - + " cannot be created or overwritten !\n"; - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionFileFormatOrSyntax.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionFileFormatOrSyntax.java deleted file mode 100644 index 9fff0f9..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionFileFormatOrSyntax.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - 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.exceptions; - -/** - * Exception for any problem with the format or the syntax of a file loaded - * - * @author darty - * - */ -public class ExceptionFileFormatOrSyntax extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - private String _path; - private String _errorMessage; - - public ExceptionFileFormatOrSyntax(String errorMessage, String path) { - _path = path; - _errorMessage = errorMessage; - } - - public ExceptionFileFormatOrSyntax(String path) { - _path = path; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return "Unknown format or syntax error in file ' " + _path - + " '. \nLoading cancelled !"; - } - - public void setPath(String path) { - _path = path; - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionInvalidRNATemplate.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionInvalidRNATemplate.java deleted file mode 100644 index be710bf..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionInvalidRNATemplate.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.orsay.lri.varna.exceptions; - -/** - * This exception is thrown when we discover that a template is invalid - * (it contains impossible connections between elements). - * - * @author Raphael Champeimont - */ -public class ExceptionInvalidRNATemplate extends Exception { - private static final long serialVersionUID = 3866618355319087333L; - - public ExceptionInvalidRNATemplate(String message) { - super(message); - } - - public ExceptionInvalidRNATemplate() { - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionJPEGEncoding.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionJPEGEncoding.java deleted file mode 100644 index fd100f6..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionJPEGEncoding.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - 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.exceptions; - -/** - * Specific problems with JPEG encoding - */ -public class ExceptionJPEGEncoding extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String _errorMessage; - - public ExceptionJPEGEncoding(String errorMessage) { - _errorMessage = errorMessage; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return "JPEG encoding failed!"; - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionLoadingFailed.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionLoadingFailed.java deleted file mode 100644 index c18abe8..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionLoadingFailed.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - 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.exceptions; - -/** - * Exception for file load problems - * - * @author darty - * - */ -public class ExceptionLoadingFailed extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String _errorMessage; - private String _path; - - public ExceptionLoadingFailed(String errorMessage, String path) { - _errorMessage = errorMessage; - _path = path; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return "Loading failed!\n File '" + _path + "' cannot be read !"; - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionModeleStyleBaseSyntaxError.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionModeleStyleBaseSyntaxError.java deleted file mode 100644 index 7f2c775..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionModeleStyleBaseSyntaxError.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - 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.exceptions; - -/** - * Exception for problems with the script about modele style base creation - * - * @author darty - * - */ -public class ExceptionModeleStyleBaseSyntaxError extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - private String _details; - - public ExceptionModeleStyleBaseSyntaxError(String details) { - _details = details; - } - - public String getMessage() { - return _details; - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionNAViewAlgorithm.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionNAViewAlgorithm.java deleted file mode 100644 index 7ad306f..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionNAViewAlgorithm.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - 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.exceptions; - -public class ExceptionNAViewAlgorithm extends ExceptionDrawingAlgorithm { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String _errorMessage; - - public ExceptionNAViewAlgorithm(String errorMessage) { - _errorMessage = errorMessage; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return _errorMessage; - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionNonEqualLength.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionNonEqualLength.java deleted file mode 100644 index bd9abab..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionNonEqualLength.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - 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.exceptions; - -/** - * Exception for different rna lenghts - * - * @author darty - * - */ -public class ExceptionNonEqualLength extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String _errorMessage; - - public ExceptionNonEqualLength(String errorMessage) { - _errorMessage = errorMessage; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return "Both RNA have not the same length, cannot resolve secondary structure."; - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionParameterError.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionParameterError.java deleted file mode 100644 index 9c5b5b7..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionParameterError.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - 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.exceptions; - -/** - * Exception for parameter problems - * - * @author darty - * - */ -public class ExceptionParameterError extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String _errorMessage; - private String _details; - - public ExceptionParameterError(String errorMessage, String details) { - _errorMessage = errorMessage; - _details = details; - } - - public ExceptionParameterError(String details) { - _errorMessage = ""; - _details = details; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return _details; - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionPermissionDenied.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionPermissionDenied.java deleted file mode 100644 index f6667f2..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionPermissionDenied.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - 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.exceptions; - -/** - * Exception for permission denied problems due to security - * - * @author darty - * - */ -public class ExceptionPermissionDenied extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String _errorMessage; - - public ExceptionPermissionDenied(String errorMessage) { - _errorMessage = errorMessage; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return "Permission denied for security reason !\n" - + "Consider using the VARNA panel class in a signed context.\n"; - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionUnmatchedClosingParentheses.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionUnmatchedClosingParentheses.java deleted file mode 100644 index 195d275..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionUnmatchedClosingParentheses.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - 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.exceptions; - -import java.text.ParseException; - -/** - * Exception used when a rna has not the same number of opening and clothing - * parentheses - * - * @author darty - * - */ -public class ExceptionUnmatchedClosingParentheses extends ParseException { - /** - * - */ - private static final long serialVersionUID = 1L; - - public ExceptionUnmatchedClosingParentheses(String s, int errorOffset) { - super(s, errorOffset); - } - - public ExceptionUnmatchedClosingParentheses(int errorOffset) { - super("", errorOffset); - } - - public String getMessage() { - return "Unbalanced parentheses expression, cannot resolve secondary structure.\n" - + "Bad secondary structure (DBN format):Unmatched closing parentheses ')' at " - + getErrorOffset(); - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionWritingForbidden.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionWritingForbidden.java deleted file mode 100644 index 06f0b57..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionWritingForbidden.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - 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.exceptions; - -/** - * Used when writing file problems append due to security policy - * - * @author darty - * - */ -public class ExceptionWritingForbidden extends Exception { - /** - * - */ - private static final long serialVersionUID = 1L; - - private String _errorMessage; - - public ExceptionWritingForbidden(String errorMessage) { - _errorMessage = errorMessage; - } - - public String getError() { - return _errorMessage; - } - - public String getMessage() { - return "Writing is not allowed within current security policy."; - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionXMLGeneration.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionXMLGeneration.java deleted file mode 100644 index ac07e6f..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionXMLGeneration.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.orsay.lri.varna.exceptions; - -/** - * Thrown by XML-generating algorithms when they fail. - * - * @author Raphael Champeimont - */ -public class ExceptionXMLGeneration extends Exception { - private static final long serialVersionUID = 8867910395701431387L; - - public ExceptionXMLGeneration(String message) { - super(message); - } - - public ExceptionXMLGeneration() { - } -} diff --git a/src2/fr/orsay/lri/varna/exceptions/ExceptionXmlLoading.java b/src2/fr/orsay/lri/varna/exceptions/ExceptionXmlLoading.java deleted file mode 100644 index 1efaf50..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/ExceptionXmlLoading.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.orsay.lri.varna.exceptions; - -/** - * Thrown by algorithms that load data from XML when they fail. - * - * @author Raphael Champeimont - */ -public class ExceptionXmlLoading extends Exception { - private static final long serialVersionUID = -6267373620339074008L; - - public ExceptionXmlLoading(String message) { - super(message); - } - - public ExceptionXmlLoading() { - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/exceptions/MappingException.java b/src2/fr/orsay/lri/varna/exceptions/MappingException.java deleted file mode 100644 index bc31021..0000000 --- a/src2/fr/orsay/lri/varna/exceptions/MappingException.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - 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.exceptions; - -public class MappingException extends Exception { - private static final long serialVersionUID = 1L; - - public static final int MULTIPLE_PARTNERS_DEFINITION_ATTEMPT = 1; - public static final int BAD_ALIGNMENT_INPUT = 2; - public static final int CUSTOM_MESSAGE = 3; - - private String _errorMessage; - private int _type; - - public MappingException(String errorMessage) { - _errorMessage = errorMessage; - _type = CUSTOM_MESSAGE; - } - - public MappingException(int type) { - _type = type; - } - - public String getMessage() { - switch (_type) { - case MULTIPLE_PARTNERS_DEFINITION_ATTEMPT: - return "Mapping error: Attempt to define multiple partners for a base-pair"; - case BAD_ALIGNMENT_INPUT: - return "Mapping error: Bad input alignment"; - - case CUSTOM_MESSAGE: - return _errorMessage; - default: - return "Mapping error: Type is unknown."; - } - } - -} diff --git a/src2/fr/orsay/lri/varna/factories/RNAAlignment.java b/src2/fr/orsay/lri/varna/factories/RNAAlignment.java deleted file mode 100644 index 0cbf17c..0000000 --- a/src2/fr/orsay/lri/varna/factories/RNAAlignment.java +++ /dev/null @@ -1,106 +0,0 @@ -package fr.orsay.lri.varna.factories; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Hashtable; -import java.util.Stack; - -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.models.rna.RNA; - -/** - * BH SwingJS -- must explicitly check for array out of bounds - */ -public class RNAAlignment { - private ArrayList _lst = new ArrayList (); - private Hashtable _index = new Hashtable (); - private Hashtable _accession = new Hashtable (); - private String _secStr = ""; - - public void addSequence(String id, String s) - { - if (!_index.containsKey(id)) - { - _index.put(id,_lst.size()); - _lst.add(s); - } - _lst.set(_index.get(id),s); - } - - public void setSecStr(String s) - { - _secStr = s; - } - - public void setAccession(String id, String AC) - { - _accession.put(id,AC); - } - - public ArrayList getRNAs() throws ExceptionUnmatchedClosingParentheses - { - ArrayList result = new ArrayList(); - int[] str = RNAFactory.parseSecStr(_secStr); - ArrayList ids = new ArrayList(_index.keySet()); - Collections.sort(ids,new Comparator(){ - public int compare(String o1, String o2) { - return o1.compareToIgnoreCase(o2); - }}); - for (String id: ids ) - { - int n = _index.get(id); - String seq = _lst.get(n); - if (seq.length() != str.length) - throw new ArrayIndexOutOfBoundsException(); // BH SwingJS -- must explicitly check for array out of bounds - String nseq =""; - String nstr =""; - for(int i=0;i loadSecStrRNAML(Reader r) - throws ExceptionPermissionDenied, ExceptionLoadingFailed, - ExceptionFileFormatOrSyntax - { - - ArrayList result = new ArrayList(); - try - { - // System.setProperty("javax.xml.parsers.SAXParserFactory", - // "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); - SAXParserFactory saxFact = javax.xml.parsers.SAXParserFactory - .newInstance(); - saxFact.setValidating(false); - saxFact.setXIncludeAware(false); - saxFact.setNamespaceAware(false); - SAXParser sp = saxFact.newSAXParser(); - RNAMLParser RNAMLData = new RNAMLParser(); - sp.parse(new InputSource(r), RNAMLData); - - /* - * XMLReader xr = XMLReaderFactory.createXMLReader(); RNAMLParser - * RNAMLData = new RNAMLParser(); xr.setContentHandler(RNAMLData); - * xr.setErrorHandler(RNAMLData); xr.setEntityResolver(RNAMLData); - * xr.parse(new InputSource(r)); - */ - for (RNAMLParser.RNATmp rnaTmp : RNAMLData.getMolecules()) - { - RNA current = new RNA(); - // Retrieving parsed data - List seq = rnaTmp.getSequence(); - // Creating empty structure of suitable size - int[] str = new int[seq.size()]; - for (int i = 0; i < str.length; i++) - { - str[i] = -1; - } - current.setRNA(seq, str); - Vector allbpsTmp = rnaTmp.getStructure(); - ArrayList allbps = new ArrayList(); - for (int i = 0; i < allbpsTmp.size(); i++) - { - RNAMLParser.BPTemp bp = allbpsTmp.get(i); - // System.err.println(bp); - int bp5 = bp.pos5; - int bp3 = bp.pos3; - ModeleBase mb = current.getBaseAt(bp5); - ModeleBase part = current.getBaseAt(bp3); - ModeleBP newStyle = bp.createBPStyle(mb, part); - allbps.add(newStyle); - } - - current.applyBPs(allbps); - result.add(current); - } - - } - catch (IOException ioe) - { - throw new ExceptionLoadingFailed( - "Couldn't load file due to I/O or security policy issues.", ""); - } - catch (Exception ge) - { - if (!isQuiet) // BH - ge.printStackTrace(); - } - return result; - } - - public static int[] parseSecStr(String _secStr) - throws ExceptionUnmatchedClosingParentheses - { - Hashtable> stacks = new Hashtable>(); - int[] result = new int[_secStr.length()]; - int i = 0; - try - { - for (i = 0; i < _secStr.length(); i++) - { - result[i] = -1; - char c = _secStr.charAt(i); - char c2 = Character.toUpperCase(c); - if (!stacks.containsKey(c2)) - { - stacks.put(c2, new Stack()); - } - switch (c) - { - case '<': - case '{': - case '(': - case '[': - stacks.get(c).push(i); - break; - case '>': - { - int j = stacks.get('<').pop(); - result[i] = j; - result[j] = i; - break; - } - case '}': - { - int j = stacks.get('{').pop(); - result[i] = j; - result[j] = i; - break; - } - case ')': - { - int j = stacks.get('(').pop(); - result[i] = j; - result[j] = i; - break; - } - case ']': - { - int j = stacks.get('[').pop(); - result[i] = j; - result[j] = i; - break; - } - case '.': - break; - default: - { - if (Character.isLetter(c) && Character.isUpperCase(c)) - { - stacks.get(c).push(i); - } - else if (Character.isLetter(c) && Character.isLowerCase(c)) - { - int j = stacks.get(Character.toUpperCase(c)).pop(); - result[i] = j; - result[j] = i; - } - } - } - } - } - catch (EmptyStackException e) - { - throw new ExceptionUnmatchedClosingParentheses(i); - } - return result; - } - - public static ArrayList loadSecStrDBN(Reader r) - throws ExceptionLoadingFailed, ExceptionPermissionDenied, - ExceptionUnmatchedClosingParentheses, ExceptionFileFormatOrSyntax - { - boolean loadOk = false; - ArrayList result = new ArrayList(); - RNA current = new RNA(); - try - { - BufferedReader fr = new BufferedReader(r); - String line = fr.readLine(); - String title = ""; - String seqTmp = ""; - String strTmp = ""; - while ((line != null) && (strTmp.equals(""))) - { - line = line.trim(); - if (!line.startsWith(">")) - { - if (seqTmp.equals("")) - { - seqTmp = line; - } - else - { - strTmp = line; - } - } - else - { - title = line.substring(1).trim(); - } - line = fr.readLine(); - } - if (strTmp.length() != 0) - { - current.setRNA(seqTmp, strTmp); - current.setName(title); - loadOk = true; - } - } - catch (IOException e) - { - throw new ExceptionLoadingFailed(e.getMessage(), ""); - } - if (loadOk) - { - result.add(current); - } - return result; - } - - public static ArrayList loadSecStr(File f) - throws ExceptionFileFormatOrSyntax - { - try { - return loadSecStr(new BufferedReader(new FileReader(f)), RNAFileType.FILE_TYPE_UNKNOWN); - } catch (FileNotFoundException e) { - throw new ExceptionFileFormatOrSyntax(f.toString()); - } - } - - public static ArrayList loadSecStr(Reader r) - throws ExceptionFileFormatOrSyntax - { - return loadSecStr(new BufferedReader(r), RNAFileType.FILE_TYPE_UNKNOWN); - } - - public static ArrayList loadSecStr(BufferedReader r, RNAFileType fileType) throws ExceptionFileFormatOrSyntax { - try { - switch (fileType) { - case FILE_TYPE_DBN: { - try { - ArrayList result = loadSecStrDBN(r); - if (result.size() != 0) - return result; - } catch (Exception e) { - } - } - break; - case FILE_TYPE_CT: { - try { - ArrayList result = loadSecStrCT(r); - if (result.size() != 0) - return result; - } catch (Exception e) { - if (!isQuiet) // BH - e.printStackTrace(); - } - } - break; - case FILE_TYPE_BPSEQ: { - try { - ArrayList result = loadSecStrBPSEQ(r); - if (result.size() != 0) - return result; - } catch (Exception e) { - if (!isQuiet) // BH - e.printStackTrace(); - } - } - break; - case FILE_TYPE_TCOFFEE: { - try { - ArrayList result = loadSecStrTCoffee(r); - if (result.size() != 0) - return result; - } catch (Exception e) { - if (!isQuiet) // BH - e.printStackTrace(); - } - } - break; - case FILE_TYPE_STOCKHOLM: { - try { - ArrayList result = loadSecStrStockholm(r); - if (result.size() != 0) - return result; - } catch (Exception e) { - if (!isQuiet) // BH - e.printStackTrace(); - } - } - break; - case FILE_TYPE_RNAML: { - try { - ArrayList result = loadSecStrRNAML(r); - if (result.size() != 0) - return result; - } catch (Exception e) { - if (!isQuiet) // BH - e.printStackTrace(); - } - } - break; - - case FILE_TYPE_UNKNOWN: { - try { - r.mark(1000000); - RNAFactory.RNAFileType[] types = RNAFactory.RNAFileType.values(); - isQuiet = true; // BH to not report errors when - // drag-dropping - ArrayList result = null; - RNAFactory.RNAFileType t = null; - for (int i = 0; i < types.length; i++) { - r.reset(); - t = types[i]; - if (t != RNAFactory.RNAFileType.FILE_TYPE_UNKNOWN) { - try { - result = loadSecStr(r, t); - if (result.size() != 0) { - break; - } - } catch (Exception e) { - if (!isQuiet) // BH - System.err.println(e.toString()); - } - } - } - System.out.println(t); // BH - isQuiet = false; // BH - return result; - } catch (IOException e2) { - e2.printStackTrace(); - } - } - } - throw new ExceptionFileFormatOrSyntax("Couldn't parse this file as " + fileType + "."); - } finally { // BH !! - try { - if (!isQuiet) - r.close(); - } catch (IOException e) { - // ignore - } - } - } - - public static RNAFileType guessFileTypeFromExtension(String path) - { - if (path.toLowerCase().endsWith("ml")) - { - return RNAFileType.FILE_TYPE_RNAML; - } - else if (path.toLowerCase().endsWith("dbn") - || path.toLowerCase().endsWith("faa")) - { - return RNAFileType.FILE_TYPE_DBN; - } - else if (path.toLowerCase().endsWith("ct")) - { - return RNAFileType.FILE_TYPE_CT; - } - else if (path.toLowerCase().endsWith("bpseq")) - { - return RNAFileType.FILE_TYPE_BPSEQ; - } - else if (path.toLowerCase().endsWith("rfold")) - { - return RNAFileType.FILE_TYPE_TCOFFEE; - } - else if (path.toLowerCase().endsWith("stockholm") - || path.toLowerCase().endsWith("stk")) - { - return RNAFileType.FILE_TYPE_STOCKHOLM; - } - - return RNAFileType.FILE_TYPE_UNKNOWN; - - } - - public static ArrayList loadSecStr(String path) - throws ExceptionExportFailed, ExceptionPermissionDenied, - ExceptionLoadingFailed, ExceptionFileFormatOrSyntax, - ExceptionUnmatchedClosingParentheses, FileNotFoundException - { - FileReader fr = null; - try - { - fr = new FileReader(path); - RNAFileType type = guessFileTypeFromExtension(path); - return loadSecStr(new BufferedReader(fr), type); - } - catch (ExceptionFileFormatOrSyntax e) - { - if (fr != null) - try - { - fr.close(); - } - catch (IOException e2) - { - } - e.setPath(path); - throw e; - } - } - - public static ArrayList loadSecStrStockholm(BufferedReader r) - throws IOException, ExceptionUnmatchedClosingParentheses - { - RNAAlignment a = StockholmIO.readAlignement(r); - return a.getRNAs(); - } - - public static ArrayList loadSecStrBPSEQ(Reader r) - throws ExceptionPermissionDenied, ExceptionLoadingFailed, - ExceptionFileFormatOrSyntax - { - boolean loadOk = false; - ArrayList result = new ArrayList(); - RNA current = new RNA(); - try - { - BufferedReader fr = new BufferedReader(r); - String line = fr.readLine(); - ArrayList seqTmp = new ArrayList(); - Hashtable> strTmp = new Hashtable>(); - - int bpFrom; - String base; - int bpTo; - int minIndex = -1; - boolean noWarningYet = true; - String title = ""; - String id = ""; - String filenameStr = "Filename:"; - String organismStr = "Organism:"; - String ANStr = "Accession Number:"; - while (line != null) - { - line = line.trim(); - String[] tokens = line.split("\\s+"); - ArrayList numbers = new ArrayList(); - Hashtable numberToIndex = new Hashtable(); - if ((tokens.length >= 3) && !tokens[0].contains("#") - && !line.startsWith("Organism:") && !line.startsWith("Citation") - && !line.startsWith("Filename:") - && !line.startsWith("Accession Number:")) - { - base = tokens[1]; - seqTmp.add(base); - bpFrom = (Integer.parseInt(tokens[0])); - numbers.add(bpFrom); - if (minIndex < 0) - minIndex = bpFrom; - - if (seqTmp.size() < (bpFrom - minIndex + 1)) - { - if (noWarningYet) - { - noWarningYet = false; - /* - * warningEmition( "Discontinuity detected between nucleotides " + - * (seqTmp.size()) + " and " + (bpFrom + 1) + - * "!\nFilling in missing portions with unpaired unknown 'X' nucleotides ..." - * ); - */ - } - while (seqTmp.size() < (bpFrom - minIndex + 1)) - { - // System.err.println("."); - seqTmp.add("X"); - } - } - for (int i = 2; i < tokens.length; i++) - { - bpTo = (Integer.parseInt(tokens[i])); - if ((bpTo != 0) || (i != tokens.length - 1)) - { - if (!strTmp.containsKey(bpFrom)) - strTmp.put(bpFrom, new Vector()); - strTmp.get(bpFrom).add(bpTo); - } - } - } - else if (tokens[0].startsWith("#")) - { - int occur = line.indexOf("#"); - String tmp = line.substring(occur + 1); - title += tmp.trim() + " "; - } - else if (tokens[0].startsWith(filenameStr)) - { - int occur = line.indexOf(filenameStr); - String tmp = line.substring(occur + filenameStr.length()); - title += tmp.trim(); - } - else if (tokens[0].startsWith(organismStr)) - { - int occur = line.indexOf(organismStr); - String tmp = line.substring(occur + organismStr.length()); - if (title.length() != 0) - { - title = "/" + title; - } - title = tmp.trim() + title; - } - else if (line.contains(ANStr)) - { - int occur = line.indexOf(ANStr); - String tmp = line.substring(occur + ANStr.length()); - id = tmp.trim(); - } - line = fr.readLine(); - } - if (strTmp.size() != 0) - { - ArrayList seq = seqTmp; - int[] str = new int[seq.size()]; - for (int i = 0; i < seq.size(); i++) - { - str[i] = -1; - } - current.setRNA(seq, str, minIndex); - ArrayList allbps = new ArrayList(); - for (int i : strTmp.keySet()) - { - for (int j : strTmp.get(i)) - { - if (i<=j) - { - ModeleBase mb = current.getBaseAt(i - minIndex); - ModeleBase part = current.getBaseAt(j - minIndex); - ModeleBP newStyle = new ModeleBP(mb, part); - allbps.add(newStyle); - } - } - } - current.applyBPs(allbps); - current.setName(title); - current.setID(id); - loadOk = true; - } - } - catch (NumberFormatException e) - { - if (!isQuiet) // BH SwingJS - e.printStackTrace(); - } - catch (IOException e) - { - // TODO Auto-generated catch block - e.printStackTrace(); - } - catch (Exception e) - { - throw new ExceptionLoadingFailed(e.getMessage(), ""); - } - if (loadOk) - result.add(current); - return result; - } - - public static ArrayList loadSecStrTCoffee(Reader r) - throws ExceptionPermissionDenied, ExceptionLoadingFailed, - ExceptionFileFormatOrSyntax - { - boolean loadOk = false; - ArrayList result = new ArrayList(); - try - { - BufferedReader fr = new BufferedReader(r); - String line = fr.readLine(); - ArrayList seqs = new ArrayList(); - ArrayList ids = new ArrayList(); - int numSeqs = -1; - int currSeq = -1; - RNA current = null; - while (line != null) - { - if (!line.startsWith("!")) - { - String[] tokens = line.split("\\s+"); - // This may indicate new secondary structure - if (line.startsWith("#")) - { - currSeq = Integer.parseInt(tokens[0].substring(1)); - int currSeq2 = Integer.parseInt(tokens[1]); - // For TCoffee, a sec str is a matching between a seq and itself - // => Disregard any alignment by filtering on the equality of sequence indices. - if (currSeq == currSeq2) - { - current = new RNA(); - current.setName(ids.get(currSeq - 1)); - current.setSequence(seqs.get(currSeq - 1)); - result.add(current); - } - else - { - current = null; - } - } - // Beginning of the file... - else if (current == null) - { - //... either this is the number of sequences... - if (numSeqs < 0) - { - numSeqs = Integer.parseInt(tokens[0]); - } - //... or this is a sequence definition... - else - { - String id = tokens[0]; - String seq = tokens[2]; - seqs.add(seq); - ids.add(id); - } - } - //Otherwise, this is a base-pair definition, related to the currently selected sequence - else if (tokens.length == 3) - { - int from = Integer.parseInt(tokens[0]) - 1; - int to = Integer.parseInt(tokens[1]) - 1; - current.addBP(from, to); - } - } - line = fr.readLine(); - } - loadOk = true; - } - catch (NumberFormatException e) - { - if (!isQuiet) // BH SwingJS - e.printStackTrace(); - } - catch (IOException e) - { - if (!isQuiet) // BH SwingJS - e.printStackTrace(); - } - if (!loadOk) - { - throw new ExceptionLoadingFailed("Parse Error", ""); - } - return result; - } - - public static ArrayList loadSecStrCT(Reader r) - throws ExceptionPermissionDenied, ExceptionLoadingFailed, - ExceptionFileFormatOrSyntax - { - boolean loadOk = false; - ArrayList result = new ArrayList(); - RNA current = new RNA(); - try - { - BufferedReader fr = new BufferedReader(r); - String line = fr.readLine(); - ArrayList seq = new ArrayList(); - ArrayList lbls = new ArrayList(); - Vector strTmp = new Vector(); - Vector newStrands = new Vector(); - int bpFrom; - String base; - String lbl; - int bpTo; - boolean noWarningYet = true; - int minIndex = -1; - String title = ""; - while (line != null) - { - line = line.trim(); - String[] tokens = line.split("\\s+"); - if (tokens.length >= 6) - { - try - { - bpFrom = (Integer.parseInt(tokens[0])); - bpTo = (Integer.parseInt(tokens[4])); - if (minIndex == -1) - minIndex = bpFrom; - bpFrom -= minIndex; - if (bpTo != 0) - bpTo -= minIndex; - else - bpTo = -1; - base = tokens[1]; - lbl = tokens[5]; - int before = Integer.parseInt(tokens[2]); - int after = Integer.parseInt(tokens[3]); - - if (before==0 && !seq.isEmpty()) - { - newStrands.add(strTmp.size()-1); - } - if (bpFrom != seq.size()) - { - if (noWarningYet) - { - noWarningYet = false; - /* - * warningEmition( "Discontinuity detected between nucleotides " - * + (seq.size()) + " and " + (bpFrom + 1) + - * "!\nFilling in missing portions with unpaired unknown 'X' nucleotides ..." - * ); - */ - } - while (bpFrom > seq.size()) - { - seq.add("X"); - strTmp.add(-1); - lbls.add(""); - } - } - seq.add(base); - strTmp.add(bpTo); - lbls.add(lbl); - } - catch (NumberFormatException e) - { - if (strTmp.size()!=0) - e.printStackTrace(); - } - } - if ((line.contains("ENERGY = ")) || line.contains("dG = ")) - { - String[] ntokens = line.split("\\s+"); - if (ntokens.length >= 4) - { - String energy = ntokens[3]; - for (int i = 4; i < ntokens.length; i++) - { - title += ntokens[i] + " "; - } - title += "(E=" + energy + " kcal/mol)"; - } - } - line = fr.readLine(); - } - if (strTmp.size() != 0) - { - int[] str = new int[strTmp.size()]; - for (int i = 0; i < strTmp.size(); i++) - { - str[i] = strTmp.elementAt(i).intValue(); - } - current.setRNA(seq, str, minIndex); - current.setName(title); - for (int i = 0; i < current.getSize(); i++) - { - current.getBaseAt(i).setLabel(lbls.get(i)); - } - for (int i : newStrands) - { - current.getBackbone().addElement(new ModeleBackboneElement(i,BackboneType.DISCONTINUOUS_TYPE)); - } - - - loadOk = true; - } - } - catch (IOException e) - { - e.printStackTrace(); - throw new ExceptionLoadingFailed(e.getMessage(), ""); - } - catch (NumberFormatException e) - { - if (!isQuiet) // BH SwingJS - e.printStackTrace(); - throw new ExceptionFileFormatOrSyntax(e.getMessage(), ""); - } - if (loadOk) - result.add(current); - return result; - } - -} diff --git a/src2/fr/orsay/lri/varna/factories/StockholmIO.java b/src2/fr/orsay/lri/varna/factories/StockholmIO.java deleted file mode 100644 index a237251..0000000 --- a/src2/fr/orsay/lri/varna/factories/StockholmIO.java +++ /dev/null @@ -1,91 +0,0 @@ -package fr.orsay.lri.varna.factories; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - - -public class StockholmIO { - public static RNAAlignment readAlignementFromFile(String path) throws IOException - { - return StockholmIO.readAlignement(new BufferedReader(new FileReader(path))); - } - public static RNAAlignment readAlignementFromURL(String url) throws UnsupportedEncodingException, IOException - { - URL urlAb = new URL(url); - URLConnection urlConn = urlAb.openConnection(); - urlConn.setUseCaches(false); - Reader r = new InputStreamReader(urlConn.getInputStream(),"UTF-8"); - return readAlignement(new BufferedReader(r)); - } - - - /*public static Alignment readAlignement(Reader r) throws IOException - { - return readAlignement(new BufferedReader(r)); - }*/ - - public static RNAAlignment readAlignement(BufferedReader r) throws IOException - { - LinkedHashMap rawSeqs = new LinkedHashMap(); - RNAAlignment result = new RNAAlignment(); - String line = r.readLine(); - String str = ""; - - while(line!=null) - { - if (!line.startsWith("#")) - { - String[] data = line.split("\\s+"); - if (data.length>1) - { - String seqName = data[0].trim(); - String seq = data[1].trim(); - if (!rawSeqs.containsKey(seqName)) - { - rawSeqs.put(seqName,new StringBuffer()); - } - StringBuffer val = rawSeqs.get(seqName); - val.append(seq); - } - - } - else if (line.startsWith("#")) - { - String[] data = line.split("\\s+"); - if (line.startsWith("#=GC SS_cons")) - { - str += data[2].trim(); - } - else if (line.startsWith("#=GS")) - { - if (data[2].trim().equals("AC")) - { - result.setAccession(data[1].trim(),data[3].trim()); - - } - } - } - - line = r.readLine(); - } - result.setSecStr(str); - for(Map.Entry entry : rawSeqs.entrySet()) - { - String s = entry.getValue().toString(); - result.addSequence(entry.getKey(), s); - } - return result; - } -} diff --git a/src2/fr/orsay/lri/varna/interfaces/InterfaceParameterLoader.java b/src2/fr/orsay/lri/varna/interfaces/InterfaceParameterLoader.java deleted file mode 100644 index 954f145..0000000 --- a/src2/fr/orsay/lri/varna/interfaces/InterfaceParameterLoader.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - 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.interfaces; - -public interface InterfaceParameterLoader { - public String getParameterValue(String key, String def); -} diff --git a/src2/fr/orsay/lri/varna/interfaces/InterfaceParseExport.java b/src2/fr/orsay/lri/varna/interfaces/InterfaceParseExport.java deleted file mode 100644 index 417c5df..0000000 --- a/src2/fr/orsay/lri/varna/interfaces/InterfaceParseExport.java +++ /dev/null @@ -1,8 +0,0 @@ -package fr.orsay.lri.varna.interfaces; - -import fr.orsay.lri.varna.VARNAPanel; - -public interface InterfaceParseExport { - public void parse(String s, VARNAPanel vp); - public String export(); -} diff --git a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNABasesListener.java b/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNABasesListener.java deleted file mode 100644 index d2cb290..0000000 --- a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNABasesListener.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.orsay.lri.varna.interfaces; - -import java.awt.event.MouseEvent; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Set; - -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModeleBase; - -public interface InterfaceVARNABasesListener { - - /** - * Reacts to click over base - * @param mb The base which has just been clicked - */ - public void onBaseClicked(ModeleBase mb, MouseEvent e); -} diff --git a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNAListener.java b/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNAListener.java deleted file mode 100644 index aafd94d..0000000 --- a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNAListener.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - 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.interfaces; - -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.RNA; - -/** - * Observable design pattern - * - * @author darty - * - */ -public abstract interface InterfaceVARNAListener { - public abstract void onWarningEmitted(String s); - public abstract void onStructureRedrawn(); - public abstract void onUINewStructure(VARNAConfig v, RNA r); - public abstract void onZoomLevelChanged(); - public abstract void onTranslationChanged(); -} - \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNAObservable.java b/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNAObservable.java deleted file mode 100644 index 35b5f9d..0000000 --- a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNAObservable.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - 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.interfaces; - -/** - * Observable design pattern - * - * @author darty - * - */ -public abstract class InterfaceVARNAObservable { - public abstract void addVARNAListener(InterfaceVARNAListener rl); -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNARNAListener.java b/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNARNAListener.java deleted file mode 100644 index aeeaa5b..0000000 --- a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNARNAListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package fr.orsay.lri.varna.interfaces; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Set; - -import fr.orsay.lri.varna.models.rna.ModeleBP; - -public interface InterfaceVARNARNAListener { - /** - * Reacts to changes being made at the sequence level. - * @param index The sequence index where a change of base content is observed - * @param oldseq Previous base content - * @param newseq New base content - */ - public void onSequenceModified(int index, String oldseq, String newseq); - - /** - * Reacts to modification of the structure (Base-pair addition/removal). - * @param current Current list of base-pairs (can be also accessed within the current RNA object). - * @param addedBasePairs Newly created base-pairs - * @param removedBasePairs Newly removed base-pairs - */ - public void onStructureModified(Set current, Set addedBasePairs, Set removedBasePairs); - - /** - * Reacts to displacement of - * @param previousPositions - */ - public void onRNALayoutChanged(Hashtable previousPositions); -} diff --git a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNASelectionListener.java b/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNASelectionListener.java deleted file mode 100644 index 20bf2eb..0000000 --- a/src2/fr/orsay/lri/varna/interfaces/InterfaceVARNASelectionListener.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.orsay.lri.varna.interfaces; - -import fr.orsay.lri.varna.models.BaseList; -import fr.orsay.lri.varna.models.rna.ModeleBase; - -public interface InterfaceVARNASelectionListener { - /** - * Specifies an action that should be performed upon changing the hovered base. - * @param oldbase Previously hovered base (possibly null). - * @param newBase Newly hovered base (possibly null). - */ - public void onHoverChanged(ModeleBase oldbase, ModeleBase newBase); - - /** - * Specifies the action to be performed upon changing the selection. - * @param selection The list of bases currently selected - * @param addedBases The list of bases added since previous selection event - * @param removedBases The list of bases removed since previous selection event - */ - public void onSelectionChanged(BaseList selection, BaseList addedBases, BaseList removedBases); -} diff --git a/src2/fr/orsay/lri/varna/models/BaseList.java b/src2/fr/orsay/lri/varna/models/BaseList.java deleted file mode 100644 index 01ac0b1..0000000 --- a/src2/fr/orsay/lri/varna/models/BaseList.java +++ /dev/null @@ -1,200 +0,0 @@ -package fr.orsay.lri.varna.models; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; - -import fr.orsay.lri.varna.models.rna.ModeleBase; - -public class BaseList { - private HashSet _bases = new HashSet(); - private String _caption; - - public BaseList( BaseList b) - { - _caption = b._caption; - _bases = new HashSet(b._bases); - } - - - public BaseList( String caption) - { - _caption = caption; - } - - - public BaseList( String caption, ModeleBase mb) - { - this(caption); - addBase(mb); - } - - public boolean contains(ModeleBase mb) - { - return _bases.contains(mb); - } - - - public String getCaption() - { - return _caption; - } - - public void addBase(ModeleBase b) - { - _bases.add(b); - } - - public void removeBase(ModeleBase b) - { - _bases.remove(b); - } - - - public void addBases(Collection mbs) - { - _bases.addAll(mbs); - } - - public ArrayList getBases() - { - return new ArrayList(_bases); - } - - public void clear() - { - _bases.clear(); - } - - public static Color getAverageColor(ArrayList cols) - { - int r=0,g=0,b=0; - for (Color c : cols) - { - r += c.getRed(); - g += c.getGreen(); - b += c.getBlue(); - } - if (cols.size()>0) - { - r /= cols.size(); - g /= cols.size(); - b /= cols.size(); - } - return new Color(r,g,b); - } - - public Color getAverageOutlineColor() - { - ArrayList cols = new ArrayList(); - for (ModeleBase mb : _bases) - { cols.add(mb.getStyleBase().getBaseOutlineColor()); } - return getAverageColor(cols); - } - - public Color getAverageNameColor() - { - ArrayList cols = new ArrayList(); - for (ModeleBase mb : _bases) - { cols.add(mb.getStyleBase().getBaseNameColor()); } - return getAverageColor(cols); - } - - public Color getAverageNumberColor() - { - ArrayList cols = new ArrayList(); - for (ModeleBase mb : _bases) - { cols.add(mb.getStyleBase().getBaseNumberColor()); } - return getAverageColor(cols); - } - - public Color getAverageInnerColor() - { - ArrayList cols = new ArrayList(); - for (ModeleBase mb : _bases) - { cols.add(mb.getStyleBase().getBaseInnerColor()); } - return getAverageColor(cols); - } - - public String getNumbers() - { - String result = ""; - boolean first = true; - for (ModeleBase mb:_bases) - { - if (!first) - { result += ","; } - else - { first = false; } - result += "" + mb.getBaseNumber(); - } - result += ""; - return result; - } - - public String getContents() - { - String result = ""; - boolean first = true; - for (ModeleBase mb:_bases) - { - if (!first) - { result += ","; } - else - { first = false; } - result += "" + mb.getContent(); - } - result += ""; - return result; - } - - public ArrayList getIndices() - { - ArrayList indices = new ArrayList(); - for (ModeleBase mb : _bases) - { - indices.add(mb.getIndex()); - } - return indices; - } - - /** - * Returns, in a new BaseList, the intersection of the current BaseList and of the argument. - * @param mb The base list to be used for the intersection - * @return The intersection of the current base list and the argument. - */ - - public BaseList retainAll(BaseList mb) - { - HashSet cp = new HashSet(); - cp.addAll(_bases); - cp.retainAll(mb._bases); - BaseList result = new BaseList("TmpIntersection"); - result.addBases(cp); - return result; - } - - /** - * Returns, in a new BaseList, the list consisting of the current BaseList minus the list passed as argument. - * @param mb The base list to be subtracted from the current one - * @return The current base list minus the list passed as argument. - */ - - public BaseList removeAll(BaseList mb) - { - HashSet cp = new HashSet(); - cp.addAll(_bases); - cp.removeAll(mb._bases); - BaseList result = new BaseList("TmpMinus"); - result.addBases(cp); - return result; - } - - public int size() - { - return _bases.size(); - } - - -} diff --git a/src2/fr/orsay/lri/varna/models/FullBackup.java b/src2/fr/orsay/lri/varna/models/FullBackup.java deleted file mode 100644 index 623b691..0000000 --- a/src2/fr/orsay/lri/varna/models/FullBackup.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.orsay.lri.varna.models; - -import java.io.Serializable; - -import fr.orsay.lri.varna.models.rna.RNA; - -public class FullBackup implements Serializable{ - - /** - * - */ - private static final long serialVersionUID = -5468893731117925140L; - public VARNAConfig config; - public RNA rna; - public String name; - - public FullBackup(VARNAConfig c, RNA r, String n){ - config = c; - rna = r; - name = n; - } - - public FullBackup(RNA r, String n){ - config = null; - rna = r; - name = n; - } - - public String toString() - { - return name; - } - public boolean hasConfig() - { - return config!=null; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/VARNAConfig.java b/src2/fr/orsay/lri/varna/models/VARNAConfig.java deleted file mode 100644 index c6fb103..0000000 --- a/src2/fr/orsay/lri/varna/models/VARNAConfig.java +++ /dev/null @@ -1,395 +0,0 @@ -/* - 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.models; - -import java.awt.Color; -import java.awt.Font; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModeleBPStyle; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; -import fr.orsay.lri.varna.utils.XMLUtils; - -public class VARNAConfig implements Serializable, Cloneable { - - /** - * - */ - private static final long serialVersionUID = 2853916694420964233L; - /** - * - */ - public static final int MAJOR_VERSION = 3; - public static final int MINOR_VERSION = 9; - - public static String getFullName() - { - return "VARNA "+MAJOR_VERSION+"."+MINOR_VERSION; - } - - /** - * Enum types and internal classes - */ - - public enum BP_STYLE implements Serializable { - NONE, SIMPLE, RNAVIZ, LW, LW_ALT; - public String toString() - { - switch(this) - { - case LW: return "Leontis/Westhof (Centered)"; - case SIMPLE: return "Line"; - case RNAVIZ: return "Circles"; - case NONE: return "None"; - case LW_ALT: return "Leontis/Westhof (End)"; - } - return "Unspecified"; - } - public String getOpt() - { - switch(this) - { - case NONE: return "none"; - case SIMPLE: return "simple"; - case LW: return "lw"; - case RNAVIZ: return "rnaviz"; - case LW_ALT: return "lwalt"; - } - return "x"; - } - public static BP_STYLE getStyle(String opt) - { - for(BP_STYLE b: BP_STYLE.values()) - { - if (opt.toLowerCase().equals(b.getOpt().toLowerCase())) - return b; - } - return null; - } - }; - - /** - * Default values for config options - */ - - public static final double MAX_ZOOM = 60; - public static final double MIN_ZOOM = 0.5; - public static final double DEFAULT_ZOOM = 1; - public static final double MAX_AMOUNT = 2; - public static final double MIN_AMOUNT = 1.01; - public static final double DEFAULT_AMOUNT = 1.2; - public static final double DEFAULT_BP_THICKNESS = 1.0; - public static final double DEFAULT_DIST_NUMBERS = 3.0; - - public static final int DEFAULT_PERIOD = 10; - - public static final Color DEFAULT_TITLE_COLOR = Color.black; - public static final Color DEFAULT_BACKBONE_COLOR = Color.DARK_GRAY.brighter(); - public static final Color DEFAULT_BOND_COLOR = Color.blue; - public static final Color DEFAULT_SPECIAL_BASE_COLOR = Color.green.brighter(); - public static final Color DEFAULT_DASH_BASE_COLOR = Color.yellow.brighter(); - public static final double DEFAULT_BASE_OUTLINE_THICKNESS = 1.5; - public static final Color BASE_OUTLINE_COLOR_DEFAULT = Color.DARK_GRAY.brighter(); - public static final Color BASE_INNER_COLOR_DEFAULT = new Color(242, 242,242); - public static final Color BASE_NUMBER_COLOR_DEFAULT = Color.DARK_GRAY; - public static final Color BASE_NAME_COLOR_DEFAULT = Color.black; - - public static final Color DEFAULT_HOVER_COLOR = new Color(230, 230,230); - - public static final Color DEFAULT_BACKGROUND_COLOR = Color.WHITE; - public static final Font DEFAULT_TITLE_FONT = new Font("SansSerif", Font.BOLD,18); - public static final Font DEFAULT_BASE_FONT = new Font("SansSerif", Font.PLAIN, 18); - public static final Font DEFAULT_NUMBERS_FONT = new Font("SansSerif", - Font.BOLD, 18); - public static final Font DEFAULT_MESSAGE_FONT = Font.decode("dialog-PLAIN-25"); - public static final Color DEFAULT_MESSAGE_COLOR = new Color(230, 230,230); - - - public static final BP_STYLE DEFAULT_BP_STYLE = BP_STYLE.LW; - - public static final ModeleColorMap DEFAULT_COLOR_MAP = ModeleColorMap.defaultColorMap(); - public static final Color DEFAULT_COLOR_MAP_OUTLINE = Color.gray; - public static final double DEFAULT_BP_INCREMENT = 0.65; - - public static double DEFAULT_COLOR_MAP_WIDTH = 120; - public static double DEFAULT_COLOR_MAP_HEIGHT = 30; - public static double DEFAULT_COLOR_MAP_X_OFFSET = 40; - public static double DEFAULT_COLOR_MAP_Y_OFFSET = 0; - public static int DEFAULT_COLOR_MAP_STRIPE_WIDTH = 2; - public static int DEFAULT_COLOR_MAP_FONT_SIZE = 20; - public static Color DEFAULT_COLOR_MAP_FONT_COLOR = Color.gray.darker(); - - public static double DEFAULT_SPACE_BETWEEN_BASES = 1.0; - - /** - * Various options. - */ - - public static String XML_VAR_DRAW_OUTLINE = "drawoutline"; - public static String XML_VAR_FILL_BASE = "fillbase"; - public static String XML_VAR_AUTO_FIT = "autofit"; - public static String XML_VAR_AUTO_CENTER = "autocenter"; - public static String XML_VAR_MODIFIABLE = "modifiable"; - public static String XML_VAR_ERRORS = "errors"; - public static String XML_VAR_SPECIAL_BASES = "specialbases"; - public static String XML_VAR_DASH_BASES = "dashbases"; - public static String XML_VAR_USE_BASE_BPS = "usebasebps"; - public static String XML_VAR_DRAW_NC = "drawnc"; - public static String XML_VAR_DRAW_NON_PLANAR = "drawnonplanar"; - public static String XML_VAR_SHOW_WARNINGS = "warnings"; - public static String XML_VAR_COMPARISON_MODE = "comparison"; - public static String XML_VAR_FLAT = "flat"; - public static String XML_VAR_DRAW_BACKGROUND = "drawbackground"; - public static String XML_VAR_COLOR_MAP = "drawcm"; - public static String XML_VAR_DRAW_BACKBONE = "drawbackbone"; - - public static String XML_VAR_CM_HEIGHT = "cmh"; - public static String XML_VAR_CM_WIDTH = "cmw"; - public static String XML_VAR_CM_X_OFFSET = "cmx"; - public static String XML_VAR_CM_Y_OFFSET = "cmy"; - public static String XML_VAR_DEFAULT_ZOOM = "defaultzoom"; - public static String XML_VAR_ZOOM_AMOUNT = "zoominc"; - public static String XML_VAR_BP_THICKNESS = "bpthick"; - public static String XML_VAR_BASE_THICKNESS = "basethick"; - public static String XML_VAR_DIST_NUMBERS = "distnumbers"; - - public static String XML_VAR_NUM_PERIOD = "numperiod"; - - public static String XML_VAR_MAIN_BP_STYLE = "bpstyle"; - - public static String XML_VAR_CM = "cm"; - - public static String XML_VAR_BACKBONE_COLOR = "backbonecol"; - public static String XML_VAR_HOVER_COLOR = "hovercol"; - public static String XML_VAR_BACKGROUND_COLOR = "backgroundcol"; - public static String XML_VAR_BOND_COLOR = "bondcol"; - public static String XML_VAR_TITLE_COLOR = "titlecol"; - public static String XML_VAR_SPECIAL_BASES_COLOR = "specialco"; - public static String XML_VAR_DASH_BASES_COLOR = "dashcol"; - public static String XML_VAR_SPACE_BETWEEN_BASES = "spacebetweenbases"; - - public static String XML_VAR_TITLE_FONT = "titlefont"; - public static String XML_VAR_NUMBERS_FONT = "numbersfont"; - public static String XML_VAR_FONT_BASES = "basefont"; - - public static String XML_VAR_CM_CAPTION = "cmcaption"; - public static String XML_VAR_TITLE = "title"; - - - public boolean _drawOutlineBases = true; - public boolean _fillBases = true; - public boolean _autoFit = true; - public boolean _autoCenter = true; - public boolean _modifiable = true; - public boolean _errorsOn = false; - public boolean _colorSpecialBases = false; - public boolean _colorDashBases = false; - public boolean _useBaseColorsForBPs = false; - public boolean _drawnNonCanonicalBP = true; - public boolean _drawnNonPlanarBP = true; - public boolean _showWarnings = false; - public boolean _comparisonMode = false; - public boolean _flatExteriorLoop = true; - public boolean _drawBackground = false; - public boolean _drawColorMap = false; - public boolean _drawBackbone = true; - - public double _colorMapHeight = DEFAULT_COLOR_MAP_HEIGHT; - public double _colorMapWidth = DEFAULT_COLOR_MAP_WIDTH; - public double _colorMapXOffset = DEFAULT_COLOR_MAP_X_OFFSET; - public double _colorMapYOffset = DEFAULT_COLOR_MAP_Y_OFFSET; - public double _zoom = DEFAULT_ZOOM; - public double _zoomAmount = DEFAULT_AMOUNT; - public double _bpThickness = 1.0; - public double _baseThickness = DEFAULT_BASE_OUTLINE_THICKNESS; - public double _distNumbers = DEFAULT_DIST_NUMBERS; - public double _spaceBetweenBases = DEFAULT_SPACE_BETWEEN_BASES; - - public int _numPeriod = DEFAULT_PERIOD; - public BP_STYLE _mainBPStyle = DEFAULT_BP_STYLE; - - public ModeleColorMap _cm = DEFAULT_COLOR_MAP; - - public Color _backboneColor = DEFAULT_BACKBONE_COLOR; - public Color _hoverColor = DEFAULT_HOVER_COLOR; - public Color _backgroundColor = DEFAULT_BACKGROUND_COLOR; - public Color _bondColor = DEFAULT_BOND_COLOR; - public Color _titleColor = DEFAULT_TITLE_COLOR; - public Color _specialBasesColor = DEFAULT_SPECIAL_BASE_COLOR; - public Color _dashBasesColor = DEFAULT_DASH_BASE_COLOR; - - public Font _titleFont = DEFAULT_TITLE_FONT; - public Font _numbersFont = DEFAULT_NUMBERS_FONT; - public Font _fontBasesGeneral = DEFAULT_BASE_FONT; - - public String _colorMapCaption = ""; - //public String _title = ""; - - - public static String XML_ELEMENT_NAME = "config"; - - public void toXML(TransformerHandler hd) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("","",XML_VAR_DRAW_OUTLINE,"CDATA", ""+_drawOutlineBases); - atts.addAttribute("","",XML_VAR_FILL_BASE,"CDATA", ""+_fillBases); - atts.addAttribute("","",XML_VAR_AUTO_FIT,"CDATA", ""+_autoFit); - atts.addAttribute("","",XML_VAR_AUTO_CENTER,"CDATA", ""+_autoCenter); - atts.addAttribute("","",XML_VAR_MODIFIABLE,"CDATA", ""+_modifiable); - atts.addAttribute("","",XML_VAR_ERRORS,"CDATA", ""+_errorsOn); - atts.addAttribute("","",XML_VAR_SPECIAL_BASES,"CDATA", ""+_colorSpecialBases); - atts.addAttribute("","",XML_VAR_DASH_BASES,"CDATA", ""+_colorDashBases); - atts.addAttribute("","",XML_VAR_USE_BASE_BPS,"CDATA", ""+_useBaseColorsForBPs); - atts.addAttribute("","",XML_VAR_DRAW_NC,"CDATA", ""+_drawnNonCanonicalBP); - atts.addAttribute("","",XML_VAR_DRAW_NON_PLANAR,"CDATA",""+_drawnNonPlanarBP); - atts.addAttribute("","",XML_VAR_SHOW_WARNINGS,"CDATA", ""+_showWarnings); - atts.addAttribute("","",XML_VAR_COMPARISON_MODE,"CDATA",""+_comparisonMode); - atts.addAttribute("","",XML_VAR_FLAT,"CDATA", ""+_flatExteriorLoop); - atts.addAttribute("","",XML_VAR_DRAW_BACKGROUND,"CDATA",""+_drawBackground); - atts.addAttribute("","",XML_VAR_COLOR_MAP,"CDATA", ""+_drawColorMap); - atts.addAttribute("","",XML_VAR_DRAW_BACKBONE,"CDATA", ""+_drawBackbone); - - atts.addAttribute("","",XML_VAR_CM_HEIGHT,"CDATA", ""+_colorMapHeight); - atts.addAttribute("","",XML_VAR_CM_WIDTH,"CDATA", ""+_colorMapWidth); - atts.addAttribute("","",XML_VAR_CM_X_OFFSET,"CDATA", ""+_colorMapXOffset); - atts.addAttribute("","",XML_VAR_CM_Y_OFFSET,"CDATA", ""+_colorMapYOffset); - atts.addAttribute("","",XML_VAR_DEFAULT_ZOOM,"CDATA", ""+_zoom); - atts.addAttribute("","",XML_VAR_ZOOM_AMOUNT,"CDATA", ""+_zoomAmount); - atts.addAttribute("","",XML_VAR_BP_THICKNESS,"CDATA", ""+_bpThickness); - atts.addAttribute("","",XML_VAR_BASE_THICKNESS,"CDATA", ""+_baseThickness); - atts.addAttribute("","",XML_VAR_DIST_NUMBERS,"CDATA", ""+_distNumbers); - atts.addAttribute("","",XML_VAR_SPACE_BETWEEN_BASES,"CDATA", ""+_spaceBetweenBases); - - - atts.addAttribute("","",XML_VAR_NUM_PERIOD,"CDATA", ""+_numPeriod); - - atts.addAttribute("","",XML_VAR_MAIN_BP_STYLE,"CDATA", ""+_mainBPStyle.getOpt()); - - atts.addAttribute("","",XML_VAR_BACKBONE_COLOR,"CDATA", XMLUtils.toHTMLNotation(_backboneColor)); - atts.addAttribute("","",XML_VAR_HOVER_COLOR,"CDATA", XMLUtils.toHTMLNotation(_hoverColor)); - atts.addAttribute("","",XML_VAR_BACKGROUND_COLOR,"CDATA", XMLUtils.toHTMLNotation(_backgroundColor)); - atts.addAttribute("","",XML_VAR_BOND_COLOR,"CDATA", XMLUtils.toHTMLNotation(_bondColor)); - atts.addAttribute("","",XML_VAR_TITLE_COLOR,"CDATA", XMLUtils.toHTMLNotation(_titleColor)); - atts.addAttribute("","",XML_VAR_SPECIAL_BASES_COLOR,"CDATA",XMLUtils.toHTMLNotation(_specialBasesColor)); - atts.addAttribute("","",XML_VAR_DASH_BASES_COLOR,"CDATA", XMLUtils.toHTMLNotation(_dashBasesColor)); - - atts.addAttribute("","",XML_VAR_CM,"CDATA", _cm.getParamEncoding()); - - - hd.startElement("","",XML_ELEMENT_NAME,atts); - XMLUtils.toXML(hd, _titleFont,XML_VAR_TITLE_FONT); - XMLUtils.toXML(hd, _numbersFont,XML_VAR_NUMBERS_FONT); - XMLUtils.toXML(hd, _fontBasesGeneral,XML_VAR_FONT_BASES); - - XMLUtils.exportCDATAElem(hd,XML_VAR_CM_CAPTION, _colorMapCaption); - hd.endElement("","",XML_ELEMENT_NAME); - } - - - - - public void loadFromXMLAttributes(Attributes attributes) - { - _drawOutlineBases = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_OUTLINE)); - _fillBases = Boolean.parseBoolean(attributes.getValue(XML_VAR_FILL_BASE)); - _autoFit = Boolean.parseBoolean(attributes.getValue(XML_VAR_AUTO_FIT)); - _autoCenter = Boolean.parseBoolean(attributes.getValue(XML_VAR_AUTO_CENTER)); - _modifiable = Boolean.parseBoolean(attributes.getValue(XML_VAR_MODIFIABLE)); - _errorsOn = Boolean.parseBoolean(attributes.getValue(XML_VAR_ERRORS)); - _colorSpecialBases = Boolean.parseBoolean(attributes.getValue(XML_VAR_SPECIAL_BASES)); - _colorDashBases = Boolean.parseBoolean(attributes.getValue(XML_VAR_DASH_BASES)); - _useBaseColorsForBPs = Boolean.parseBoolean(attributes.getValue(XML_VAR_USE_BASE_BPS)); - _drawnNonCanonicalBP = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_NC)); - _drawnNonPlanarBP = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_NON_PLANAR)); - _showWarnings = Boolean.parseBoolean(attributes.getValue(XML_VAR_SHOW_WARNINGS)); - _comparisonMode = Boolean.parseBoolean(attributes.getValue(XML_VAR_COMPARISON_MODE)); - _flatExteriorLoop = Boolean.parseBoolean(attributes.getValue(XML_VAR_FLAT)); - _drawBackground = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_BACKGROUND)); - _drawColorMap = Boolean.parseBoolean(attributes.getValue(XML_VAR_COLOR_MAP)); - _drawBackbone = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_BACKBONE)); - - _colorMapHeight = Double.parseDouble(attributes.getValue(XML_VAR_CM_HEIGHT)); - _colorMapWidth = Double.parseDouble(attributes.getValue(XML_VAR_CM_WIDTH)); - _colorMapXOffset = Double.parseDouble(attributes.getValue(XML_VAR_CM_X_OFFSET)); - _colorMapYOffset = Double.parseDouble(attributes.getValue(XML_VAR_CM_Y_OFFSET)); - _zoom = Double.parseDouble(attributes.getValue(XML_VAR_DEFAULT_ZOOM)); - _zoomAmount = Double.parseDouble(attributes.getValue(XML_VAR_ZOOM_AMOUNT)); - _bpThickness = Double.parseDouble(attributes.getValue(XML_VAR_BP_THICKNESS)); - _baseThickness = Double.parseDouble(attributes.getValue(XML_VAR_BASE_THICKNESS)); - _distNumbers = Double.parseDouble(attributes.getValue(XML_VAR_DIST_NUMBERS)); - _spaceBetweenBases = XMLUtils.getDouble(attributes, XML_VAR_SPACE_BETWEEN_BASES, DEFAULT_SPACE_BETWEEN_BASES); - - _numPeriod = Integer.parseInt(attributes.getValue(XML_VAR_NUM_PERIOD)); - - _mainBPStyle = BP_STYLE.getStyle(attributes.getValue(XML_VAR_MAIN_BP_STYLE)); - - _backboneColor = Color.decode(attributes.getValue(XML_VAR_BACKBONE_COLOR)); - _hoverColor = Color.decode(attributes.getValue(XML_VAR_HOVER_COLOR)); - _backgroundColor = Color.decode(attributes.getValue(XML_VAR_BACKGROUND_COLOR)); - _bondColor = Color.decode(attributes.getValue(XML_VAR_BOND_COLOR)); - _titleColor = Color.decode(attributes.getValue(XML_VAR_TITLE_COLOR)); - _specialBasesColor = Color.decode(attributes.getValue(XML_VAR_SPECIAL_BASES_COLOR)); - _dashBasesColor = Color.decode(attributes.getValue(XML_VAR_DASH_BASES_COLOR)); - - _cm = ModeleColorMap.parseColorMap(attributes.getValue(XML_VAR_CM)); - } - - - - public VARNAConfig clone () - { - - /** - * @j2sNative - * - * return this; - * - */ - try - { - ByteArrayOutputStream out = new ByteArrayOutputStream (); - ObjectOutputStream oout = new ObjectOutputStream (out); - oout.writeObject (this); - - ObjectInputStream in = new ObjectInputStream ( - new ByteArrayInputStream (out.toByteArray ())); - return (VARNAConfig)in.readObject (); - } - catch (Exception e) - { - throw new RuntimeException ("cannot clone class [" + - this.getClass ().getName () + "] via serialization: " + - e.toString ()); - } - } - -} diff --git a/src2/fr/orsay/lri/varna/models/VARNAConfigLoader.java b/src2/fr/orsay/lri/varna/models/VARNAConfigLoader.java deleted file mode 100644 index f62b187..0000000 --- a/src2/fr/orsay/lri/varna/models/VARNAConfigLoader.java +++ /dev/null @@ -1,1357 +0,0 @@ -/* - 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.models; - -/* - * VARNA is a Java library for quick automated drawings RNA secondary structure - * Copyright (C) 2007 Yann Ponty - * - * 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 . - */ - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Point; -import java.awt.geom.Point2D; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.Collection; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.exceptions.ExceptionDrawingAlgorithm; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionModeleStyleBaseSyntaxError; -import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.exceptions.ExceptionParameterError; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.interfaces.InterfaceParameterLoader; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation; -import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModelBaseStyle; -import fr.orsay.lri.varna.models.rna.RNA; - -/** - * An RNA 2d Panel demo applet - * - * @author Yann Ponty - * - */ - -public class VARNAConfigLoader { - - private static final int MAXSTYLE = 50; - - // Applet Options - - public static String algoOpt = "algorithm"; - public static String annotationsOpt = "annotations"; - public static String applyBasesStyleOpt = "applyBasesStyle"; - public static String auxBPsOpt = "auxBPs"; - public static String autoHelicesOpt = "autoHelices"; - public static String autoInteriorLoopsOpt = "autoInteriorLoops"; - public static String autoTerminalLoopsOpt = "autoTerminalLoops"; - - public static String backboneColorOpt = "backbone"; - public static String backgroundColorOpt = "background"; - public static String baseInnerColorOpt = "baseInner"; - public static String baseNameColorOpt = "baseName"; - public static String baseNumbersColorOpt = "baseNum"; - public static String baseOutlineColorOpt = "baseOutline"; - public static String basesStyleOpt = "basesStyle"; - public static String borderOpt = "border"; - public static String bondColorOpt = "bp"; - public static String bpIncrementOpt = "bpIncrement"; - public static String bpStyleOpt = "bpStyle"; - - public static String colorMapOpt = "colorMap"; - public static String colorMapCaptionOpt = "colorMapCaption"; - public static String colorMapDefOpt = "colorMapStyle"; - public static String colorMapMinOpt = "colorMapMin"; - public static String colorMapMaxOpt = "colorMapMax"; - public static String comparisonModeOpt = "comparisonMode"; - public static String chemProbOpt = "chemProb"; - public static String customBasesOpt = "customBases"; - public static String customBPsOpt = "customBPs"; - - public static String drawNCOpt = "drawNC"; - public static String drawBasesOpt = "drawBases"; - public static String drawTertiaryOpt = "drawTertiary"; - public static String drawColorMapOpt = "drawColorMap"; - public static String drawBackboneOpt = "drawBackbone"; - - public static String errorOpt = "error"; - - public static String fillBasesOpt = "fillBases"; - public static String firstSequenceForComparisonOpt = "firstSequence"; - public static String firstStructureForComparisonOpt = "firstStructure"; - public static String flatExteriorLoopOpt = "flat"; - public static String flipOpt = "flip"; - - public static String gapsBaseColorOpt = "gapsColor"; - - public static String highlightRegionOpt = "highlightRegion"; - - public static String nonStandardColorOpt = "nsBasesColor"; - public static String numColumnsOpt = "rows"; - public static String numRowsOpt = "columns"; - - public static String orientationOpt = "orientation"; - - public static String modifiableOpt = "modifiable"; - - public static String periodNumOpt = "periodNum"; - - public static String rotationOpt = "rotation"; - - public static String secondSequenceForComparisonOpt = "secondSequence"; - public static String secondStructureForComparisonOpt = "secondStructure"; - public static String sequenceOpt = "sequenceDBN"; - public static String spaceBetweenBasesOpt = "spaceBetweenBases"; - public static String structureOpt = "structureDBN"; - - public static String titleOpt = "title"; - public static String titleColorOpt = "titleColor"; - public static String titleSizeOpt = "titleSize"; - - public static String URLOpt = "url"; - - public static String warningOpt = "warning"; - - public static String zoomOpt = "zoom"; - public static String zoomAmountOpt = "zoomAmount"; - - // Applet assignable parameters - private String _algo; - public String _annotations; - public String _chemProbs; - private double _rotation; - - private String _sseq; - private String _sstruct; - - private int _numRows; - private int _numColumns; - - private String _title; - private int _titleSize; - private Color _titleColor; - - private String _auxBPs; - private String _highlightRegion; - - private boolean _autoHelices; - private boolean _autoInteriorLoops; - private boolean _autoTerminalLoops; - - private boolean _drawBackbone; - private Color _backboneColor; - private Color _bondColor; - private VARNAConfig.BP_STYLE _bpStyle; - private Color _baseOutlineColor; - private Color _baseInnerColor; - private Color _baseNumColor; - private Color _baseNameColor; - private Color _gapsColor; - private Color _nonStandardColor; - - private boolean _flatExteriorLoop; - private String _flip; - - private String _customBases; - private String _customBPs; - - private String _colorMapStyle; - private String _colorMapCaption; - private String _colorMapValues; - private double _colorMapMin = Double.MIN_VALUE; - private double _colorMapMax = Double.MAX_VALUE; - - private double _spaceBetweenBases = Double.MIN_VALUE; - - private boolean _drawNC; - private boolean _drawBases; - private boolean _drawTertiary; - private boolean _drawColorMap; - - private boolean _fillBases; - - private int _periodResNum; - private Dimension _border; - - private Color _backgroundColor; - - private String _orientation; - - private boolean _warning, _error; - - private boolean _modifiable; - - private double _zoom, _zoomAmount; - - private ArrayList _basesStyleList; - - private boolean _comparisonMode; - - private String _firstSequence; - private String _secondSequence; - private String _firstStructure; - private String _secondStructure; - - private VARNAPanel _mainSurface; - - private boolean _useNonStandardColor; - private boolean _useGapsColor; - private double _bpIncrement; - - private boolean _useInnerBaseColor; - private boolean _useBaseNameColor; - private boolean _useBaseNumbersColor; - private boolean _useBaseOutlineColor; - - private String _URL; - - protected ArrayList _VARNAPanelList = new ArrayList(); - - InterfaceParameterLoader _optionProducer; - - public VARNAConfigLoader(InterfaceParameterLoader il) { - _optionProducer = il; - } - - public ArrayList createVARNAPanels() - throws ExceptionParameterError, - ExceptionModeleStyleBaseSyntaxError, ExceptionNonEqualLength, - IOException, ExceptionFileFormatOrSyntax, ExceptionLoadingFailed { - _VARNAPanelList.clear(); - retrieveParametersValues(); - return _VARNAPanelList; - } - - public int getNbRows() { - return this._numRows; - } - - public int getNbColumns() { - return this._numColumns; - } - - private void initValues() { - - // Applet assignable parameters - _algo = "radiate"; - _auxBPs = ""; - _autoHelices = false; - _autoInteriorLoops = false; - _autoTerminalLoops = false; - _annotations = ""; - _backgroundColor = VARNAConfig.DEFAULT_BACKGROUND_COLOR; - _customBases = ""; - _customBPs = ""; - _chemProbs = ""; - - _colorMapStyle = ""; - _colorMapValues = ""; - _colorMapCaption = ""; - _drawColorMap = false; - - _drawBases = true; - _fillBases = true; - _drawNC = true; - _drawTertiary = true; - _border = new Dimension(0, 0); - _sseq = "";// = - // "CAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIA"; - _sstruct = "";// = - // "..(((((...(((((...(((((...(((((.....)))))...))))).....(((((...(((((.....)))))...))))).....)))))...))))).."; - _periodResNum = VARNAConfig.DEFAULT_PERIOD; - _rotation = 0.0; - _title = ""; - _titleSize = VARNAConfig.DEFAULT_TITLE_FONT.getSize(); - - _backboneColor = VARNAConfig.DEFAULT_BACKBONE_COLOR; - _drawBackbone = true; - - _bondColor = VARNAConfig.DEFAULT_BOND_COLOR; - _bpStyle = VARNAConfig.DEFAULT_BP_STYLE; - - _highlightRegion = ""; - - _baseOutlineColor = VARNAConfig.BASE_OUTLINE_COLOR_DEFAULT; - _baseInnerColor = VARNAConfig.BASE_INNER_COLOR_DEFAULT; - _baseNumColor = VARNAConfig.BASE_NUMBER_COLOR_DEFAULT; - _baseNameColor = VARNAConfig.BASE_NAME_COLOR_DEFAULT; - - _titleColor = VARNAConfig.DEFAULT_TITLE_COLOR; - _warning = false; - _error = true; - _modifiable = true; - _zoom = VARNAConfig.DEFAULT_ZOOM; - _zoomAmount = VARNAConfig.DEFAULT_AMOUNT; - - _comparisonMode = false; - _firstSequence = ""; - _firstStructure = ""; - _secondSequence = ""; - _secondStructure = ""; - - _gapsColor = VARNAConfig.DEFAULT_DASH_BASE_COLOR; - _useGapsColor = false; - _nonStandardColor = VARNAConfig.DEFAULT_SPECIAL_BASE_COLOR; - _useNonStandardColor = false; - - _useInnerBaseColor = false; - _useBaseNameColor = false; - _useBaseNumbersColor = false; - _useBaseOutlineColor = false; - - _bpIncrement = VARNAConfig.DEFAULT_BP_INCREMENT; - - _URL = ""; - _flatExteriorLoop = true; - _flip = ""; - _orientation = ""; - _spaceBetweenBases = VARNAConfig.DEFAULT_SPACE_BETWEEN_BASES; - } - - public static Color getSafeColor(String col, Color def) { - Color result; - try { - result = Color.decode(col); - - } catch (NumberFormatException e) { - try { - result = Color.getColor(col, def); - } catch (Exception e2) { - // Not a valid color - return def; - } - } - return result; - } - - public static final String LEONTIS_WESTHOF_BP_STYLE = "lw"; - public static final String LEONTIS_WESTHOF_BP_STYLE_ALT = "lwalt"; - public static final String SIMPLE_BP_STYLE = "simple"; - public static final String RNAVIZ_BP_STYLE = "rnaviz"; - public static final String NONE_BP_STYLE = "none"; - - private VARNAConfig.BP_STYLE getSafeBPStyle(String opt, - VARNAConfig.BP_STYLE def) { - VARNAConfig.BP_STYLE b = VARNAConfig.BP_STYLE.getStyle(opt); - if (b!= null) - { - return b; - } else { - return def; - } - } - - public static String[][] getParameterInfo() { - String[][] info = { - // Parameter Name Kind of Value Description - { - algoOpt, - "String", - "Drawing algorithm, choosen from [" - + VARNAConfigLoader.ALGORITHM_NAVIEW + "," - + VARNAConfigLoader.ALGORITHM_LINE + "," - + VARNAConfigLoader.ALGORITHM_RADIATE + "," - + VARNAConfigLoader.ALGORITHM_CIRCULAR + "]" }, - { annotationsOpt, "string", "A set of textual annotations" }, - { applyBasesStyleOpt, "String", "Base style application" }, - { - auxBPsOpt, - "String", - "Adds a list of (possibly non-canonical) base-pairs to those already defined by the main secondary structure (Ex: \"(1,10);(2,11);(3,12)\"). Custom BP styles can be specified (Ex: \"(2,11):thickness=4;(3,12):color=#FF0000\")." }, - { autoHelicesOpt, "", "" }, - { autoInteriorLoopsOpt, "", "" }, - { autoTerminalLoopsOpt, "", "" }, - { backboneColorOpt, "Color", "Backbone color (Ex: #334455)" }, - { backgroundColorOpt, "Color", "Background color (Ex: #334455)" }, - { baseInnerColorOpt, "Color", - "Default value for inner base color (Ex: #334455)" }, - { baseNameColorOpt, "Color", - "Residues font color (Ex: #334455)" }, - { baseNumbersColorOpt, "Color", - "Base numbers font color (Ex: #334455)" }, - { baseOutlineColorOpt, "Color", - "Base outline color (Ex: #334455)" }, - { basesStyleOpt, "String", "Base style declaration" }, - { borderOpt, "String", - "Border width and height in pixels (Ex: \"20x40\")" }, - { bondColorOpt, "Color", "Base pair color (Ex: #334455)" }, - { bpIncrementOpt, "float", - "Distance between nested base-pairs (i.e. arcs) in linear representation" }, - { - bpStyleOpt, - "String", - "Look and feel for base pairs drawings, choosen from [" - + VARNAConfigLoader.LEONTIS_WESTHOF_BP_STYLE+ "," - + VARNAConfigLoader.LEONTIS_WESTHOF_BP_STYLE_ALT+ "," - + VARNAConfigLoader.NONE_BP_STYLE + "," - + VARNAConfigLoader.SIMPLE_BP_STYLE + "," - + VARNAConfigLoader.RNAVIZ_BP_STYLE + "]" }, - { chemProbOpt, "", "" }, - { - colorMapOpt, - "String", - "Associates a list of numerical values (eg '0.2,0.4,0.6,0.8') with the RNA bases with respect to their natural order, and modifies the color used to fill these bases according to current color map style." }, - { colorMapCaptionOpt, "String", - "Sets current color map caption." }, - { - colorMapDefOpt, - "String", - "Selects a specific color map style. It can be either one of the predefined styles (eg 'red', 'green', 'blue', 'bw', 'heat', 'energy') or a new one (eg '0:#FFFF00;1:#ffFFFF;6:#FF0000')." }, - { colorMapMinOpt, "", "" }, - { colorMapMaxOpt, "", "" }, - { comparisonModeOpt, "boolean", "Activates comparison mode" }, - { customBasesOpt, "", "" }, - { customBPsOpt, "", "" }, - { drawBackboneOpt, "boolean", - "True if the backbone must be drawn, false otherwise" }, - { drawColorMapOpt, "", "" }, - { drawNCOpt, "boolean", - "Toggles on/off display of non-canonical base-pairs" }, - { drawBasesOpt, "boolean", "Shows/hide the outline of bases" }, - { drawTertiaryOpt, "boolean", - "Toggles on/off display of tertiary interaction, ie pseudoknots" }, - { errorOpt, "boolean", "Show errors" }, - { fillBasesOpt, "boolean", - "Fills or leaves empty the inner portions of bases" }, - { firstSequenceForComparisonOpt, "String", - "In comparison mode, sequence of first RNA" }, - { firstStructureForComparisonOpt, "String", - "In comparison mode, structure of first RNA" }, - { flatExteriorLoopOpt, "boolean", - "Toggles on/off (true/false) drawing exterior bases on a straight line" }, - { flipOpt, "String", - "Draws a set of exterior helices, identified by the argument string, in clockwise order (default drawing is counter-clockwise). The argument is a semicolon-separated list of helices, each identified by a base or a base-pair (eg. \"2;20-34\")." }, - { gapsBaseColorOpt, "Color", - "Define and use custom color for gaps bases in comparison mode" }, - { highlightRegionOpt, "string", "Highlight a set of contiguous regions" }, - { modifiableOpt, "boolean", "Allows/prohibits modifications" }, - { nonStandardColorOpt, "Color", - "Define and use custom color for non-standard bases in comparison mode" }, - { numColumnsOpt, "int", "Sets number of columns" }, - { numRowsOpt, "int", "Sets number of rows" }, - { - orientationOpt, - "float", - "Sets the general orientation of an RNA, i.e. the deviation of the longest axis (defined by the most distant couple of bases) from the horizontal axis." }, - { periodNumOpt, "int", "Periodicity of base-numbering" }, - { secondSequenceForComparisonOpt, "String", - "In comparison mode, sequence of second RNA" }, - { secondStructureForComparisonOpt, "String", - "In comparison mode, structure of second RNA" }, - { sequenceOpt, "String", "Raw RNA sequence" }, - { structureOpt, "String", - "RNA structure given in dot bracket notation (DBN)" }, - { - rotationOpt, - "float", - "Rotates RNA after initial drawing (Ex: '20' for a 20 degree counter-clockwise rotation)" }, - { titleOpt, "String", "RNA drawing title" }, - { titleColorOpt, "Color", "Title color (Ex: #334455)" }, - { titleSizeOpt, "int", "Title font size" }, - { spaceBetweenBasesOpt, "float", - "Sets the space between consecutive bases" }, - { warningOpt, "boolean", "Show warnings" }, - { zoomOpt, "int", "Zoom coefficient" }, - { zoomAmountOpt, "int", "Zoom increment on user interaction" } }; - return info; - } - - private void retrieveParametersValues() throws ExceptionParameterError { - - _numRows = 1; - _numColumns = 1; - _basesStyleList = new ArrayList(); - - try { - _numRows = Integer.parseInt(_optionProducer.getParameterValue( - numRowsOpt, "" + _numRows)); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), "'" - + _optionProducer.getParameterValue(numRowsOpt, "" - + _numRows) - + "' is not a integer value for the number of rows !"); - } - try { - _numColumns = Integer.parseInt(_optionProducer.getParameterValue( - numColumnsOpt, "" + _numColumns)); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), "'" - + _optionProducer.getParameterValue(numColumnsOpt, "" - + _numColumns) - + "' is not a integer value for the number of columns !"); - } - - String tmp = null; - for (int i = 0; i < MAXSTYLE; i++) { - String opt = basesStyleOpt + i; - tmp = _optionProducer.getParameterValue(opt, null); - // System.out.println(opt+"->"+tmp); - if (tmp != null) { - ModelBaseStyle msb = new ModelBaseStyle(); - try { - msb.assignParameters(tmp); - } catch (ExceptionModeleStyleBaseSyntaxError e) { - VARNAPanel.emitWarningStatic(e, null); - } - _basesStyleList.add(msb); - } else { - _basesStyleList.add(null); - } - } - - // _containerApplet.getLayout(). - int x; - String n; - initValues(); - for (int i = 0; i < _numColumns; i++) { - for (int j = 0; j < _numRows; j++) { - try { - // initValues(); - x = 1 + j + i * _numRows; - n = "" + x; - if ((_numColumns == 1) && (_numRows == 1)) { - n = ""; - } - _useGapsColor = false; - _useNonStandardColor = false; - - tmp = _optionProducer.getParameterValue(baseNameColorOpt - + n, ""); - if (!tmp.equals("")) { - _useBaseNameColor = true; - _baseNameColor = getSafeColor(tmp, _baseNameColor); - } - tmp = _optionProducer.getParameterValue(baseNumbersColorOpt - + n, ""); - if (!tmp.equals("")) { - _useBaseNumbersColor = true; - _baseNumColor = getSafeColor(tmp, _baseNumColor); - } - tmp = _optionProducer.getParameterValue(baseOutlineColorOpt - + n, ""); - if (!tmp.equals("")) { - _useBaseOutlineColor = true; - _baseOutlineColor = getSafeColor(tmp, _baseOutlineColor); - } - tmp = _optionProducer.getParameterValue(baseInnerColorOpt - + n, ""); - if (!tmp.equals("")) { - _useInnerBaseColor = true; - _baseInnerColor = getSafeColor(tmp, _baseInnerColor); - } - - tmp = _optionProducer.getParameterValue(nonStandardColorOpt - + n, ""); - if (!tmp.equals("")) { - _nonStandardColor = getSafeColor(tmp, _nonStandardColor); - _useNonStandardColor = true; - } - tmp = _optionProducer.getParameterValue(gapsBaseColorOpt - + n, _gapsColor.toString()); - if (!tmp.equals("")) { - _gapsColor = getSafeColor(tmp, _gapsColor); - _useGapsColor = true; - } - try { - _rotation = Double.parseDouble(_optionProducer - .getParameterValue(rotationOpt + n, - Double.toString(_rotation))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), "'" - + _optionProducer.getParameterValue(rotationOpt - + n, "" + _rotation) - + "' is not a valid float value for rotation!"); - } - - try { - _colorMapMin = Double.parseDouble(_optionProducer - .getParameterValue(colorMapMinOpt + n, - Double.toString(this._colorMapMin))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError( - e.getMessage(), - "'" - + _optionProducer.getParameterValue( - colorMapMinOpt + n, "" - + _colorMapMin) - + "' is not a valid double value for min color map values range!"); - } - - try { - _colorMapMax = Double.parseDouble(_optionProducer - .getParameterValue(colorMapMaxOpt + n, - Double.toString(this._colorMapMax))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError( - e.getMessage(), - "'" - + _optionProducer.getParameterValue( - colorMapMaxOpt + n, "" - + _colorMapMax) - + "' is not a valid double value for max color map values range!"); - } - - try { - _bpIncrement = Double.parseDouble(_optionProducer - .getParameterValue(bpIncrementOpt + n, - Double.toString(_bpIncrement))); - } catch (NumberFormatException e) { - } - - try { - _periodResNum = Integer.parseInt(_optionProducer - .getParameterValue(periodNumOpt + n, "" - + _periodResNum)); - } catch (NumberFormatException e) { - throw new ExceptionParameterError( - e.getMessage(), - "'" - + _optionProducer.getParameterValue( - periodNumOpt + n, "" - + _periodResNum) - + "' is not a valid integer value for the period of residue numbers!"); - } - try { - _titleSize = Integer.parseInt(_optionProducer - .getParameterValue(titleSizeOpt + n, "" - + _titleSize)); - } catch (NumberFormatException e) { - throw new ExceptionParameterError( - e.getMessage(), - "'" - + _optionProducer.getParameterValue( - titleSizeOpt + n, "" - + _titleSize) - + "' is not a valid integer value for the number of rows !"); - } - - try { - _zoom = Double.parseDouble(_optionProducer - .getParameterValue(zoomOpt + n, "" + _zoom)); - } catch (NumberFormatException e) { - throw new ExceptionParameterError( - e.getMessage(), - "'" - + _optionProducer.getParameterValue( - zoomOpt + n, "" + _zoom) - + "' is not a valid integer value for the zoom !"); - } - - try { - _zoomAmount = Double.parseDouble(_optionProducer - .getParameterValue(zoomAmountOpt + n, "" - + _zoomAmount)); - } catch (NumberFormatException e) { - throw new ExceptionParameterError( - e.getMessage(), - "'" - + _optionProducer.getParameterValue( - zoomAmountOpt + n, "" - + _zoomAmount) - + "' is not a valid integer value for the zoom amount!"); - } - - try { - _spaceBetweenBases = Double.parseDouble(_optionProducer - .getParameterValue(spaceBetweenBasesOpt + n, "" - + _spaceBetweenBases)); - } catch (NumberFormatException e) { - throw new ExceptionParameterError( - e.getMessage(), - "'" - + _optionProducer.getParameterValue( - spaceBetweenBasesOpt + n, "" - + _spaceBetweenBases) - + "' is not a valid integer value for the base spacing!"); - } - - _drawBases = Boolean.parseBoolean(_optionProducer - .getParameterValue(drawBasesOpt + n, "" - + _drawBases)); - _fillBases = Boolean.parseBoolean(_optionProducer - .getParameterValue(fillBasesOpt + n, "" - + _fillBases)); - _autoHelices = Boolean.parseBoolean(_optionProducer - .getParameterValue(autoHelicesOpt + n, "" - + _autoHelices)); - _drawColorMap = Boolean.parseBoolean(_optionProducer - .getParameterValue(drawColorMapOpt + n, "" - + _drawColorMap)); - _drawBackbone = Boolean.parseBoolean(_optionProducer - .getParameterValue(drawBackboneOpt + n, "" - + _drawBackbone)); - _colorMapValues = _optionProducer.getParameterValue( - colorMapOpt + n, _colorMapValues); - _autoTerminalLoops = Boolean.parseBoolean(_optionProducer - .getParameterValue(autoTerminalLoopsOpt + n, "" - + _autoTerminalLoops)); - _autoInteriorLoops = Boolean.parseBoolean(_optionProducer - .getParameterValue(autoInteriorLoopsOpt + n, "" - + _autoInteriorLoops)); - _drawNC = Boolean.parseBoolean(_optionProducer - .getParameterValue(drawNCOpt + n, "" + _drawNC)); - _flatExteriorLoop = Boolean.parseBoolean(_optionProducer - .getParameterValue(flatExteriorLoopOpt + n, "" - + _flatExteriorLoop)); - _drawTertiary = Boolean.parseBoolean(_optionProducer - .getParameterValue(drawTertiaryOpt + n, "" - + _drawTertiary)); - _warning = Boolean.parseBoolean(_optionProducer - .getParameterValue(warningOpt + n, "false")); - _error = Boolean.parseBoolean(_optionProducer - .getParameterValue(errorOpt + n, "true")); - _border = parseDimension(_optionProducer.getParameterValue( - borderOpt + n, "0X0")); - _comparisonMode = Boolean.parseBoolean(_optionProducer - .getParameterValue(comparisonModeOpt + n, "false")); - _firstSequence = _optionProducer.getParameterValue( - firstSequenceForComparisonOpt + n, _firstSequence); - _firstStructure = _optionProducer - .getParameterValue(firstStructureForComparisonOpt - + n, _firstStructure); - _secondSequence = _optionProducer - .getParameterValue(secondSequenceForComparisonOpt - + n, _secondSequence); - _secondStructure = _optionProducer.getParameterValue( - secondStructureForComparisonOpt + n, - _secondStructure); - _annotations = _optionProducer.getParameterValue( - annotationsOpt + n, _annotations); - _URL = _optionProducer.getParameterValue(URLOpt + n, _URL); - _algo = _optionProducer.getParameterValue(algoOpt + n, - _algo); - _customBases = _optionProducer.getParameterValue( - customBasesOpt + n, _customBases); - _auxBPs = _optionProducer.getParameterValue(auxBPsOpt + n, - _auxBPs); - _highlightRegion = _optionProducer.getParameterValue( - highlightRegionOpt + n, _highlightRegion); - _chemProbs = _optionProducer.getParameterValue(chemProbOpt - + n, _chemProbs); - _customBPs = _optionProducer.getParameterValue(customBPsOpt - + n, _customBPs); - _colorMapStyle = _optionProducer.getParameterValue( - colorMapDefOpt + n, _colorMapStyle); - _colorMapCaption = _optionProducer.getParameterValue( - colorMapCaptionOpt + n, _colorMapCaption); - _backboneColor = getSafeColor( - _optionProducer.getParameterValue(backboneColorOpt - + n, _backboneColor.toString()), - _backboneColor); - _backgroundColor = getSafeColor( - _optionProducer.getParameterValue( - backgroundColorOpt + n, - _backgroundColor.toString()), - _backgroundColor); - _bondColor = getSafeColor( - _optionProducer.getParameterValue(bondColorOpt + n, - _bondColor.toString()), _bondColor); - _bpStyle = getSafeBPStyle( - _optionProducer.getParameterValue(bpStyleOpt + n, - ""), _bpStyle); - _flip = _optionProducer.getParameterValue( - flipOpt + n, _flip); - _orientation = _optionProducer.getParameterValue( - orientationOpt + n, _orientation); - _titleColor = getSafeColor( - _optionProducer.getParameterValue( - titleColorOpt + n, _titleColor.toString()), - _titleColor); - - - - if (!_URL.equals("")) { - _sstruct = ""; - _sseq = ""; - _title = ""; - } - _title = _optionProducer.getParameterValue(titleOpt + n, _title); - - if (_comparisonMode && _firstSequence != null - && _firstStructure != null - && _secondSequence != null - && _secondStructure != null) { - } else { - _sseq = _optionProducer.getParameterValue(sequenceOpt - + n, _sseq); - _sstruct = _optionProducer.getParameterValue( - structureOpt + n, _sstruct); - if (!_sseq.equals("") && !_sstruct.equals("")) { - _URL = ""; - } - _comparisonMode = false; - } - - // applique les valeurs des parametres recuperees - applyValues(n); - } catch (ExceptionParameterError e) { - VARNAPanel.errorDialogStatic(e, _mainSurface); - } catch (ExceptionNonEqualLength e) { - VARNAPanel.errorDialogStatic(e, _mainSurface); - } catch (IOException e) { - VARNAPanel.errorDialogStatic(e, _mainSurface); - } catch (ExceptionFileFormatOrSyntax e) { - VARNAPanel.errorDialogStatic(e, _mainSurface); - } catch (ExceptionLoadingFailed e) { - VARNAPanel.errorDialogStatic(e, _mainSurface); - } - }// fin de boucle sur les lignes - }// fin de boucle sur les colonnes - } - - private RNA _defaultRNA = new RNA(); - - public void setRNA(RNA r) { - _defaultRNA = r; - } - - public static final String ALGORITHM_CIRCULAR = "circular"; - public static final String ALGORITHM_NAVIEW = "naview"; - public static final String ALGORITHM_LINE = "line"; - public static final String ALGORITHM_RADIATE = "radiate"; - public static final String ALGORITHM_VARNA_VIEW = "varnaview"; - public static final String ALGORITHM_MOTIF_VIEW = "motifview"; - - private void applyValues(String n) throws ExceptionParameterError, - ExceptionNonEqualLength, IOException, ExceptionFileFormatOrSyntax, - ExceptionLoadingFailed { - boolean applyOptions = true; - int algoCode; - if (_algo.equals(ALGORITHM_CIRCULAR)) - algoCode = RNA.DRAW_MODE_CIRCULAR; - else if (_algo.equals(ALGORITHM_NAVIEW)) - algoCode = RNA.DRAW_MODE_NAVIEW; - else if (_algo.equals(ALGORITHM_LINE)) - algoCode = RNA.DRAW_MODE_LINEAR; - else if (_algo.equals(ALGORITHM_RADIATE)) - algoCode = RNA.DRAW_MODE_RADIATE; - else if (_algo.equals(ALGORITHM_VARNA_VIEW)) - algoCode = RNA.DRAW_MODE_VARNA_VIEW; - else if (_algo.equals(ALGORITHM_MOTIF_VIEW)) - algoCode = RNA.DRAW_MODE_MOTIFVIEW; - else - algoCode = RNA.DRAW_MODE_RADIATE; - - if (_comparisonMode) { - _mainSurface = new VARNAPanel(_firstSequence, _firstStructure, - _secondSequence, _secondStructure, algoCode, ""); - } else { - _mainSurface = new VARNAPanel(); - } - - _VARNAPanelList.add(_mainSurface); - _mainSurface.setSpaceBetweenBases(_spaceBetweenBases); - _mainSurface.setTitle(_title); - - if (!_URL.equals("")) { - URL url = null; - try { - - _mainSurface.setSpaceBetweenBases(_spaceBetweenBases); - - url = new URL(_URL); - URLConnection connexion = url.openConnection(); - connexion.setUseCaches(false); - InputStream r = connexion.getInputStream(); - InputStreamReader inr = new InputStreamReader(r); - - if (_URL.toLowerCase().endsWith( - VARNAPanel.VARNA_SESSION_EXTENSION)) { - FullBackup f; - f = VARNAPanel.importSession(r, _URL); - _mainSurface.setConfig(f.config); - _mainSurface.showRNA(f.rna); - applyOptions = false; - } else { - Collection rnas = RNAFactory.loadSecStr( - new BufferedReader(inr), - RNAFactory.guessFileTypeFromExtension(_URL)); - if (rnas.isEmpty()) { - throw new ExceptionFileFormatOrSyntax( - "No RNA in file '" + _URL + "'."); - } - RNA rna = rnas.iterator().next(); - rna.drawRNA(algoCode, _mainSurface.getConfig()); - _mainSurface.drawRNA(rna, algoCode); - } - if (!_title.isEmpty()) - { - _mainSurface.setTitle(_title); - } - } catch (ExceptionFileFormatOrSyntax e) { - if (url != null) - e.setPath(url.getPath()); - } catch (ExceptionDrawingAlgorithm e) { - _mainSurface.emitWarning(e.getMessage()); - } - - } else { - if (!_comparisonMode) { - if (!_sstruct.equals("")) { - _mainSurface.drawRNA(_sseq, _sstruct, algoCode); - } else { - try { - System.err.println("Printing default RNA "+_defaultRNA); - _defaultRNA.drawRNA(algoCode, _mainSurface.getConfig()); - } catch (ExceptionDrawingAlgorithm e) { - e.printStackTrace(); - } - _mainSurface.drawRNA(_defaultRNA); - } - } - } - if (applyOptions) - { - if (_useInnerBaseColor) { - _mainSurface.setBaseInnerColor(_baseInnerColor); - } - if (_useBaseOutlineColor) { - _mainSurface.setBaseOutlineColor(_baseOutlineColor); - } - if (_useBaseNameColor) { - _mainSurface.setBaseNameColor(_baseNameColor); - } - if (_useBaseNumbersColor) { - _mainSurface.setBaseNumbersColor(_baseNumColor); - } - - _mainSurface.setBackground(_backgroundColor); - _mainSurface.setNumPeriod(_periodResNum); - _mainSurface.setBackboneColor(_backboneColor); - _mainSurface.setDefaultBPColor(_bondColor); - _mainSurface.setBPHeightIncrement(_bpIncrement); - _mainSurface.setBPStyle(_bpStyle); - _mainSurface.setDrawBackbone(_drawBackbone); - - _mainSurface.setTitleFontColor(_titleColor); - _mainSurface.setTitleFontSize(_titleSize); - - _mainSurface.getPopupMenu().get_itemShowWarnings() - .setState(_warning); - _mainSurface.setErrorsOn(_error); - _mainSurface.setFlatExteriorLoop(_flatExteriorLoop); - _mainSurface.setZoom(_zoom); - _mainSurface.setZoomIncrement(_zoomAmount); - _mainSurface.setBorderSize(_border); - - if (_useGapsColor) { - _mainSurface.setGapsBasesColor(this._gapsColor); - _mainSurface.setColorGapsBases(true); - } - - if (_useNonStandardColor) { - _mainSurface.setNonStandardBasesColor(_nonStandardColor); - _mainSurface.setColorNonStandardBases(true); - } - - _mainSurface.setShowNonPlanarBP(_drawTertiary); - _mainSurface.setShowNonCanonicalBP(_drawNC); - - applyBasesStyle(n); - - if (!_customBases.equals("")) - applyBasesCustomStyles(_mainSurface); - - if (!_highlightRegion.equals("")) - applyHighlightRegion(_mainSurface); - - if (!_auxBPs.equals("")) - applyAuxBPs(_mainSurface); - - if (!_chemProbs.equals("")) - applyChemProbs(_mainSurface); - - if (!_customBPs.equals("")) - applyBPsCustomStyles(_mainSurface); - - _mainSurface.setDrawOutlineBases(_drawBases); - _mainSurface.setFillBases(_fillBases); - _mainSurface.drawRNA(); - - if (!_annotations.equals("")) - applyAnnotations(_mainSurface); - if (_autoHelices) - _mainSurface.getVARNAUI().UIAutoAnnotateHelices(); - if (_autoTerminalLoops) - _mainSurface.getVARNAUI().UIAutoAnnotateTerminalLoops(); - if (_autoInteriorLoops) - _mainSurface.getVARNAUI().UIAutoAnnotateInteriorLoops(); - - if (!_orientation.equals("")) { - try { - double d = 360 * _mainSurface.getOrientation() - / (2. * Math.PI); - _rotation = Double.parseDouble(_orientation) - d; - } catch (NumberFormatException e) { - // TODO : Add some code here... - } - - } - _mainSurface.globalRotation(_rotation); - - _mainSurface.setModifiable(_modifiable); - - _mainSurface.setColorMapCaption(_colorMapCaption); - applyColorMapStyle(_mainSurface); - applyFlips(_mainSurface); - applyColorMapValues(_mainSurface); - - // if (!_drawColorMap) - // _mainSurface.drawColorMap(_drawColorMap); - } - // ajoute le VARNAPanel au conteneur - } - - private void applyBasesStyle(String n) throws ExceptionParameterError { - String tmp = null; - for (int numStyle = 0; numStyle < _basesStyleList.size(); numStyle++) { - if (_basesStyleList.get(numStyle) != null) { - tmp = _optionProducer.getParameterValue(applyBasesStyleOpt - + (numStyle) + "on" + n, null); - - ArrayList indicesList = new ArrayList(); - if (tmp != null) { - String[] basesList = tmp.split(","); - for (int k = 0; k < basesList.length; k++) { - String cand = basesList[k].trim(); - try { - String[] args = cand.split("-"); - if (args.length == 1) { - int baseNum = Integer.parseInt(cand); - int index = _mainSurface.getRNA() - .getIndexFromBaseNumber(baseNum); - if (index != -1) { - indicesList.add(index); - } - } else if (args.length == 2) { - int baseNumFrom = Integer.parseInt(args[0] - .trim()); - int indexFrom = _mainSurface.getRNA() - .getIndexFromBaseNumber(baseNumFrom); - int baseNumTo = Integer - .parseInt(args[1].trim()); - int indexTo = _mainSurface.getRNA() - .getIndexFromBaseNumber(baseNumTo); - if ((indexFrom != -1) && (indexTo != -1)) { - for (int l = indexFrom; l <= indexTo; l++) - indicesList.add(l); - } - } - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), - "Bad Base Index: " + basesList[k]); - } - } - for (int k = 0; k < indicesList.size(); k++) { - int index = indicesList.get(k); - if ((index >= 0) - && (index < _mainSurface.getRNA() - .get_listeBases().size())) { - _mainSurface - .getRNA() - .get_listeBases() - .get(index) - .setStyleBase(_basesStyleList.get(numStyle)); - } - } - } - } - }// fin de boucle sur les styles - - } - - private void applyColorMapStyle(VARNAPanel vp) { - if (_colorMapStyle.length() != 0) { - vp.setColorMap(ModeleColorMap.parseColorMap(_colorMapStyle)); - } - } - - private void applyColorMapValues(VARNAPanel vp) { - if (!_colorMapValues.equals("")) { - File f = new File(_colorMapValues); - if(f.exists() && !f.isDirectory()) { - try { - vp.readValues(new FileReader(f)); - vp.drawColorMap(true); - System.err.println("Loaded "+_colorMapValues); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - else - { - String[] values = _colorMapValues.split("[;,]"); - ArrayList vals = new ArrayList(); - for (int i = 0; i < values.length; i++) { - try { - vals.add(Double.parseDouble(values[i])); - } catch (Exception e) { - - } - } - Double[] result = new Double[vals.size()]; - vals.toArray(result); - vp.setColorMapValues(result); - } - ModeleColorMap cm = vp.getColorMap(); - if (_colorMapMin != Double.MIN_VALUE) { - // System.out.println("[A]"+_colorMapMin); - cm.setMinValue(_colorMapMin); - } - if (_colorMapMax != Double.MAX_VALUE) { - cm.setMaxValue(_colorMapMax); - } - _drawColorMap = true; - } - } - - private void applyBasesCustomStyles(VARNAPanel vp) { - String[] baseStyles = _customBases.split(";"); - for (int i = 0; i < baseStyles.length; i++) { - String thisStyle = baseStyles[i]; - String[] data = thisStyle.split(":"); - try { - if (data.length == 2) { - int baseNum = Integer.parseInt(data[0]); - int index = _mainSurface.getRNA().getIndexFromBaseNumber( - baseNum); - if (index != -1) { - String style = data[1]; - ModelBaseStyle msb = vp.getRNA().get_listeBases() - .get(index).getStyleBase().clone(); - msb.assignParameters(style); - vp.getRNA().get_listeBases().get(index) - .setStyleBase(msb); - } - } - } catch (Exception e) { - System.err.println("ApplyBasesCustomStyle: " + e.toString()); - } - } - } - - private void applyHighlightRegion(VARNAPanel vp) { - String[] regions = _highlightRegion.split(";"); - for (int i = 0; i < regions.length; i++) { - String region = regions[i]; - try { - HighlightRegionAnnotation nt = HighlightRegionAnnotation - .parseHighlightRegionAnnotation(region, vp); - if (nt != null) { - vp.addHighlightRegion(nt); - } - } catch (Exception e) { - System.err.println("Error in applyHighlightRegion: " + e.toString()); - } - } - } - - private Dimension parseDimension(String s) { - Dimension d = new Dimension(0, 0); - try { - s = s.toLowerCase(); - int i = s.indexOf('x'); - String w = s.substring(0, i); - String h = s.substring(i + 1); - d.width = Integer.parseInt(w); - d.height = Integer.parseInt(h); - } catch (NumberFormatException e) { - } - return d; - } - - private void applyBPsCustomStyles(VARNAPanel vp) { - String[] baseStyles = _customBPs.split(";"); - for (int i = 0; i < baseStyles.length; i++) { - String thisStyle = baseStyles[i]; - String[] data = thisStyle.split(":"); - try { - if (data.length == 2) { - String indices = data[0]; - String style = data[1]; - String[] data2 = indices.split(","); - if (data2.length == 2) { - String s1 = data2[0]; - String s2 = data2[1]; - if (s1.startsWith("(") && s2.endsWith(")")) { - int a = Integer.parseInt(s1.substring(1)); - int b = Integer.parseInt(s2.substring(0, - s2.length() - 1)); - ModeleBP msbp = vp.getRNA().getBPStyle(a, b); - if (msbp != null) { - msbp.assignParameters(style); - } - } - } - } - } catch (Exception e) { - System.err.println("ApplyBPsCustomStyle: " + e.toString()); - } - } - } - - private void applyChemProbs(VARNAPanel vp) { - String[] chemProbs = _chemProbs.split(";"); - for (int i = 0; i < chemProbs.length; i++) { - String thisAnn = chemProbs[i]; - String[] data = thisAnn.split(":"); - try { - if (data.length == 2) { - String indices = data[0]; - String style = data[1]; - String[] data2 = indices.split("-"); - if (data2.length == 2) { - int a = Integer.parseInt(data2[0]); - int b = Integer.parseInt(data2[1]); - int c = vp.getRNA().getIndexFromBaseNumber(a); - int d = vp.getRNA().getIndexFromBaseNumber(b); - ArrayList mbl = vp.getRNA() - .get_listeBases(); - ChemProbAnnotation cpa = new ChemProbAnnotation( - mbl.get(c), mbl.get(d), style); - vp.getRNA().addChemProbAnnotation(cpa); - } - } - } catch (Exception e) { - System.err.println("ChempProbs: " + e.toString()); - } - } - } - - private void applyAuxBPs(VARNAPanel vp) { - String[] baseStyles = _auxBPs.split(";"); - - for (int i = 0; i < baseStyles.length; i++) { - String thisStyle = baseStyles[i]; - String[] data = thisStyle.split(":"); - try { - if (data.length >= 1) { - String indices = data[0]; - String[] data2 = indices.split(","); - if (data2.length == 2) { - String s1 = data2[0]; - String s2 = data2[1]; - if (s1.startsWith("(") && s2.endsWith(")")) { - int a = Integer.parseInt(s1.substring(1)); - int b = Integer.parseInt(s2.substring(0, - s2.length() - 1)); - int c = vp.getRNA().getIndexFromBaseNumber(a); - int d = vp.getRNA().getIndexFromBaseNumber(b); - - ModeleBP msbp = new ModeleBP(vp.getRNA() - .get_listeBases().get(c), vp.getRNA() - .get_listeBases().get(d)); - if (data.length >= 2) { - String style = data[1]; - msbp.assignParameters(style); - } - vp.getRNA() - .addBPToStructureUsingNumbers(a, b, msbp); - } - } - } - } catch (ExceptionModeleStyleBaseSyntaxError e1) { - System.err.println("AuxApplyBPs: " + e1.toString()); - } catch (ExceptionParameterError e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - private void applyFlips(VARNAPanel vp) { - String[] flips = _flip.split(";"); - for (String s: flips) - { - if (!s.isEmpty()) - { - try{ - String[] data = s.split("-"); - int number = -1; - if (data.length==1) - { - number = Integer.parseInt(data[0]); - } - else if (data.length==2) - { - number = Integer.parseInt(data[1]); - } - if (number!=-1) - { - int i = vp.getRNA().getIndexFromBaseNumber(number); - Point h = vp.getRNA().getExteriorHelix(i); - vp.getRNA().flipHelix(h); - } - } catch (Exception e) { - System.err.println("Flip Helices: " + e.toString()); - } - } - } - } - - /** - * Format: - * string:[type=[H|B|L|P]|x=double|y=double|anchor=int|size=int|color - * =Color]; - * - * @param vp - */ - private void applyAnnotations(VARNAPanel vp) { - String[] annotations = _annotations.split(";"); - for (int i = 0; i < annotations.length; i++) { - String thisAnn = annotations[i]; - TextAnnotation ann = TextAnnotation.parse(thisAnn, vp); - vp.addAnnotation(ann); - } - } - - -} - - diff --git a/src2/fr/orsay/lri/varna/models/VARNAEdits.java b/src2/fr/orsay/lri/varna/models/VARNAEdits.java deleted file mode 100644 index bf6823a..0000000 --- a/src2/fr/orsay/lri/varna/models/VARNAEdits.java +++ /dev/null @@ -1,403 +0,0 @@ -package fr.orsay.lri.varna.models; - -import java.awt.Point; -import java.awt.geom.Point2D; -import java.util.ArrayList; - -import javax.swing.undo.AbstractUndoableEdit; -import javax.swing.undo.CannotRedoException; -import javax.swing.undo.CannotUndoException; -import javax.swing.undo.UndoableEdit; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.applications.templateEditor.GraphicalTemplateElement; -import fr.orsay.lri.varna.applications.templateEditor.TemplatePanel; -import fr.orsay.lri.varna.applications.templateEditor.TemplateEdits.ElementEdgeMoveTemplateEdit; -import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VARNAEdits { - public static final double MAX_DISTANCE= 55.0; - public static class BasesShiftEdit extends AbstractUndoableEdit - { - private ArrayList _indices; - private double _dx; - private double _dy; - private VARNAPanel _vp; - public BasesShiftEdit(ArrayList indices, double dx, double dy, VARNAPanel p) - { - _indices = indices; - _dx = dx; - _dy = dy; - _vp = p; - } - public void undo() throws CannotUndoException { - for (int index: _indices) - { - ModeleBase mb = _vp.getRNA().getBaseAt(index); - _vp.getRNA().setCoord(index,new Point2D.Double(mb.getCoords().x-_dx,mb.getCoords().y-_dy)); - _vp.getRNA().setCenter(index,new Point2D.Double(mb.getCenter().x-_dx,mb.getCenter().y-_dy)); - } - _vp.repaint(); - } - public void redo() throws CannotRedoException { - for (int index: _indices) - { - ModeleBase mb = _vp.getRNA().getBaseAt(index); - _vp.getRNA().setCoord(index,new Point2D.Double(mb.getCoords().x+_dx,mb.getCoords().y+_dy)); - _vp.getRNA().setCenter(index,new Point2D.Double(mb.getCenter().x-_dx,mb.getCenter().y-_dy)); - } - _vp.repaint(); - } - public boolean canUndo() { return true; } - public boolean canRedo() { return true; } - public String getPresentationName() { return "Base #"+_indices+" shifted"; } - public boolean addEdit(UndoableEdit anEdit) - { - if (anEdit instanceof BasesShiftEdit) - { - BasesShiftEdit e = (BasesShiftEdit) anEdit; - if (e._indices.equals(_indices)) - { - Point2D.Double tot = new Point2D.Double(_dx+e._dx,_dy+e._dy); - if (tot.distance(0.0, 0.0)Math.PI) - { totAngle -= 2.0*Math.PI; } - if (Math.abs(totAngle).7 || cumFact<1.3) - { - _factor *= e._factor; - return true; - } - } - return false; - } - }; - - public static class RotateRNAEdit extends AbstractUndoableEdit - { - private double _angle; - private VARNAPanel _vp; - public RotateRNAEdit( double angle, VARNAPanel vp) - { - _angle = angle; - _vp = vp; - } - public void undo() throws CannotUndoException { - _vp.getRNA().globalRotation(-_angle); - _vp.repaint(); - } - public void redo() throws CannotRedoException { - _vp.getRNA().globalRotation(_angle); - _vp.repaint(); - } - public boolean canUndo() { return true; } - public boolean canRedo() { return true; } - public String getPresentationName() { return "Rotate RNA angle:"+_angle+"";} - public boolean addEdit(UndoableEdit anEdit) - { - if (anEdit instanceof RotateRNAEdit) - { - RotateRNAEdit e = (RotateRNAEdit) anEdit; - if (Math.abs(_angle+e._angle)<30) - { - _angle += e._angle; - return true; - } - } - return false; - } - }; - - public static class RedrawEdit extends AbstractUndoableEdit - { - private int _prevMode; - private int _newMode; - private boolean _prevFlat; - private boolean _newFlat; - private ArrayList _backupCoords = new ArrayList(); - private ArrayList _backupCenters = new ArrayList(); - private VARNAPanel _vp; - - - public RedrawEdit(VARNAPanel vp,boolean newFlat) - { - this(vp.getRNA().getDrawMode(),vp,newFlat); - } - - public RedrawEdit(int newMode, VARNAPanel vp) - { - this(newMode,vp,vp.getFlatExteriorLoop()); - } - - public RedrawEdit(int newMode, VARNAPanel vp, boolean newFlat) - { - _vp = vp; - _newMode = newMode; - _newFlat = newFlat; - _prevFlat = _vp.getFlatExteriorLoop(); - for (ModeleBase mb: _vp.getRNA().get_listeBases()) - { - _backupCoords.add(new Point2D.Double(mb.getCoords().x,mb.getCoords().y)); - _backupCenters.add(new Point2D.Double(mb.getCenter().x,mb.getCenter().y)); - } - _prevMode = _vp.getDrawMode(); - } - public void undo() throws CannotUndoException { - RNA r = _vp.getRNA(); - _vp.setFlatExteriorLoop(_prevFlat); - r.setDrawMode(_prevMode); - for (int index =0;index<_vp.getRNA().get_listeBases().size();index++) - { - Point2D.Double oldCoord = _backupCoords.get(index); - Point2D.Double oldCenter = _backupCenters.get(index); - r.setCoord(index, oldCoord); - r.setCenter(index, oldCenter); - } - _vp.repaint(); - } - public void redo() throws CannotRedoException { - try { - _vp.setFlatExteriorLoop(_newFlat); - _vp.getRNA().drawRNA(_newMode,_vp.getConfig()); - } catch (ExceptionNAViewAlgorithm e) { - e.printStackTrace(); - } - _vp.repaint(); - } - public boolean canUndo() { return true; } - public boolean canRedo() { return true; } - public String getPresentationName() { return "Redraw whole RNA";} - public boolean addEdit(UndoableEdit anEdit) - { - return false; - } - }; - -} diff --git a/src2/fr/orsay/lri/varna/models/annotations/ChemProbAnnotation.java b/src2/fr/orsay/lri/varna/models/annotations/ChemProbAnnotation.java deleted file mode 100644 index 83c2158..0000000 --- a/src2/fr/orsay/lri/varna/models/annotations/ChemProbAnnotation.java +++ /dev/null @@ -1,260 +0,0 @@ -package fr.orsay.lri.varna.models.annotations; - -import java.awt.Color; -import java.awt.geom.Point2D; -import java.io.Serializable; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.utils.XMLUtils; - - -public class ChemProbAnnotation implements Serializable { - - public static final String HEADER_TEXT = "ChemProbAnnotation"; - - /** - * - */ - private static final long serialVersionUID = 5833315460145031242L; - - - public enum ChemProbAnnotationType - { - TRIANGLE, - ARROW, - PIN, - DOT; - }; - - public static double DEFAULT_INTENSITY = 1.0; - public static ChemProbAnnotationType DEFAULT_TYPE = ChemProbAnnotationType.ARROW; - public static Color DEFAULT_COLOR = Color.blue.darker(); - - private ModeleBase _mbfst; - private ModeleBase _mbsnd; - private Color _color; - private double _intensity; - private ChemProbAnnotationType _type; - private boolean _outward; - - public static String XML_ELEMENT_NAME = "ChemProbAnnotation"; - public static String XML_VAR_INDEX5_NAME = "Index5"; - public static String XML_VAR_INDEX3_NAME = "Index3"; - public static String XML_VAR_COLOR_NAME = "Color"; - public static String XML_VAR_INTENSITY_NAME = "Intensity"; - public static String XML_VAR_TYPE_NAME = "Type"; - public static String XML_VAR_OUTWARD_NAME = "Outward"; - - public void toXML(TransformerHandler hd) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("","",XML_VAR_INDEX5_NAME,"CDATA",""+_mbfst.getIndex()); - atts.addAttribute("","",XML_VAR_INDEX3_NAME,"CDATA",""+_mbsnd.getIndex()); - atts.addAttribute("","",XML_VAR_COLOR_NAME,"CDATA",XMLUtils.toHTMLNotation(_color)); - atts.addAttribute("","",XML_VAR_INTENSITY_NAME,"CDATA",""+_intensity); - atts.addAttribute("","",XML_VAR_TYPE_NAME,"CDATA",""+_type); - atts.addAttribute("","",XML_VAR_OUTWARD_NAME,"CDATA",""+_outward); - hd.startElement("","",XML_ELEMENT_NAME,atts); - hd.endElement("","",XML_ELEMENT_NAME); - } - - - public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, String styleDesc) { - this(mbfst,mbsnd); - applyStyle(styleDesc); - } - - public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd) { - this(mbfst,mbsnd,ChemProbAnnotation.DEFAULT_TYPE,ChemProbAnnotation.DEFAULT_INTENSITY); - } - - public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, double intensity) { - this(mbfst,mbsnd,ChemProbAnnotation.DEFAULT_TYPE,intensity); - } - - public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, ChemProbAnnotationType type) { - this(mbfst,mbsnd,type,ChemProbAnnotation.DEFAULT_INTENSITY); - } - - public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, ChemProbAnnotationType type, double intensity) { - this(mbfst,mbsnd, type, intensity, DEFAULT_COLOR, true); - } - - public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, ChemProbAnnotationType type, double intensity, Color color, boolean out) { - if (mbfst.getIndex()>mbsnd.getIndex()) - { - ModeleBase tmp = mbsnd; - mbsnd = mbfst; - mbfst = tmp; - } - _mbfst = mbfst; - _mbsnd = mbsnd; - _type = type; - _intensity = intensity; - _color = color; - _outward = out; - } - - public boolean isOut() - { - return _outward; - } - - public void setOut(boolean b) - { - _outward = b; - } - - public Color getColor() - { - return _color; - } - - public double getIntensity() - { - return _intensity; - } - - public ChemProbAnnotationType getType() - { - return _type; - } - - public void setColor(Color c){ - _color = c; - } - - public void setIntensity(double d){ - _intensity = d; - } - - public Point2D.Double getAnchorPosition() - { - Point2D.Double result = new Point2D.Double( - (_mbfst.getCoords().x+_mbsnd.getCoords().x)/2.0, - (_mbfst.getCoords().y+_mbsnd.getCoords().y)/2.0); - return result; - } - - public Point2D.Double getDirVector() - { - Point2D.Double norm = getNormalVector(); - Point2D.Double result = new Point2D.Double(-norm.y,norm.x); - Point2D.Double anchor = getAnchorPosition(); - Point2D.Double center = new Point2D.Double( - (_mbfst.getCenter().x+_mbsnd.getCenter().x)/2.0, - (_mbfst.getCenter().y+_mbsnd.getCenter().y)/2.0); - Point2D.Double vradius = new Point2D.Double( - (center.x-anchor.x)/2.0, - (center.y-anchor.y)/2.0); - if (_outward) - { - if (result.x*vradius.x+result.y*vradius.y>0) - { - return new Point2D.Double(-result.x,-result.y); - } - } - else - { - if (result.x*vradius.x+result.y*vradius.y<0) - { - return new Point2D.Double(-result.x,-result.y); - } - } - return result; - } - public Point2D.Double getNormalVector() - { - Point2D.Double tmp; - if (_mbfst==_mbsnd) - { - tmp = new Point2D.Double( - (-(_mbsnd.getCenter().y-_mbsnd.getCoords().y)), - ((_mbsnd.getCenter().x-_mbsnd.getCoords().x))); - } - else - { - tmp = new Point2D.Double( - (_mbsnd.getCoords().x-_mbfst.getCoords().x)/2.0, - (_mbsnd.getCoords().y-_mbfst.getCoords().y)/2.0); - } - - double norm = tmp.distance(0, 0); - Point2D.Double result = new Point2D.Double(tmp.x/norm,tmp.y/norm); - return result; - } - - public static ChemProbAnnotationType annotTypeFromString(String value) - { - if (value.toLowerCase().equals("arrow")) - {return ChemProbAnnotationType.ARROW;} - else if (value.toLowerCase().equals("triangle")) - {return ChemProbAnnotationType.TRIANGLE;} - else if (value.toLowerCase().equals("pin")) - {return ChemProbAnnotationType.PIN;} - else if (value.toLowerCase().equals("dot")) - {return ChemProbAnnotationType.DOT;} - else - {return ChemProbAnnotationType.ARROW;} - } - - - public void applyStyle(String styleDesc) - { - String[] chemProbs = styleDesc.split(","); - for (int i = 0; i < chemProbs.length; i++) { - String thisStyle = chemProbs[i]; - String[] data = thisStyle.split("="); - if (data.length==2) - { - String name = data[0]; - String value = data[1]; - if (name.toLowerCase().equals("color")) - { - Color c = Color.decode(value); - if (c==null) - { c = _color; } - setColor(c); - } - else if (name.toLowerCase().equals("intensity")) - { - _intensity = Double.parseDouble(value); - } - else if (name.toLowerCase().equals("dir")) - { - _outward = value.toLowerCase().equals("out"); - } - else if (name.toLowerCase().equals("glyph")) - { - _type= annotTypeFromString(value); - } - } - } - } - - public void setType(ChemProbAnnotationType s) - { - _type = s; - } - - public ChemProbAnnotation clone() - { - ChemProbAnnotation result = new ChemProbAnnotation(this._mbfst,this._mbsnd); - result._intensity = _intensity; - result._type = _type; - result._color= _color; - result._outward = _outward; - return result; - } - - public String toString() - { - return "Chem. prob. "+this._type+" Base#"+this._mbfst.getBaseNumber()+"-"+this._mbsnd.getBaseNumber(); - } - -} diff --git a/src2/fr/orsay/lri/varna/models/annotations/HighlightRegionAnnotation.java b/src2/fr/orsay/lri/varna/models/annotations/HighlightRegionAnnotation.java deleted file mode 100644 index 1e671bd..0000000 --- a/src2/fr/orsay/lri/varna/models/annotations/HighlightRegionAnnotation.java +++ /dev/null @@ -1,376 +0,0 @@ -package fr.orsay.lri.varna.models.annotations; - -import java.awt.Color; -import java.awt.Shape; -import java.awt.geom.GeneralPath; -import java.awt.geom.Point2D; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedList; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurClicMovement; -import fr.orsay.lri.varna.models.VARNAConfigLoader; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.RNA; -import fr.orsay.lri.varna.models.rna.VARNAPoint; -import fr.orsay.lri.varna.utils.XMLUtils; -import fr.orsay.lri.varna.views.VueHighlightRegionEdit; -import fr.orsay.lri.varna.views.VueUI; - -public class HighlightRegionAnnotation implements Serializable { - - public static final String HEADER_TEXT = "HighlightRegionAnnotation"; - - private static final long serialVersionUID = 7087014168028684775L; - public static final Color DEFAULT_OUTLINE_COLOR = Color.decode("#6ed86e"); - public static final Color DEFAULT_FILL_COLOR = Color.decode("#bcffdd"); - public static final double DEFAULT_RADIUS = 16.0; - - private Color _outlineColor = DEFAULT_OUTLINE_COLOR; - private Color _fillColor = DEFAULT_FILL_COLOR; - private double _radius = DEFAULT_RADIUS; - private ArrayList _bases; - - public static String XML_ELEMENT_NAME = "region"; - public static String XML_VAR_OUTLINE_NAME = "outline"; - public static String XML_VAR_FILL_NAME = "fill"; - public static String XML_VAR_RADIUS_NAME = "radius"; - - public void toXML(TransformerHandler hd) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("","",XML_VAR_OUTLINE_NAME,"CDATA",""+XMLUtils.toHTMLNotation(_outlineColor)); - atts.addAttribute("","",XML_VAR_FILL_NAME,"CDATA",""+XMLUtils.toHTMLNotation(_fillColor)); - atts.addAttribute("","",XML_VAR_RADIUS_NAME,"CDATA",""+_radius); - hd.startElement("","",XML_ELEMENT_NAME,atts); - XMLUtils.toXML(hd, _bases); - hd.endElement("","",XML_ELEMENT_NAME); - } - - public HighlightRegionAnnotation(RNA r, int startIndex, int stopIndex) - { - this(r.getBasesBetween(startIndex, stopIndex)); - } - - public HighlightRegionAnnotation() - { - this(new ArrayList()); - } - - public HighlightRegionAnnotation(ArrayList b) - { - this(b,DEFAULT_FILL_COLOR,DEFAULT_OUTLINE_COLOR,DEFAULT_RADIUS); - } - - - public HighlightRegionAnnotation(ArrayList b,Color fill, Color outline, double radius) - { - _bases = b; - _fillColor = fill; - _outlineColor = outline; - _radius = radius; - } - - public HighlightRegionAnnotation clone() - { - return new HighlightRegionAnnotation(_bases,_fillColor,_outlineColor,_radius); - } - - public int getMinIndex() - { - int min = Integer.MAX_VALUE; - for (ModeleBase mb : _bases) - { - min = Math.min(min, mb.getIndex()); - } - return min; - } - - public int getMaxIndex() - { - int max = Integer.MIN_VALUE; - for (ModeleBase mb : _bases) - { - max = Math.max(max, mb.getIndex()); - } - return max; - } - - - public void setOutlineColor(Color c) - { - _outlineColor = c; - } - - public ArrayList getBases() - { - return _bases; - } - - public void setBases(ArrayList b) - { - _bases = b; - } - - public void setFillColor(Color c) - { - _fillColor = c; - } - - public Color getFillColor() - { - return _fillColor; - } - - public Color getOutlineColor() - { - return _outlineColor; - } - - public double getRadius() - { - return _radius; - } - - public void setRadius(double v) - { - _radius = v; - } - - public static final int NUM_STEPS_ROUNDED_CORNERS = 16; - - private Point2D.Double symImage(Point2D.Double p, Point2D.Double center) - { - return new Point2D.Double(2.*center.x-p.x, 2.*center.y-p.y); - } - - private LinkedList buildRoundedCorner(Point2D.Double p1, Point2D.Double p2, Point2D.Double anotherPoint) - { - LinkedList result = new LinkedList(); - Point2D.Double m = new Point2D.Double((p1.x+p2.x)/2.0,(p1.y+p2.y)/2.0); - double rad = p1.distance(p2)/2.; - double angle = Math.atan2(p1.y-m.y, p1.x-m.x); - - double incr = Math.PI/((double)NUM_STEPS_ROUNDED_CORNERS+1); - - Point2D.Double pdir = new Point2D.Double(m.x+rad*Math.cos(angle+Math.PI/2.),m.y+rad*Math.sin(angle+Math.PI/2.)); - if (pdir.distance(anotherPoint) pointList = new LinkedList(); - for (int i = 0;i0) - { - Point2D.Double prev1 = pointList.getLast(); - Point2D.Double prev2 = pointList.getFirst(); - - if ((interForward.distance(prev1)+interBackward.distance(prev2))<(interForward.distance(prev2)+interBackward.distance(prev1))) - { - pointList.addLast(interForward); - pointList.addFirst(interBackward); - } - else - { - pointList.addFirst(interForward); - pointList.addLast(interBackward); - } - } - else - { - pointList.addLast(interForward); - pointList.addFirst(interBackward); - } - } - } - if (getBases().size()==1) - { - int midl = pointList.size()/2; - Point2D.Double mid = pointList.get(midl); - Point2D.Double apoint = new Point2D.Double(mid.x+1.,mid.y); - LinkedList pointListStart = buildRoundedCorner(pointList.get(midl-1), pointList.get(midl), apoint); - pointList.addAll(midl, pointListStart); - mid = pointList.get(midl); - apoint = new Point2D.Double(mid.x+1.,mid.y); - LinkedList pointListEnd = buildRoundedCorner(pointList.get(pointList.size()-1),pointList.get(0), apoint); - pointList.addAll(0,pointListEnd); - } - else if (getBases().size()>1) - { - int midl = pointList.size()/2; - Point2D.Double apoint = symImage(pointList.get(midl),pointList.get(midl-1)); - LinkedList pointListStart = buildRoundedCorner(pointList.get(midl-1), pointList.get(midl), apoint); - pointList.addAll(midl, pointListStart); - apoint = symImage(realCoords[getBases().get(getBases().size()-1).getIndex()], - realCoords[getBases().get(getBases().size()-2).getIndex()]); - LinkedList pointListEnd = buildRoundedCorner(pointList.get(pointList.size()-1),pointList.get(0), apoint); - pointList.addAll(0,pointListEnd); - } - - - if (pointList.size()>0) - { - Point2D.Double point = pointList.get(0); - p.moveTo((float)point.x, (float)point.y); - - for (int i=1;i bases = vp.getRNA().getBasesBetween(i, j); - if (parts.length>1) - { - try - { - String[] options = parts[1].split(","); - for (int k = 0; k < options.length; k++) - { - //System.out.println(options[k]); - try - { - String[] data = options[k].split("="); - String lhs = data[0].toLowerCase(); - String rhs = data[1]; - if (lhs.equals("fill")) - { - fill = VARNAConfigLoader.getSafeColor(rhs, fill); - } - else if (lhs.equals("outline")) - { - outline = VARNAConfigLoader.getSafeColor(rhs, outline); - } - else if (lhs.equals("radius")) - { - radius = Double.parseDouble(rhs); - } - } - catch(Exception e) - { - } - } - } - catch(Exception e) - { - e.printStackTrace(); - } - } - return new HighlightRegionAnnotation(bases,fill,outline,radius); - } - catch(Exception e) - { - e.printStackTrace(); - } - return null; - } - - public String toString() - { - //String result = "HighlightRegionAnnotation["; - //result += "fill:"+_fillColor.toString(); - //result += ",outline:"+_outlineColor.toString(); - //result += ",radius:"+_radius; - //return result+"]"; - String result = "Highlighted region "+getMinIndex()+"-"+getMaxIndex(); - return result; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/annotations/TextAnnotation.java b/src2/fr/orsay/lri/varna/models/annotations/TextAnnotation.java deleted file mode 100644 index 0db63a5..0000000 --- a/src2/fr/orsay/lri/varna/models/annotations/TextAnnotation.java +++ /dev/null @@ -1,537 +0,0 @@ -/* - 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.models.annotations; - -import java.awt.Color; -import java.awt.Font; -import java.awt.geom.Point2D; -import java.io.Serializable; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Collections; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.VARNAConfigLoader; -import fr.orsay.lri.varna.models.rna.ModelBaseStyle; -import fr.orsay.lri.varna.models.rna.VARNAPoint; -import fr.orsay.lri.varna.utils.XMLUtils; - - - -/** - * The annotated text model - * - * @author Darty@lri.fr - * - */ -public class TextAnnotation implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 465236085501860747L; - - public enum AnchorType{ - POSITION, - BASE, - HELIX, - LOOP - }; - - - public static final String HEADER_TEXT = "TextAnnotation"; - - /** - * default text color - */ - public static final Color DEFAULTCOLOR = Color.black; - /** - * default text font - */ - public static final Font DEFAULTFONT = new Font("Arial", Font.PLAIN, 12); - - private String _text; - private AnchorType _typeAnchor; - private Color _color; - private double _angle; - private Object _anchor; - private Font _font; - - public static String XML_ELEMENT_NAME = "textAnnotation"; - public static String XML_VAR_TYPE_NAME = "type"; - public static String XML_VAR_COLOR_NAME = "color"; - public static String XML_VAR_ANGLE_NAME = "angle"; - public static String XML_VAR_TEXT_NAME = "text"; - - public void toXML(TransformerHandler hd) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("","",XML_VAR_TYPE_NAME,"CDATA",""+_typeAnchor); - atts.addAttribute("","",XML_VAR_COLOR_NAME,"CDATA",""+XMLUtils.toHTMLNotation(_color)); - atts.addAttribute("","",XML_VAR_ANGLE_NAME,"CDATA",""+_angle); - hd.startElement("","",XML_ELEMENT_NAME,atts); - atts.clear(); - hd.startElement("","",XML_VAR_TEXT_NAME,atts); - XMLUtils.exportCDATAString(hd, _text); - hd.endElement("","",XML_VAR_TEXT_NAME); - switch (_typeAnchor) - { - case POSITION: - ((VARNAPoint)_anchor).toXML(hd,"pos"); - break; - case BASE: - XMLUtils.toXML(hd, (ModeleBase)_anchor); - break; - case HELIX: - XMLUtils.toXML(hd, (ArrayList)_anchor); - break; - case LOOP: - XMLUtils.toXML(hd, (ArrayList)_anchor); - break; - } - XMLUtils.toXML(hd, _font); - hd.endElement("","",XML_ELEMENT_NAME); - } - - /** - * creates an annoted text on a VARNAPanel with the specified text - * - * @param texte Textual content of the annotation - */ - public TextAnnotation(String texte) { - _text = texte; - _color = DEFAULTCOLOR; - _font = DEFAULTFONT; - _angle = 0; - } - - /** - * /** creates an annoted text on a VARNAPanel with the specified text and - * is static position - * - * @param texte - * @param x - * @param y - */ - public TextAnnotation(String texte, double x, double y) { - this(texte); - _anchor = new VARNAPoint(x, y); - _typeAnchor = AnchorType.POSITION; - } - - /** - * creates an annoted text on a VARNAPanel with the specified text fixed to - * a base - * - * @param texte - * @param mb - */ - public TextAnnotation(String texte, ModeleBase mb) { - this(texte); - _anchor = mb; - _typeAnchor = AnchorType.BASE; - } - - /** - * creates an annoted text on a VARNAPanel with the specified text fixed to - * a helix (if type is HELIX) or to a loop (if type is LOOP) - * - * @param texte - * @param listeBase - * @param type - * @throws Exception - */ - public TextAnnotation(String texte, ArrayList listeBase, - AnchorType type) throws Exception { - this(texte); - _anchor = listeBase; - - if (type == AnchorType.HELIX) - _typeAnchor = AnchorType.HELIX; - else if (type == AnchorType.LOOP) - _typeAnchor = AnchorType.LOOP; - else - throw new Exception("Bad argument"); - } - - /** - * creates an annoted text from another one - * - * @param textAnnotation - */ - public TextAnnotation(TextAnnotation textAnnotation) { - _anchor = textAnnotation.getAncrage(); - _font = textAnnotation.getFont(); - _text = textAnnotation.getTexte(); - _typeAnchor = textAnnotation.getType(); - } - - /** - * - * @return the text - */ - public String getTexte() { - return _text; - } - - public void setText(String _texte) { - this._text = _texte; - } - - /** - * - * @return the font - */ - public Font getFont() { - return _font; - } - - public void setFont(Font _font) { - this._font = _font; - } - - public Object getAncrage() { - return _anchor; - } - - public void setAncrage(ModeleBase mb) { - _anchor = mb; - _typeAnchor = AnchorType.BASE; - } - - public void setAncrage(double x, double y) { - _anchor = new VARNAPoint(x, y); - _typeAnchor = AnchorType.POSITION; - } - - public void setAncrage(ArrayList list, AnchorType type) - throws Exception { - _anchor = list; - if (type == AnchorType.HELIX) - _typeAnchor = AnchorType.HELIX; - else if (type == AnchorType.LOOP) - _typeAnchor = AnchorType.LOOP; - else - throw new Exception("Bad argument"); - } - - public AnchorType getType() { - return _typeAnchor; - } - - public void setType(AnchorType t) { - _typeAnchor = t; - } - - - public Color getColor() { - return _color; - } - - public void setColor(Color color) { - this._color = color; - } - - - public String getHelixDescription() - { - ArrayList listeBase = ((ArrayList)_anchor); - int minA = Integer.MAX_VALUE,maxA = Integer.MIN_VALUE; - int minB = Integer.MAX_VALUE,maxB = Integer.MIN_VALUE; - for(ModeleBase mb : listeBase) - { - int i = mb.getBaseNumber(); - if (mb.getElementStructure()>i) - { - minA = Math.min(minA, i); - maxA = Math.max(maxA, i); - } - else - { - minB = Math.min(minB, i); - maxB = Math.max(maxB, i); - } - } - return "["+minA+","+maxA+"] ["+minB+","+maxB+"]"; - } - - public String getLoopDescription() - { - ArrayList listeBase = ((ArrayList)_anchor); - int min = Integer.MAX_VALUE,max = Integer.MIN_VALUE; - for(ModeleBase mb : listeBase) - { - int i = mb.getBaseNumber(); - min = Math.min(min, i); - max = Math.max(max, i); - } - return "["+min+","+max+"]"; - } - - public String toString() { - String tmp = "["+_text+"] "; - switch (_typeAnchor) { - case POSITION: - NumberFormat formatter = new DecimalFormat(".00"); - return tmp+" at ("+formatter.format(getCenterPosition().x)+","+formatter.format(getCenterPosition().y)+")"; - case BASE: - return tmp+" on base "+((ModeleBase) _anchor).getBaseNumber(); - case HELIX: - return tmp+" on helix "+getHelixDescription(); - case LOOP: - return tmp+" on loop "+getLoopDescription(); - default: - return tmp; - } - } - - /** - * - * @return the text position center - */ - public Point2D.Double getCenterPosition() { - switch (_typeAnchor) { - case POSITION: - return ((VARNAPoint) _anchor).toPoint2D(); - case BASE: - return ((ModeleBase) _anchor).getCoords(); - case HELIX: - return calculLoopHelix(); - case LOOP: - return calculLoop(); - default: - return new Point2D.Double(0., 0.); - } - } - - private Point2D.Double calculLoop() { - ArrayList liste = extractedArrayListModeleBaseFromAncrage(); - double totalX = 0., totalY = 0.; - for (ModeleBase base : liste) { - totalX += base.getCoords().x; - totalY += base.getCoords().y; - } - return new Point2D.Double(totalX / liste.size(), totalY / liste.size()); - } - - private Point2D.Double calculLoopHelix() { - ArrayList liste = extractedArrayListModeleBaseFromAncrage(); - Collections.sort(liste); - double totalX = 0., totalY = 0.; - double num=0.0; - for (int i=0;i0 && (i extractedArrayListModeleBaseFromAncrage() { - return (ArrayList) _anchor; - } - - /** - * clone a TextAnnotation - */ - public TextAnnotation clone() { - TextAnnotation textAnnot = null; - try { - switch (_typeAnchor) { - case BASE: - textAnnot = new TextAnnotation(_text, (ModeleBase) _anchor); - break; - case POSITION: - textAnnot = new TextAnnotation(_text, - ((VARNAPoint) _anchor).x, - ((VARNAPoint) _anchor).y); - break; - case LOOP: - textAnnot = new TextAnnotation(_text, - extractedArrayListModeleBaseFromAncrage(), AnchorType.LOOP); - break; - case HELIX: - textAnnot = new TextAnnotation(_text, - extractedArrayListModeleBaseFromAncrage(), AnchorType.HELIX); - break; - default: - break; - } - } catch (Exception e) { - e.printStackTrace(); - } - textAnnot.setFont(_font); - textAnnot.setColor(_color); - return textAnnot; - - } - - /** - * copy a textAnnotation - * - * @param textAnnotation - */ - public void copy(TextAnnotation textAnnotation) { - _anchor = textAnnotation.getAncrage(); - _font = textAnnotation.getFont(); - _text = textAnnotation.getTexte(); - _typeAnchor = textAnnotation.getType(); - _color = textAnnotation.getColor(); - _angle = textAnnotation.getAngleInDegres(); - } - - - /** - * - * @return the angle in degrees - */ - public double getAngleInDegres() { - // if (_typeAncrage == TextAnnotation.HELIX) - // _angle = calculAngleDegres(); - return _angle; - } - - /** - * - * @return the angle in radians - */ - public double getAngleInRadians() { - return (getAngleInDegres() * Math.PI) / 180.; - } - - public void setAngleInDegres(double _angle) { - this._angle = _angle; - } - - public void setAngleInRadians(double _angle) { - this._angle = _angle * 180 / Math.PI; - } - - - public static TextAnnotation parse(String thisAnn, VARNAPanel vp) - { - String[] data = thisAnn.split(":"); - - String text = ""; - int anchor = -1; - int x = -1; - int y = -1; - TextAnnotation.AnchorType type = TextAnnotation.AnchorType.LOOP; - Font font = TextAnnotation.DEFAULTFONT; - Color color = TextAnnotation.DEFAULTCOLOR; - TextAnnotation ann = null; - try { - if (data.length == 2) { - text = data[0]; - String[] data2 = data[1].split(","); - for (int j = 0; j < data2.length; j++) { - String opt = data2[j]; - String[] data3 = opt.split("="); - if (data3.length == 2) { - String name = data3[0].toLowerCase(); - String value = data3[1]; - if (name.equals("type")) { - if (value.toUpperCase().equals("H")) { - type = TextAnnotation.AnchorType.HELIX; - } else if (value.toUpperCase().equals("L")) { - type = TextAnnotation.AnchorType.LOOP; - } else if (value.toUpperCase().equals("P")) { - type = TextAnnotation.AnchorType.POSITION; - } else if (value.toUpperCase().equals("B")) { - type = TextAnnotation.AnchorType.BASE; - } - } else if (name.equals("x")) { - x = Integer.parseInt(value); - } else if (name.equals("y")) { - y = Integer.parseInt(value); - } else if (name.equals("anchor")) { - anchor = Integer.parseInt(value); - } else if (name.equals("size")) { - font = font.deriveFont((float) Integer - .parseInt(value)); - } else if (name.equals("color")) { - color = VARNAConfigLoader.getSafeColor(value, color); - } - } - } - switch (type) { - case POSITION: - if ((x != -1) && (y != -1)) { - Point2D.Double p = vp - .panelToLogicPoint(new Point2D.Double(x, y)); - ann = new TextAnnotation(text, p.x, p.y); - } - break; - case BASE: - if (anchor != -1) { - int index = vp.getRNA().getIndexFromBaseNumber( - anchor); - ModeleBase mb = vp.getRNA().get_listeBases() - .get(index); - ann = new TextAnnotation(text, mb); - } - break; - case HELIX: - if (anchor != -1) { - ArrayList mbl = new ArrayList(); - int index = vp.getRNA().getIndexFromBaseNumber( - anchor); - ArrayList il = vp.getRNA() - .findHelix(index); - for (int k : il) { - mbl.add(vp.getRNA().get_listeBases().get(k)); - } - ann = new TextAnnotation(text, mbl, type); - } - break; - case LOOP: - if (anchor != -1) { - ArrayList mbl = new ArrayList(); - int index = vp.getRNA().getIndexFromBaseNumber( - anchor); - ArrayList il = vp.getRNA().findLoop(index); - for (int k : il) { - mbl.add(vp.getRNA().get_listeBases().get(k)); - } - ann = new TextAnnotation(text, mbl, type); - } - break; - } - if (ann != null) { - ann.setColor(color); - ann.setFont(font); - } - } - } catch (Exception e) { - System.err.println("Apply Annotations: " + e.toString()); - } - return ann; - } -} diff --git a/src2/fr/orsay/lri/varna/models/export/ArcCommand.java b/src2/fr/orsay/lri/varna/models/export/ArcCommand.java deleted file mode 100644 index aeb1466..0000000 --- a/src2/fr/orsay/lri/varna/models/export/ArcCommand.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - 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.models.export; - -import java.awt.geom.Point2D; - -public class ArcCommand extends GraphicElement { - - private Point2D.Double center; - private double width, height; - private double startAngle, endAngle; - - public ArcCommand(Point2D.Double origine, double width, double height, - double startAngle, double endAngle) { - this.center = origine; - this.width = width; - this.height = height; - this.startAngle = startAngle; - this.endAngle = endAngle; - } - - public Point2D.Double getCenter() { - return center; - } - - public double getWidth() { - return width; - } - - public double getHeight() { - return height; - } - - public double getStartAngle() { - return startAngle; - } - - public double getEndAngle() { - return endAngle; - } -} diff --git a/src2/fr/orsay/lri/varna/models/export/CircleCommand.java b/src2/fr/orsay/lri/varna/models/export/CircleCommand.java deleted file mode 100644 index bc6c286..0000000 --- a/src2/fr/orsay/lri/varna/models/export/CircleCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - 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.models.export; - -import java.awt.geom.Point2D; - -public class CircleCommand extends GraphicElement { - - private Point2D.Double _base; - private double _radius; - private double _thickness; - - public CircleCommand(Point2D.Double base, double radius, double thickness) { - _base = base; - _radius = radius; - _thickness = thickness; - } - - public Point2D.Double get_base() { - return _base; - } - - public double get_radius() { - return _radius; - } - - public double get_thickness() { - return _thickness; - } -} diff --git a/src2/fr/orsay/lri/varna/models/export/ColorCommand.java b/src2/fr/orsay/lri/varna/models/export/ColorCommand.java deleted file mode 100644 index fd1bea9..0000000 --- a/src2/fr/orsay/lri/varna/models/export/ColorCommand.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - 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.models.export; - -import java.awt.Color; - -public class ColorCommand extends GraphicElement { - Color _color; - - public ColorCommand(Color c) { - _color = c; - } - - public Color getColor() { - return _color; - } -} diff --git a/src2/fr/orsay/lri/varna/models/export/FillCircleCommand.java b/src2/fr/orsay/lri/varna/models/export/FillCircleCommand.java deleted file mode 100644 index 8c971e8..0000000 --- a/src2/fr/orsay/lri/varna/models/export/FillCircleCommand.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - 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.models.export; - -import java.awt.Color; -import java.awt.geom.Point2D; - -public class FillCircleCommand extends GraphicElement { - - private Point2D.Double _base; - private double _radius; - private double _thickness; - private Color _color; - - public FillCircleCommand(Point2D.Double base, double radius, - double thickness, Color color) { - _base = base; - _radius = radius; - _thickness = thickness; - _color = color; - } - - public Point2D.Double get_base() { - return _base; - } - - public double get_radius() { - return _radius; - } - - public double get_thickness() { - return _thickness; - } - - public Color get_color() { - return _color; - } -} diff --git a/src2/fr/orsay/lri/varna/models/export/FillPolygonCommand.java b/src2/fr/orsay/lri/varna/models/export/FillPolygonCommand.java deleted file mode 100644 index d4266ae..0000000 --- a/src2/fr/orsay/lri/varna/models/export/FillPolygonCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - 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.models.export; - -import java.awt.Color; -import java.awt.geom.Point2D; - -public class FillPolygonCommand extends GraphicElement { - - private Point2D.Double[] _points; - //private double _thickness; - private Color _color; - - public FillPolygonCommand(Point2D.Double[] points, - Color color) { - _points = points; - _color = color; - } - - public Point2D.Double[] get_points() { - return _points; - } - - - public Color get_color() { - return _color; - } -} diff --git a/src2/fr/orsay/lri/varna/models/export/FontCommand.java b/src2/fr/orsay/lri/varna/models/export/FontCommand.java deleted file mode 100644 index bf93264..0000000 --- a/src2/fr/orsay/lri/varna/models/export/FontCommand.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - 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.models.export; - -public class FontCommand extends GraphicElement { - private int _font; - private double _size; - - public FontCommand(int font, double size) { - _font = font; - _size = size; - } - - public int get_font() { - return _font; - } - - public double get_size() { - return _size; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/export/GraphicElement.java b/src2/fr/orsay/lri/varna/models/export/GraphicElement.java deleted file mode 100644 index 459308c..0000000 --- a/src2/fr/orsay/lri/varna/models/export/GraphicElement.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - 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.models.export; - -public abstract class GraphicElement { -} diff --git a/src2/fr/orsay/lri/varna/models/export/LineCommand.java b/src2/fr/orsay/lri/varna/models/export/LineCommand.java deleted file mode 100644 index 476abe9..0000000 --- a/src2/fr/orsay/lri/varna/models/export/LineCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - 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.models.export; - -import java.awt.geom.Point2D; - -public class LineCommand extends GraphicElement { - private Point2D.Double _orig; - private Point2D.Double _dest; - private double _thickness; - - public LineCommand(Point2D.Double orig, Point2D.Double dest, - double thickness) { - _orig = orig; - _dest = dest; - _thickness = thickness; - } - - public Point2D.Double get_orig() { - return _orig; - } - - public Point2D.Double get_dest() { - return _dest; - } - - public double get_thickness() { - return _thickness; - } -} diff --git a/src2/fr/orsay/lri/varna/models/export/PSExport.java b/src2/fr/orsay/lri/varna/models/export/PSExport.java deleted file mode 100644 index 7907150..0000000 --- a/src2/fr/orsay/lri/varna/models/export/PSExport.java +++ /dev/null @@ -1,333 +0,0 @@ -/* - 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.models.export; - -import java.awt.Color; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.awt.geom.Point2D.Double; - -import fr.orsay.lri.varna.models.rna.ModeleBP; - -/** - * @author ponty - * - */ -public class PSExport extends SecStrDrawingProducer { - - public PSExport() - { - super(); - super.setScale(0.4); - } - - private String PSMacros() { - String setFontSize = - // Params [fontsize|...] - "/setbasefont \n" + "{ /Helvetica-Bold findfont\n" + // => - // [font|scale|...] - " exch scalefont\n" + // => [scaled_font|...] - " setfont \n" + // => [...] - " } def\n\n"; - - String writeTextCentered = - // Params [txt|size|...] - "/txtcenter \n" + "{ dup \n" + // => [txt|txt|size|...] - " stringwidth pop\n" + // => [wtxt|txt|size|...] - " 2 div neg \n" + // => [-wtxt/2|txt|size|...] - " 3 -1 roll \n" + // => [size|-wtxt/2|txt...] - " 2 div neg\n" + // => [-size/2|-wtxt/2|txt|...] - " rmoveto\n" + // => [txt|...] - " show\n" + // => [...] - " } def\n\n"; - - String drawEllipse = "/ellipse {\n" + " /endangle exch def\n" - + " /startangle exch def\n" + " /yrad exch def\n" - + " /xrad exch def\n" + " /y exch def\n" + " /x exch def\n" - + " /savematrix matrix currentmatrix def\n" - + " x y translate\n" + " xrad yrad scale\n" - + " 0 0 1 startangle endangle arc\n" - + " savematrix setmatrix\n" + " } def\n\n"; - return setFontSize + writeTextCentered + drawEllipse; - } - - private String EPSHeader(double minX, double maxX, double minY, double maxY) { - String bbox = PSBBox(minX, minY, maxX, maxY); - String init = "%!PS-Adobe-3.0\n" + "%%Pages: 1\n" + bbox - + "%%EndComments\n" + "%%Page: 1 1\n"; - String macros = PSMacros(); - return init + macros; - } - - private String EPSFooter() { - return "showpage\n" + "%%EndPage: 1\n" + "%%EOF"; - } - - private String PSNewPath() { - return ("newpath\n"); - } - - private String PSMoveTo(double x, double y) { - return ("" + x + " " + y + " moveto\n"); - } - - private String PSLineTo(double dx, double dy) { - return ("" + dx + " " + dy + " lineto\n"); - } - - private String PSRLineTo(double dx, double dy) { - return ("" + dx + " " + dy + " rlineto\n"); - } - - private String PSSetLineWidth(double thickness) { - thickness /= 2; - return ("" + thickness + " setlinewidth\n"); - } - - private String PSStroke() { - return ("stroke\n"); - } - - private String PSArc(double x, double y, double radiusX, double radiusY, - double angleFrom, double angleTo) { - - double centerX = x; - double centerY = y; - - // return (centerX + " " + centerY + " "+ radiusX/2.0+" " + angleFrom + - // " " + angleTo + " arc\n"); - - return (centerX + " " + centerY + " " + radiusX / 2.0 + " " + radiusY - / 2.0 + " " + angleTo + " " + angleFrom + " ellipse\n"); - - } - - private String PSArc(double x, double y, double radius, double angleFrom, - double angleTo) { - - return ("" + x + " " + y + " " + radius + " " + angleFrom + " " - + angleTo + " arc\n"); - } - - private String PSBBox(double minX, double maxX, double minY, double maxY) { - String norm = ("%%BoundingBox: " + (long) Math.floor(minX) + " " - + (long) Math.floor(minY) + " " + (long) Math.ceil(maxX) + " " - + (long) Math.ceil(maxY) + "\n"); - String high = ("%%HighResBoundingBox: " + (long) Math.floor(minX) + " " - + (long) Math.floor(minY) + " " + (long) Math.ceil(maxX) + " " - + (long) Math.ceil(maxY) + "\n"); - return norm + high; - } - - private String PSText(String txt) { - return ("(" + txt + ") "); - } - - @SuppressWarnings("unused") - private String PSShow() { - return ("show\n"); - } - - private String PSClosePath() { - return ("closepath\n"); - } - - private String PSFill() { - return ("fill\n"); - } - - private String PSSetColor(Color col) { - return ("" + (((double) col.getRed()) / 255.0) + " " - + (((double) col.getGreen()) / 255.0) + " " - + (((double) col.getBlue()) / 255.0) + " setrgbcolor\n"); - } - - private String fontName(int font) { - switch (font) { - case (FONT_TIMES_ROMAN): - return "/Times-Roman"; - case (FONT_TIMES_BOLD): - return "/Times-Bold"; - case (FONT_TIMES_ITALIC): - return "/Times-Italic"; - case (FONT_TIMES_BOLD_ITALIC): - return "/Times-BoldItalic"; - case (FONT_HELVETICA): - return "/Helvetica"; - case (FONT_HELVETICA_BOLD): - return "/Helvetica-Bold"; - case (FONT_HELVETICA_OBLIQUE): - return "/Helvetica-Oblique"; - case (FONT_HELVETICA_BOLD_OBLIQUE): - return "/Helvetica-BoldOblique"; - case (FONT_COURIER): - return "/Courier"; - case (FONT_COURIER_BOLD): - return "/Courier-Bold"; - case (FONT_COURIER_OBLIQUE): - return "/Courier-Oblique"; - case (FONT_COURIER_BOLD_OBLIQUE): - return "/Courier-BoldOblique"; - } - return "/Helvetica"; - } - - private String PSSetFont(int font, double size) { - return (fontName(font) + " findfont " + size + " scalefont setfont\n"); - } - - public String setFontS(int font, double size) { - _fontsize = (long) (0.4 * size); - return PSSetFont(font, _fontsize); - } - - public String setColorS(Color col) { - super.setColorS(col); - String result = PSSetColor(col); - return result; - } - - public String drawLineS(Point2D.Double p0, Point2D.Double p1, - double thickness) { - String tmp = ""; - tmp += PSMoveTo(p0.x, p0.y); - tmp += PSLineTo(p1.x, p1.y); - tmp += PSSetLineWidth(thickness); - tmp += PSStroke(); - return tmp; - } - - public String drawTextS(Point2D.Double p, String txt) { - String tmp = ""; - tmp += PSMoveTo(p.x, p.y); - tmp += ("" + (_fontsize / 2.0 + 1) + " \n"); - tmp += PSText(txt); - tmp += (" txtcenter\n"); - return tmp; - } - - public String drawRectangleS(Point2D.Double orig, Point2D.Double dims, - double thickness) { - String tmp = PSNewPath(); - tmp += PSMoveTo(orig.x, orig.y); - tmp += PSRLineTo(0, dims.y); - tmp += PSRLineTo(dims.x, 0); - tmp += PSRLineTo(0, -dims.y); - tmp += PSClosePath(); - tmp += PSSetLineWidth(thickness); - tmp += PSStroke(); - return tmp; - } - - public String drawCircleS(Point2D.Double p, double radius, double thickness) { - String tmp = PSNewPath(); - tmp += PSArc(p.x, p.y, radius, 0, 360); - tmp += PSSetLineWidth(thickness); - tmp += PSStroke(); - return tmp; - } - - public String fillCircleS(Point2D.Double p, double radius, - double thickness, Color color) { - String tmp = PSNewPath(); - tmp += PSArc(p.x, p.y, radius, 0, 360); - tmp += PSSetLineWidth(thickness); - tmp += PSSetColor(color); - tmp += PSFill(); - return tmp; - } - - public String footerS() { - return EPSFooter(); - } - - public String headerS(Rectangle2D.Double bb) { - return EPSHeader(bb.x, bb.y, bb.x + bb.width, bb.y + bb.height); - } - - @Override - public String drawArcS(Point2D.Double origine, double width, double height, - double startAngle, double endAngle) { - return PSArc(origine.x, origine.y, width, height, startAngle, endAngle) - + PSStroke(); - } - - @Override - public String drawPolygonS(Double[] points, double thickness) { - String tmp = PSNewPath(); - tmp += PSSetLineWidth(thickness); - for (int i = 0; i < points.length; i++) { - if (i == 0) { - tmp += PSMoveTo(points[i].x, points[i].y); - } else { - tmp += PSLineTo(points[i].x, points[i].y); - } - } - tmp += PSClosePath(); - tmp += PSStroke(); - return tmp; - } - - @Override - public String fillPolygonS(Double[] points, Color color) { - Color bck = _curColor; - String tmp = PSNewPath(); - for (int i = 0; i < points.length; i++) { - if (i == 0) { - tmp += PSMoveTo(points[i].x, points[i].y); - } else { - tmp += PSLineTo(points[i].x, points[i].y); - } - } - tmp += PSClosePath(); - tmp += PSSetColor(color); - tmp += PSFill(); - tmp += PSSetColor(bck); - return tmp; - } - - @Override - public String drawBaseStartS(int index) { - return ""; - } - - @Override - public String drawBaseEndS(int index) { - return ""; - } - - @Override - public String drawBasePairStartS(int i, int j, ModeleBP bps) { - return ""; - } - - @Override - public String drawBasePairEndS(int index) { - return ""; - } - - @Override - public String drawBackboneStartS(int i, int j) { - return ""; - } - - @Override - public String drawBackboneEndS(int index) { - return ""; - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/models/export/PolygonCommand.java b/src2/fr/orsay/lri/varna/models/export/PolygonCommand.java deleted file mode 100644 index cfcf0bd..0000000 --- a/src2/fr/orsay/lri/varna/models/export/PolygonCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - 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.models.export; - -import java.awt.geom.Point2D; - -public class PolygonCommand extends GraphicElement { - - private Point2D.Double[] _points; - private double _thickness; - - public PolygonCommand(Point2D.Double[] points, double thickness) { - _points = points; - _thickness = thickness; - } - - public Point2D.Double[] get_points() { - return _points; - } - - public double get_thickness() { - return _thickness; - } -} diff --git a/src2/fr/orsay/lri/varna/models/export/RectangleCommand.java b/src2/fr/orsay/lri/varna/models/export/RectangleCommand.java deleted file mode 100644 index 8e0f080..0000000 --- a/src2/fr/orsay/lri/varna/models/export/RectangleCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - 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.models.export; - -import java.awt.geom.Point2D; - -public class RectangleCommand extends GraphicElement { - private Point2D.Double _orig; - private Point2D.Double _dims; - private double _thickness; - - public RectangleCommand(Point2D.Double orig, Point2D.Double dims, - double thickness) { - _orig = orig; - _dims = dims; - _thickness = thickness; - } - - public Point2D.Double get_orig() { - return _orig; - } - - public Point2D.Double get_dims() { - return _dims; - } - - public double get_thickness() { - return _thickness; - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/models/export/SVGExport.java b/src2/fr/orsay/lri/varna/models/export/SVGExport.java deleted file mode 100644 index 0ddd711..0000000 --- a/src2/fr/orsay/lri/varna/models/export/SVGExport.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - 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.models.export; - -import java.awt.Color; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.awt.geom.Point2D.Double; - -import fr.orsay.lri.varna.models.rna.ModeleBP; - -public class SVGExport extends SecStrDrawingProducer { - - private double _fontsize = 10.0; - private Rectangle2D.Double _bb = new Rectangle2D.Double(0, 0, 10, 10); - double _thickness = 2.0; - - - public SVGExport() - { - super(); - super.setScale(0.5); - } - - private String getRGBString(Color col) { - int rpc = (int) ((((double) col.getRed()) / 255.0) * 100); - int gpc = (int) ((((double) col.getGreen()) / 255.0) * 100); - int bpc = (int) ((((double) col.getBlue()) / 255.0) * 100); - return "rgb(" + rpc + "%, " + gpc + "%, " + bpc + "%)"; - } - - public String drawCircleS(Point2D.Double base, double radius, - double thickness) { - _thickness = thickness; - return "\n"; - } - - public String drawLineS(Point2D.Double orig, Point2D.Double dest, - double thickness) { - _thickness = thickness; - return "\n"; - } - - public String drawRectangleS(Point2D.Double orig, Point2D.Double dims, - double thickness) { - _thickness = thickness; - return ""; - } - - public String drawTextS(Point2D.Double base, String txt) { - //System.out.println(txt); - return "" - + txt + "\n"; - } - - public String fillCircleS(Point2D.Double base, double radius, - double thickness, Color col) { - _thickness = thickness; - - return "\n"; - } - - public String footerS() { - return "\n"; - } - - public String headerS(Rectangle2D.Double bb) { - _bb = bb; - return "\n" - + "\n" - + "\n" - + "\n"; - } - - public String setFontS(int font, double size) { - _fontsize = 0.5 * size; - return ""; - } - - - private Point2D.Double polarToCartesian(Point2D.Double center, double radiusX, double radiusY, double angleInDegrees) { - double angleInRadians = (angleInDegrees) * Math.PI / 180.0; - - return new Point2D.Double(center.x + (radiusX * Math.cos(angleInRadians)), - _bb.height - (center.y + (radiusY * Math.sin(angleInRadians)))); - } - - - public String drawArcS(Point2D.Double o, double width, double height, - double startAngle, double endAngle) { - double rx = width / 2.0; - double ry = height / 2.0; - - Point2D.Double ps = polarToCartesian(o,rx,ry,startAngle); - Point2D.Double pe = polarToCartesian(o,rx,ry,endAngle); - - String d = "\n"; - return d; - } - - public String drawPolygonS(Double[] points, double thickness) { - String result = "\n"; - return result; - } - - @Override - public String fillPolygonS(Double[] points, Color col) { - String result = "\n"; - return result; - } - - @Override - public String drawBaseStartS(int index) { - return ""; - } - - @Override - public String drawBaseEndS(int index) { - return ""; - } - - @Override - public String drawBasePairStartS(int i, int j, ModeleBP bps) { - return ""; - } - - @Override - public String drawBasePairEndS(int index) { - return ""; - } - - @Override - public String drawBackboneStartS(int i, int j) { - return ""; - } - - @Override - public String drawBackboneEndS(int index) { - return ""; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/export/SecStrDrawingProducer.java b/src2/fr/orsay/lri/varna/models/export/SecStrDrawingProducer.java deleted file mode 100644 index a80e8e2..0000000 --- a/src2/fr/orsay/lri/varna/models/export/SecStrDrawingProducer.java +++ /dev/null @@ -1,400 +0,0 @@ -/* - 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.models.export; - -import java.awt.Color; -import java.awt.geom.AffineTransform; -import java.awt.geom.GeneralPath; -import java.awt.geom.PathIterator; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.util.Vector; - -import fr.orsay.lri.varna.models.rna.ModeleBP; - -public abstract class SecStrDrawingProducer { - public static final int FONT_TIMES_ROMAN = 0; - public static final int FONT_TIMES_BOLD = 1; - public static final int FONT_TIMES_ITALIC = 2; - public static final int FONT_TIMES_BOLD_ITALIC = 3; - public static final int FONT_HELVETICA = 16; - public static final int FONT_HELVETICA_OBLIQUE = 17; - public static final int FONT_HELVETICA_BOLD = 18; - public static final int FONT_HELVETICA_BOLD_OBLIQUE = 19; - public static final int FONT_COURIER = 12; - public static final int FONT_COURIER_BOLD = 13; - public static final int FONT_COURIER_OBLIQUE = 14; - public static final int FONT_COURIER_BOLD_OBLIQUE = 15; - - private Vector _commands = new Vector(); - - private double _scale = 1.0; - private double _xmin = Double.MAX_VALUE; - private double _ymin = Double.MAX_VALUE; - private double _xmax = -Double.MAX_VALUE; - private double _ymax = -Double.MAX_VALUE; - - protected Color _curColor = Color.black; - protected Color _backgroundColor = null; - - protected double _fontsize = 10.0; - protected int _font = FONT_HELVETICA_BOLD; - - - public Color getCurrentColor() { - return _curColor; - } - - public double getCurFontSize() { - return _fontsize; - } - - public int getCurrentFont() { - return _font; - } - - - public abstract String drawBaseStartS(int index); - public abstract String drawBaseEndS(int index); - public abstract String drawBasePairStartS(int i, int j, ModeleBP bps); - public abstract String drawBasePairEndS(int index); - public abstract String drawBackboneStartS(int i, int j); - public abstract String drawBackboneEndS(int index); - - public abstract String drawLineS(Point2D.Double orig, - Point2D.Double dest, double thickness); - - - public abstract String drawArcS(Point2D.Double origine, double width, - double height, double startAngle, double endAngle); - - public abstract String drawTextS(Point2D.Double base, String txt); - - public abstract String drawRectangleS(Point2D.Double orig, - Point2D.Double dims, double thickness); - - public abstract String drawCircleS(Point2D.Double base, double radius, - double thickness); - - public abstract String fillCircleS(Point2D.Double base, double radius, - double thickness, Color color); - - public abstract String drawPolygonS(Point2D.Double[] points, - double thickness); - - public abstract String fillPolygonS(Point2D.Double[] points, - Color color); - - public abstract String setFontS(int font, double size); - - public String setColorS(Color col) { - _curColor = col; - return ""; - } - - public abstract String headerS(Rectangle2D.Double bb); - - public abstract String footerS(); - - @SuppressWarnings("unused") - private void resetBoundingBox() { - _xmin = Double.MAX_VALUE; - _ymin = Double.MAX_VALUE; - _xmax = -Double.MAX_VALUE; - _ymax = -Double.MAX_VALUE; - } - - private void updateBoundingBox(double x, double y) { - _xmin = Math.min(_xmin, x - 10); - _ymin = Math.min(_ymin, y - 10); - _xmax = Math.max(_xmax, x + 10); - _ymax = Math.max(_ymax, y + 10); - } - - public void drawLine(double x0, double y0, double x1, double y1, - double thickness) { - updateBoundingBox(x0, y0); - updateBoundingBox(x1, y1); - _commands.add(new LineCommand(new Point2D.Double(x0, y0), - new Point2D.Double(x1, y1), thickness)); - } - - public void drawArc(Point2D.Double origine, double width, double height, - double startAngle, double endAngle) { - updateBoundingBox(origine.x + width/2., origine.y + height/2.); - updateBoundingBox(origine.x - width/2., origine.y - height/2.); - _commands.add(new ArcCommand(origine, width, height, startAngle, - endAngle)); - } - - public void drawText(double x, double y, String txt) { - updateBoundingBox(x, y); - - _commands.add(new TextCommand(new Point2D.Double(x, y), new String(txt))); - } - - public void drawRectangle(double x, double y, double w, double h, - double thickness) { - updateBoundingBox(x, y); - updateBoundingBox(x + w, y + h); - - _commands.add(new RectangleCommand(new Point2D.Double(x, y), - new Point2D.Double(w, h), thickness)); - } - - public void fillRectangle(double x, double y, double w, double h, Color color) { - double [] xtab = new double[4]; - double [] ytab = new double[4]; - xtab[0] = x; - xtab[1] = x+w; - xtab[2] = x+w; - xtab[3] = x; - ytab[0] = y; - ytab[1] = y; - ytab[2] = y+h; - ytab[3] = y+h; - fillPolygon(xtab, ytab, color); - } - - public void drawCircle(double x, double y, double radius, double thickness) { - updateBoundingBox(x - radius, y - radius); - updateBoundingBox(x + radius, y + radius); - - _commands.add(new CircleCommand(new Point2D.Double(x, y), radius, - thickness)); - - } - - public void setColor(Color col) { - _curColor = col; - _commands.add(new ColorCommand(col)); - } - - public void setBackgroundColor(Color col){ - _backgroundColor = col; - } - - public void removeBackgroundColor(){ - _backgroundColor = null; - } - - public void fillCircle(double x, double y, double radius, double thickness, - Color color) { - updateBoundingBox(x - radius, y - radius); - updateBoundingBox(x + radius, y + radius); - - _commands.add(new FillCircleCommand(new Point2D.Double(x, y), radius, - thickness, color)); - } - - public void drawPolygon(double[] xtab, double[] ytab, double thickness) { - if (xtab.length == ytab.length) { - Point2D.Double points[] = new Point2D.Double[xtab.length]; - for (int i = 0; i < xtab.length; i++) { - points[i] = new Point2D.Double(xtab[i], ytab[i]); - updateBoundingBox(xtab[i], ytab[i]); - } - _commands.add(new PolygonCommand(points, thickness)); - } - } - - public void drawPolygon(GeneralPath p, - double thickness) { - PathIterator pi = p.getPathIterator(null); - Vector v = new Vector(); - double[] coords = new double[6]; - while (!pi.isDone()) - { - int code = pi.currentSegment(coords); - if (code == PathIterator.SEG_MOVETO) - { v.add(new Point2D.Double(coords[0],coords[1])); } - if (code == PathIterator.SEG_LINETO) - { v.add(new Point2D.Double(coords[0],coords[1])); } - pi.next(); - } - double[] xtab = new double[v.size()]; - double[] ytab = new double[v.size()]; - for(int i=0;i v = new Vector(); - double[] coords = new double[6]; - while (!pi.isDone()) - { - int code = pi.currentSegment(coords); - if (code == PathIterator.SEG_MOVETO) - { v.add(new Point2D.Double(coords[0],coords[1])); } - if (code == PathIterator.SEG_LINETO) - { v.add(new Point2D.Double(coords[0],coords[1])); } - pi.next(); - } - double[] xtab = new double[v.size()]; - double[] ytab = new double[v.size()]; - for(int i=0;i 0) { - String result = "\\draw[draw=currColor] "; - for (int i = 0; i < points.length; i++) { - result += ""+formatPoint(points[i])+" -- "; - } - result += ""+formatPoint(points[0])+";"; - return result; - } else { - return ""; - } - } - - @Override - public String fillPolygonS(Double[] points, Color col) { - if (points.length > 0) { - String result = "\\fill[fill=currColor] "; - for (int i = 0; i < points.length; i++) { - result += ""+formatPoint(points[i])+" -- "; - } - result += ""+formatPoint(points[0])+";"; - return setColorS(col) - +result; - } else { - return setColorS(col); - } - } - - @Override - public String drawBaseStartS(int index) { - return ""; - } - - @Override - public String drawBaseEndS(int index) { - return ""; - } - - @Override - public String drawBasePairStartS(int i, int j, ModeleBP bps) { - return ""; - } - - @Override - public String drawBasePairEndS(int index) { - return ""; - } - - @Override - public String drawBackboneStartS(int i, int j) { - return ""; - } - - @Override - public String drawBackboneEndS(int index) { - return ""; - } - - -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/models/export/VueVARNAGraphics.java b/src2/fr/orsay/lri/varna/models/export/VueVARNAGraphics.java deleted file mode 100644 index 7737abf..0000000 --- a/src2/fr/orsay/lri/varna/models/export/VueVARNAGraphics.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.orsay.lri.varna.models.export; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Shape; -import java.awt.Stroke; -import java.awt.geom.GeneralPath; - -public interface VueVARNAGraphics { - public Dimension getStringDimension(String s); - public void drawStringCentered(String res, double x, double y); - public void setColor(Color c); - public Color getColor(); - public void drawLine(double x1, double y1, double x2, double y2); - public void drawRect(double x, double y, double w, double h); - public void fillRect(double x, double y, double w, double h); - public void drawCircle(double x, double y, double r); - public void fillCircle(double x, double y, double r); - public void drawRoundRect(double x, double y, double w, double h, double rx, double ry); - public void fillRoundRect(double x, double y, double w, double h, double rx, double ry); - public void drawArc(double x, double y, double rx, double ry, double angleStart, double angleEnd); - //public void drawString(String s, double x, double y); - public void draw(GeneralPath s); - public void fill(GeneralPath s); - public void setFont(Font f); - public void setSelectionStroke(); - public void setPlainStroke(); - public void setStrokeThickness(double t); - -} diff --git a/src2/fr/orsay/lri/varna/models/export/XFIGExport.java b/src2/fr/orsay/lri/varna/models/export/XFIGExport.java deleted file mode 100644 index 179a3ac..0000000 --- a/src2/fr/orsay/lri/varna/models/export/XFIGExport.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - 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.models.export; - -import java.awt.Color; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.awt.geom.Point2D.Double; -import java.util.Hashtable; - -import fr.orsay.lri.varna.models.rna.ModeleBP; - -public class XFIGExport extends SecStrDrawingProducer { - - private int _font = SecStrDrawingProducer.FONT_TIMES_ROMAN; - @SuppressWarnings("unused") - private StringBuffer buf = new StringBuffer(); - - private Hashtable _definedCols = new Hashtable(); - - // From XFig 3.2 file format, indexed RGB colors are in the range [32,543] - private int _nextColCode = 32; - private final static int UPPER_BOUND_COLOR_CODE = 543; - - public XFIGExport() - { - super(); - super.setScale(20.0); - } - - - private String ensureColorDefinition(Color col) { - if (!_definedCols.containsKey(col)) { - if (_nextColCode < UPPER_BOUND_COLOR_CODE) { - int curColorCode = _nextColCode; - _definedCols.put(col, curColorCode); - _nextColCode++; - - String RGBR = Integer.toHexString(col.getRed()); - if (RGBR.length() < 2) { - RGBR = "0" + RGBR; - } - String RGBG = Integer.toHexString(col.getGreen()); - if (RGBG.length() < 2) { - RGBG = "0" + RGBG; - } - String RGBB = Integer.toHexString(col.getBlue()); - if (RGBB.length() < 2) { - RGBB = "0" + RGBB; - } - String RGBHex = "#" + RGBR + RGBG + RGBB; - RGBHex = RGBHex.toUpperCase(); - return "0 " + curColorCode + " " + RGBHex + "\n"; - } - } - return ""; - } - - private int getColorCode(Color col) { - if (_definedCols.containsKey(col)) { - return _definedCols.get(col); - } - return 0; - } - - private int getCurColorCode() { - if (_definedCols.containsKey(_curColor)) { - return _definedCols.get(_curColor); - } - return 0; - } - - private String XFIGHeader() { - return "#FIG 3.2\n" + "Landscape\n" + "Center\n" + "Inches\n" - + "Letter \n" + "100.00\n" + "Single\n" + "-2\n" + "1200 2\n"; - } - - public String drawCircleS(Point2D.Double p, double radius, double thickness) { - return ("1 3 0 " + (long) thickness + " " + getCurColorCode() - + " 7 50 -1 -1 0.000 1 0.0000 " + (long) p.x + " " - + (long) -p.y + " " + (long) radius + " " + (long) radius + " 1 1 1 1\n"); - } - - public String drawLineS(Point2D.Double p0, Point2D.Double p1, - double thickness) { - return ("2 1 0 " + (long) thickness + " " + getCurColorCode() - + " 7 60 -1 -1 0.000 0 0 -1 0 0 2\n" + " " + (long) p0.x + " " - + (long) -p0.y + " " + (long) p1.x + " " + (long) -p1.y + "\n"); - } - - public String drawRectangleS(Point2D.Double p, Point2D.Double dims, - double thickness) { - return ("2 2 0 " + (long) thickness + " " + getCurColorCode() - + " 7 50 -1 -1 0.000 0 0 -1 0 0 5\n" + "\t " + (long) (p.x) - + " " + (long) (-p.y) + " " + (long) (p.x + dims.x) + " " - + (long) (-p.y) + " " + (long) (p.x + dims.x) + " " - + (long) -(p.y + dims.y) + " " + (long) (p.x) + " " - + (long) -(p.y + dims.y) + " " + (long) (p.x) + " " - + (long) -(p.y) + "\n"); - } - - public String drawTextS(Point2D.Double p, String txt) { - return ("4 1 " + getCurColorCode() + " 40 -1 " + _font + " " - + (long) _fontsize + " 0.0000 6 " + (long) 4 * _fontsize + " " - + (long) (2 * _fontsize) + " " + (long) (p.x) + " " - + (long) -(p.y - 6 * _fontsize) + " " + txt + "\\001\n"); - } - - public String fillCircleS(Point2D.Double p, double radius, - double thickness, Color col) { - String coldef = ensureColorDefinition(col); - return (coldef + "1 3 0 " + (long) thickness + " 0 " - + getColorCode(col) + " 50 0 20 0.000 1 0.0000 " + (long) p.x - + " " + (long) -p.y + " " + (long) radius + " " + (long) radius + " 1 1 1 1\n"); - } - - public String setFontS(int font, double size) { - _font = font; - _fontsize = 1.2 * size; - return ""; - } - - public String setColorS(Color col) { - super.setColorS(col); - return (ensureColorDefinition(col)); - } - - public String footerS() { - return ""; - } - - public String headerS(Rectangle2D.Double bb) { - return XFIGHeader(); - } - - @Override - public String drawArcS(Point2D.Double origine, double width, double height, - double startAngle, double endAngle) { - double p1x = origine.x; - double p1y = -origine.y; - double p2x = origine.x + width / 2.0; - double p2y = -origine.y - height / 2.0; - double p3x = origine.x + width; - double p3y = p1y; - double cx = (p1x + p3x) / 2.0; - double cy = p3y + height / 2.0; - return ("5 1 0 1 " + getCurColorCode() + " 7 50 0 -1 4.000 0 0 0 0 " - + cx + " " + cy + " " + (int) p1x + " " + (int) p1y + " " - + (int) p2x + " " + (int) p2y + " " + (int) p3x + " " - + (int) p3y + "\n"); - - } - - @Override - public String drawPolygonS(Double[] points, double thickness) { - if (points.length > 0) { - String result = "2 3 0 1 " + getCurColorCode() - + " 7 40 0 -1 4.000 0 0 0 0 0 " + (points.length + 1) - + "\n"; - for (int i = 0; i < points.length; i++) { - result += (int) Math.round(points[i].x) + " " - + (int) Math.round(-points[i].y) + " "; - } - result += (int) Math.round(points[0].x) + " " - + (int) Math.round(-points[0].y) + " "; - result += "\n"; - return result; - } else { - return ""; - } - } - - @Override - public String fillPolygonS(Double[] points, Color col) { - if (points.length > 0) { - String coldef = ensureColorDefinition(col); - String result = "2 3 0 1 0 " + getColorCode(col) - + " 35 0 0 4.000 0 0 0 0 0 " + (points.length + 1) + "\n"; - for (int i = 0; i < points.length; i++) { - result += (int) Math.round(points[i].x) + " " - + (int) Math.round(-points[i].y) + " "; - } - result += (int) Math.round(points[0].x) + " " - + (int) Math.round(-points[0].y) + " "; - result += "\n"; - return coldef + result; - } else { - return ""; - } - } - - @Override - public String drawBaseStartS(int index) { - return ""; - } - - @Override - public String drawBaseEndS(int index) { - return ""; - } - - @Override - public String drawBasePairStartS(int i, int j, ModeleBP bps) { - return ""; - } - - @Override - public String drawBasePairEndS(int index) { - return ""; - } - - @Override - public String drawBackboneStartS(int i, int j) { - return ""; - } - - @Override - public String drawBackboneEndS(int index) { - return ""; - } - -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/models/geom/ComputeArcCenter.java b/src2/fr/orsay/lri/varna/models/geom/ComputeArcCenter.java deleted file mode 100644 index 0aa8ebf..0000000 --- a/src2/fr/orsay/lri/varna/models/geom/ComputeArcCenter.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.models.geom; - -public class ComputeArcCenter { - - /** - * Given an arc length (l) and segment length (delta) of the arc, - * find where to put the center, returned as a position of the perpendicular - * bisector of the segment. The positive side is the one where the arc is drawn. - * It works using Newton's method. - */ - public static double computeArcCenter(double delta, double l) { - double x_n = 0; - double x_n_plus_1, f_x_n, f_x_n_plus_1; - f_x_n = f(x_n,delta); - while (true) { - x_n_plus_1 = x_n - (f_x_n - l)/fprime(x_n,delta); - f_x_n_plus_1 = f(x_n_plus_1,delta); - // We want a precision of 0.1 on arc length - if (x_n_plus_1 == Double.NEGATIVE_INFINITY || Math.abs(f_x_n_plus_1 - f_x_n) < 0.1) { - //System.out.println("computeArcCenter: steps = " + steps + " result = " + x_n_plus_1); - return x_n_plus_1; - } - x_n = x_n_plus_1; - f_x_n = f_x_n_plus_1; - } - } - - private static double f(double c, double delta) { - if (c < 0) { - return 2*Math.atan(delta/(-2*c)) * Math.sqrt(delta*delta/4 + c*c); - } else if (c != 0) { // c > 0 - return (2*Math.PI - 2*Math.atan(delta/(2*c))) * Math.sqrt(delta*delta/4 + c*c); - } else { // c == 0 - return Math.PI * Math.sqrt(delta*delta/4 + c*c); - } - } - - /** - * d/dc f(c,delta) - */ - private static double fprime(double c, double delta) { - if (c < 0) { - return delta/(c*c + delta/4)*Math.sqrt(delta*delta/4 + c*c) + 2*Math.atan(delta/(-2*c))*c/Math.sqrt(delta*delta/4 + c*c); - } else if (c != 0) { // c > 0 - return delta/(c*c + delta/4)*Math.sqrt(delta*delta/4 + c*c) + (2*Math.PI - 2*Math.atan(delta/(-2*c)))*c/Math.sqrt(delta*delta/4 + c*c); - } else { // c == 0 - return 2; - } - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/models/geom/ComputeEllipseAxis.java b/src2/fr/orsay/lri/varna/models/geom/ComputeEllipseAxis.java deleted file mode 100644 index b8d699b..0000000 --- a/src2/fr/orsay/lri/varna/models/geom/ComputeEllipseAxis.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.models.geom; - -public class ComputeEllipseAxis { - public static boolean debug = false; - - /** - * Given one axis half-length b and the circumference l, - * find the other axis half-length a. - * Returns 0 if there is no solution. - * Implemented with Newton's method. - */ - public static double computeEllipseAxis(double b, double l) { - if (l/4 <= b || b <= 0 || l <= 0) { - // No such ellipse can exist. - return 0; - } else { - int steps = 0; - double x_n = 10; - double x_n_plus_1, f_x_n, f_x_n_plus_1; - f_x_n = f(x_n,b) - l; - while (true) { - //System.out.println("x_n = " + x_n + " f(x_n)=" + f_x_n); - x_n_plus_1 = x_n - f_x_n/fprime(x_n,b); - f_x_n_plus_1 = f(x_n_plus_1,b) - l; - if (x_n_plus_1 < 0) { - System.out.println("ComputeEllipseAxis: x_n < 0 => returning 0"); - return 0; - } - // We want a precision of 0.01 on arc length - if (Math.abs(f_x_n_plus_1 - f_x_n) < 0.01) { - if (debug) System.out.println("#steps = " + steps); - return x_n_plus_1; - } - x_n = x_n_plus_1; - f_x_n = f_x_n_plus_1; - steps++; - } - } - } - - - - private static double f(double a, double b) { - // This is Ramanujan's approximation of an ellipse circumference - // Nice because it is fast to compute (no need to compute an integral) - // and the derivative is also simple (and fast to compute). - return Math.PI*(3*(a+b) - Math.sqrt(10*a*b + 3*(a*a + b*b))); - } - - private static double fprime(double a, double b) { - return Math.PI*(3 - (5*b + 3*a)/Math.sqrt(10*a*b + 3*(a*a + b*b))); - } - - - /* - private static void test(double a, double b, double l) { - double a2 = computeEllipseAxis(b, l); - System.out.println("true a=" + a + " l=" + l + " estimated a=" + a2 + " l(from true a)=" + f(a,b)); - } - - private static void test(double b, double l) { - double a2 = computeEllipseAxis(b, l); - System.out.println("true l=" + l + " estimated a=" + a2); - } - - - public static void main(String[] args) { - double b = 4; - test(100, b, 401.3143); - test(7, b, 35.20316); - test(4, b, 25.13274); - test(1, b, 17.15684); - test(0.5, b, 16.37248); - test(0.25, b, 16.11448); - test(0.1, b, 16.02288); - test(0.01, b, 16.00034); - test(0, b, 16); - test(10000, b, 40000.03); - } - */ - - /* - public static void main(String[] args) { - test(222.89291150684895, 2240); - } - */ - -} diff --git a/src2/fr/orsay/lri/varna/models/geom/CubicBezierCurve.java b/src2/fr/orsay/lri/varna/models/geom/CubicBezierCurve.java deleted file mode 100644 index 7ff9aaf..0000000 --- a/src2/fr/orsay/lri/varna/models/geom/CubicBezierCurve.java +++ /dev/null @@ -1,205 +0,0 @@ -package fr.orsay.lri.varna.models.geom; - - -import java.awt.geom.Point2D; - -/** - * This class implements a cubic Bezier curve - * with a constant speed parametrization. - * The Bezier curve is approximated by a sequence of n straight lines, - * where the n+1 points between the lines are - * { B(k/n), k=0,1,...,n } where B is the standard - * parametrization given here: - * http://en.wikipedia.org/wiki/Bezier_curve#Cubic_B.C3.A9zier_curves - * You can then use the constant speed parametrization over this sequence - * of straight lines. - * - * @author Raphael Champeimont - */ -public class CubicBezierCurve { - - /** - * The four points defining the curve. - */ - private Point2D.Double P0, P1, P2, P3; - - - - private int n; - /** - * The number of lines approximating the Bezier curve. - */ - public int getN() { - return n; - } - - - /** - * Get the (exact) length of the approximation curve. - */ - public double getApproxCurveLength() { - return lengths[n-1]; - } - - - - /** - * The n+1 points between the n lines. - */ - private Point2D.Double[] points; - - - - /** - * Array of length n. - * lengths[i] is the sum of lengths of lines up to and including the - * line starting at point points[i]. - */ - private double[] lengths; - - - /** - * Array of length n. - * The vectors along each line, with a norm of 1. - */ - private Point2D.Double[] unitVectors; - - - - /** - * The standard exact cubic Bezier curve parametrization. - * Argument t must be in [0,1]. - */ - public Point2D.Double standardParam(double t) { - double x = Math.pow(1-t,3) * P0.x - + 3 * Math.pow(1-t,2) * t * P1.x - + 3 * (1-t) * t * t * P2.x - + t * t * t * P3.x; - double y = Math.pow(1-t,3) * P0.y - + 3 * Math.pow(1-t,2) * t * P1.y - + 3 * (1-t) * t * t * P2.y - + t * t * t * P3.y; - return new Point2D.Double(x, y); - } - - - - - - /** - * Uniform approximated parameterization. - * A value in t must be in [0, getApproxCurveLength()]. - * We have built a function f such that f(t) is the position of - * the point on the approximation curve (n straight lines). - * The interesting property is that the length of the curve - * { f(t), t in [0,l] } is exactly l. - * The java function is simply the application of f over each element - * of a sorted array, ie. uniformParam(t)[k] = f(t[k]). - * Computation time is O(n+m) where n is the number of lines in which - * the curve is divided and m is the length of the array given as an - * argument. The use of a sorted array instead of m calls to the - * function enables us to have a complexity of O(n+m) instead of O(n*m) - * because we don't need to search in all the n possible lines for - * each value in t (as we know their are in increasing order). - */ - public Point2D.Double[] uniformParam(double[] t) { - int m = t.length; - Point2D.Double[] result = new Point2D.Double[m]; - int line = 0; - for (int i=0; i= n) { - // In theory should not happen, but float computation != math. - line = n-1; - } - if (t[i] < 0) { - throw (new IllegalArgumentException("t[" + i + "] < 0")); - } - // So now we know on which line we are - double lengthOnLine = t[i] - (line != 0 ? lengths[line-1] : 0); - double x = points[line].x + unitVectors[line].x * lengthOnLine; - double y = points[line].y + unitVectors[line].y * lengthOnLine; - result[i] = new Point2D.Double(x, y); - } - return result; - } - - - - /** - * A Bezier curve can be defined by four points, - * see http://en.wikipedia.org/wiki/Bezier_curve#Cubic_B.C3.A9zier_curves - * Here we give this four points and a integer to say in how many - * line segments we want to cut the Bezier curve (if n is bigger - * the computation takes longer but the precision is better). - * The number of lines must be at least 1. - */ - public CubicBezierCurve( - Point2D.Double P0, - Point2D.Double P1, - Point2D.Double P2, - Point2D.Double P3, - int n) { - this.P0 = P0; - this.P1 = P1; - this.P2 = P2; - this.P3 = P3; - this.n = n; - if (n < 1) { - throw (new IllegalArgumentException("n must be at least 1")); - } - computeData(); - } - - - private void computeData() { - points = new Point2D.Double[n+1]; - for (int k=0; k<=n; k++) { - points[k] = standardParam(((double) k) / n); - } - - lengths = new double[n]; - unitVectors = new Point2D.Double[n]; - double sum = 0; - for (int i=0; i= n) { - // In theory should not happen, but float computation != math. - line = n-1; - } - if (t[i] < 0) { - throw (new IllegalArgumentException("t[" + i + "] < 0")); - } - // So now we know on which line we are - double lengthOnLine = t[i] - (line != 0 ? lengths[line-1] : 0); - double x = points[line].x + unitVectors[line].x * lengthOnLine; - double y = points[line].y + unitVectors[line].y * lengthOnLine; - result[i] = new Point2D.Double(x, y); - } - return result; - } - - - - /** - * An ellipse that has axis equal to X and Y axis needs only - * two numbers (half-axis lengths) to be defined. - * They are resp. a for X axis and b for Y axis. - * n = how many line segments we want to cut the curve - * (if n is bigger the computation takes longer but the precision is better). - * The number of lines must be at least 1. - */ - public HalfEllipse(double a, double b, int n) { - this.a = a; - this.b = b; - this.n = n; - if (n < 1) { - throw (new IllegalArgumentException("n must be at least 1")); - } - computeData(); - } - - - /** - * Returns that affine transform that moves the ellipse - * given by this class such that its 0/pi axis matches P0-P1. - */ - public static AffineTransform matchAxisA(Point2D.Double P0, Point2D.Double P1) { - double theta = MiscGeom.angleFromVector(P0.x-P1.x, P0.y-P1.y); - Point2D.Double mid = new Point2D.Double((P0.x+P1.x)/2, (P0.y+P1.y)/2); - AffineTransform transform = new AffineTransform(); - transform.translate(mid.x, mid.y); - transform.rotate(theta); - return transform; - } - - - private void computeData() { - points = new Point2D.Double[n+1]; - for (int k=0; k<=n; k++) { - points[k] = standardParam(((double) k) / n); - } - - lengths = new double[n]; - unitVectors = new Point2D.Double[n]; - double sum = 0; - for (int i=0; i= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0); - } - - /** - * Returns whether segment from p1 to p2 intersects segment from p3 to p4. - */ - public static boolean linesIntersect( - Point2D.Double p1, - Point2D.Double p2, - Point2D.Double p3, - Point2D.Double p4) { - return linesIntersect(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y); - } - - /** - * Returns whether the two segment intersect. - */ - public static boolean linesIntersect(Line2D.Double line1, Line2D.Double line2) { - return linesIntersect( - line1.x1, line1.y1, line1.x2, line1.y2, - line2.x1, line2.y1, line2.x2, line2.y2); - } - - - private static void test( - double x1, - double y1, - double x2, - double y2, - double x3, - double y3, - double x4, - double y4, - boolean expectedResult) { - boolean a = linesIntersect(x1, y1, x2, y2, x3, y3, x4, y4); - boolean b = Line2D.Double.linesIntersect(x1, y1, x2, y2, x3, y3, x4, y4); - System.out.println("ours says " + a + " which is " + (a == expectedResult ? "correct" : "INCORRECT") + - " / Line2D.Double says " + b + " which is " + (b == expectedResult ? "correct" : "INCORRECT")); - } - - public static void main(String[] args) { - test(179.2690296114372, 1527.2309703885628, 150.9847583639753, 1498.946699141101, 94.4162158690515, 1442.378156646177, 66.1319446215896, 1414.0938853987152, false); - test(0, 0, 0, 0, 1, 1, 1, 1, false); - test(0, 0, 0.5, 0.5, 1, 1, 2, 2, false); - test(0, 0, 2, 2, 0, 2, 2, 0, true); - test(0, 0, 2, 2, 4, 0, 3, 2, false); - } -} diff --git a/src2/fr/orsay/lri/varna/models/geom/MiscGeom.java b/src2/fr/orsay/lri/varna/models/geom/MiscGeom.java deleted file mode 100644 index ce3bc7d..0000000 --- a/src2/fr/orsay/lri/varna/models/geom/MiscGeom.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.models.geom; - -import java.awt.geom.Point2D; - - -/** - * @author Raphael Champeimont - * Misc geometry functions. - */ -public class MiscGeom { - - /** - * Compute the angle made by a vector. - */ - public static double angleFromVector(Point2D.Double v) { - return MiscGeom.angleFromVector(v.x, v.y); - } - - public static double angleFromVector(double x, double y) { - double l = Math.hypot(x, y); - if (y > 0) { - return Math.acos(x / l); - } else if (y < 0) { - return - Math.acos(x / l); - } else { - return x > 0 ? 0 : Math.PI; - } - } - -} diff --git a/src2/fr/orsay/lri/varna/models/naView/Base.java b/src2/fr/orsay/lri/varna/models/naView/Base.java deleted file mode 100644 index bb8e0f8..0000000 --- a/src2/fr/orsay/lri/varna/models/naView/Base.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - 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.models.naView; - -public class Base { - private int mate; - private double x, y; - private boolean extracted; - private Region region = new Region(); - - public int getMate() { - return mate; - } - - public void setMate(int mate) { - this.mate = mate; - } - - public double getX() { - return x; - } - - public void setX(double x) { - //System.out.println(" Base.setX()"); - this.x = x; - } - - public double getY() { - return y; - } - - public void setY(double y) { - this.y = y; - } - - public boolean isExtracted() { - return extracted; - } - - public void setExtracted(boolean extracted) { - this.extracted = extracted; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } -} diff --git a/src2/fr/orsay/lri/varna/models/naView/Connection.java b/src2/fr/orsay/lri/varna/models/naView/Connection.java deleted file mode 100644 index bca820b..0000000 --- a/src2/fr/orsay/lri/varna/models/naView/Connection.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - 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.models.naView; - -public class Connection { - private Loop loop = new Loop(); - private Region region = new Region(); - // Start and end form the 1st base pair of the region. - private int start, end; - private double xrad, yrad, angle; - // True if segment between this connection and the - // next must be extruded out of the circle - private boolean extruded; - // True if the extruded segment must be drawn long. - private boolean broken; - - private boolean _isNull=false; - - public boolean isNull() { - return _isNull; - } - - public void setNull(boolean isNull) { - _isNull = isNull; - } - - - public Loop getLoop() { - return loop; - } - - public void setLoop(Loop loop) { - this.loop = loop; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public int getStart() { - return start; - } - - public void setStart(int start) { - this.start = start; - } - - public int getEnd() { - return end; - } - - public void setEnd(int end) { - this.end = end; - } - - public double getXrad() { - return xrad; - } - - public void setXrad(double xrad) { - this.xrad = xrad; - } - - public double getYrad() { - return yrad; - } - - public void setYrad(double yrad) { - this.yrad = yrad; - } - - public double getAngle() { - return angle; - } - - public void setAngle(double angle) { - this.angle = angle; - } - - public boolean isExtruded() { - return extruded; - } - - public void setExtruded(boolean extruded) { - this.extruded = extruded; - } - - public boolean isBroken() { - return broken; - } - - public void setBroken(boolean broken) { - this.broken = broken; - } -} diff --git a/src2/fr/orsay/lri/varna/models/naView/Loop.java b/src2/fr/orsay/lri/varna/models/naView/Loop.java deleted file mode 100644 index ae08bbd..0000000 --- a/src2/fr/orsay/lri/varna/models/naView/Loop.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - 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.models.naView; - -import java.util.ArrayList; -import java.util.Hashtable; - -public class Loop { - private int nconnection; - private ArrayList connections = new ArrayList(); - private Hashtable _connections = new Hashtable(); - private int number; - private int depth; - private boolean mark; - private double x, y, radius; - - public int getNconnection() { - return nconnection; - } - - public void setNconnection(int nconnection) { - this.nconnection = nconnection; - } - - public void setConnection(int i, Connection c) - { - Integer n = new Integer(i); - if (c != null) - _connections.put(n, c); - else - { - if (!_connections.containsKey(n)) - { - _connections.put(n, new Connection()); - } - _connections.get(i).setNull(true); - } - } - - public Connection getConnection(int i) - { - Integer n = new Integer(i); - if (!_connections.containsKey(n)) - { _connections.put(n, new Connection()); } - Connection c = _connections.get(n); - if (c.isNull()) - return null; - else - return c; - } - - public void addConnection(int i, Connection c) - { - _connections.put(_connections.size(),c); - } - - - public int getNumber() { - return number; - } - - public void setNumber(int number) { - this.number = number; - } - - public int getDepth() { - return depth; - } - - public void setDepth(int depth) { - this.depth = depth; - } - - public boolean isMark() { - return mark; - } - - public void setMark(boolean mark) { - this.mark = mark; - } - - public double getX() { - return x; - } - - public void setX(double x) { - this.x = x; - } - - public double getY() { - return y; - } - - public void setY(double y) { - this.y = y; - } - - public double getRadius() { - return radius; - } - - public void setRadius(double radius) { - this.radius = radius; - } - - public String toString() - { - String result = "Loop:"; - result += " nconnection "+nconnection; - result += " depth "+depth; - return result; - } -} diff --git a/src2/fr/orsay/lri/varna/models/naView/NAView.java b/src2/fr/orsay/lri/varna/models/naView/NAView.java deleted file mode 100644 index 5b7d023..0000000 --- a/src2/fr/orsay/lri/varna/models/naView/NAView.java +++ /dev/null @@ -1,1302 +0,0 @@ -/* - 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.models.naView; - - -import java.util.ArrayList; - -import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm; -import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener; -import fr.orsay.lri.varna.interfaces.InterfaceVARNAObservable; - -public class NAView { - private final double ANUM = 9999.0; - private final int MAXITER = 500; - - private ArrayList bases; - private int nbase, nregion, loop_count; - - private Loop root = new Loop(); - private ArrayList loops; - - private ArrayList regions; - - private Radloop rlphead = new Radloop(); - - private double lencut=0.8; - private final double RADIUS_REDUCTION_FACTOR = 1.4; - - // show algorithm step by step - private boolean debug = false; - - private double angleinc; - - private double _h; - - private ArrayList _listeVARNAListener = new ArrayList(); - - private boolean noIterationFailureYet = true; - - double HELIX_FACTOR = 0.6; - double BACKBONE_DISTANCE = 27; - - public int naview_xy_coordinates(ArrayList pair_table2, - ArrayList x, ArrayList y) - throws ExceptionNAViewAlgorithm { - if (debug) - System.out.println("naview_xy_coordinates"); - if (pair_table2.size() == 0) - return 0; - int i; - ArrayList pair_table = new ArrayList(pair_table2 - .size() + 1); - pair_table.add(pair_table2.size()); - - for (int j = 0; j < pair_table2.size(); j++) { - pair_table.add(pair_table2.get(j) + 1); - } - - if (debug) { - infoStructure(pair_table); - } - // length - nbase = pair_table.get(0); - bases = new ArrayList(nbase + 1); - - for (int index = 0; index < bases.size(); index++) { - bases.add(new Base()); - } - - regions = new ArrayList(); - for (int index = 0; index < nbase + 1; index++) { - regions.add(new Region()); - } - - read_in_bases(pair_table); - - if (debug) - infoBasesMate(); - - rlphead = null; - - find_regions(); - - if (debug) - infoRegions(); - - loop_count = 0; - loops = new ArrayList(nbase + 1); - for (int index = 0; index < nbase + 1; index++) { - loops.add(new Loop()); - } - - construct_loop(0); - - if (debug) - infoBasesExtracted(); - - find_central_loop(); - - if (debug) - infoRoot(); - - if (debug) - dump_loops(); - - traverse_loop(root, null); - - for (i = 0; i < nbase; i++) { - x.add(100 + BACKBONE_DISTANCE * bases.get(i + 1).getX()); - y.add(100 + BACKBONE_DISTANCE * bases.get(i + 1).getY()); - } - - return nbase; - } - - private void infoStructure(ArrayList pair_table) { - System.out.println("structure:"); - for (int j = 0; j < pair_table.size(); j++) { - System.out.print("#" + j + ":" + pair_table.get(j) + "\t"); - if (j % 10 == 0) - System.out.println(); - } - System.out.println(); - } - - private void infoBasesMate() { - System.out.println("Bases mate:"); - for (int index = 0; index < bases.size(); index++) { - System.out.print("#" + index + ":" + bases.get(index).getMate() - + "\t"); - if (index % 10 == 0) - System.out.println(); - } - System.out.println(); - } - - private void infoRegions() { - System.out.println("regions:"); - for (int index = 0; index < regions.size(); index++) { - System.out.print("(" + regions.get(index).getStart1() + "," - + regions.get(index).getStart2() + ";" - + regions.get(index).getEnd1() + "," - + regions.get(index).getEnd2() + ")\t\t"); - if (index % 5 == 0) - System.out.println(); - } - System.out.println(); - } - - private void infoBasesExtracted() { - System.out.println("Bases extracted:"); - for (int index = 0; index < bases.size(); index++) { - System.out.print("i=" + index + ":" - + bases.get(index).isExtracted() + "\t"); - if (index % 5 == 0) - System.out.println(); - } - System.out.println(); - } - - private void infoRoot() { - System.out.println("root" + root.getNconnection() + ";" - + root.getNumber()); - System.out.println("\troot : "); - System.out.println("\tdepth=" + root.getDepth()); - System.out.println("\tmark=" + root.isMark()); - System.out.println("\tnumber=" + root.getNumber()); - System.out.println("\tradius=" + root.getRadius()); - System.out.println("\tx=" + root.getX()); - System.out.println("\ty=" + root.getY()); - System.out.println("\tnconnection=" + root.getNconnection()); - } - - private void read_in_bases(ArrayList pair_table) { - if (debug) - System.out.println("read_in_bases"); - - int i, npairs; - - // Set up an origin. - bases.add(new Base()); - bases.get(0).setMate(0); - bases.get(0).setExtracted(false); - bases.get(0).setX(ANUM); - bases.get(0).setY(ANUM); - - for (npairs = 0, i = 1; i <= nbase; i++) { - bases.add(new Base()); - bases.get(i).setExtracted(false); - bases.get(i).setX(ANUM); - bases.get(i).setY(ANUM); - bases.get(i).setMate(pair_table.get(i)); - if ((int) pair_table.get(i) > i) - npairs++; - } - // must have at least 1 pair to avoid segfault - if (npairs == 0) { - bases.get(1).setMate(nbase); - bases.get(nbase).setMate(1); - } - } - - /** - * Identifies the regions in the structure. - */ - private void find_regions() - - { - if (debug) - System.out.println("find_regions"); - int i, mate, nb1; - nb1 = nbase + 1; - ArrayList mark = new ArrayList(nb1); - for (i = 0; i < nb1; i++) - mark.add(false); - nregion = 0; - for (i = 0; i <= nbase; i++) { - if ((mate = bases.get(i).getMate()) != 0 && !mark.get(i)) { - regions.get(nregion).setStart1(i); - regions.get(nregion).setEnd2(mate); - mark.set(i, true); - mark.set(mate, true); - bases.get(i).setRegion(regions.get(nregion)); - bases.get(mate).setRegion(regions.get(nregion)); - for (i++, mate--; i < mate && bases.get(i).getMate() == mate; i++, mate--) { - mark.set(mate, true); - mark.set(i, true); - bases.get(i).setRegion(regions.get(nregion)); - bases.get(mate).setRegion(regions.get(nregion)); - } - regions.get(nregion).setEnd1(--i); - regions.get(nregion).setStart2(mate + 1); - if (debug) { - if (nregion == 0) - System.out.printf("\nRegions are:\n"); - System.out.printf( - "Region %d is %d-%d and %d-%d with gap of %d.\n", - nregion + 1, regions.get(nregion).getStart1(), - regions.get(nregion).getEnd1(), regions - .get(nregion).getStart2(), regions.get( - nregion).getEnd2(), regions.get(nregion) - .getStart2() - - regions.get(nregion).getEnd1() + 1); - } - nregion++; - } - } - } - - /** - * Starting at residue ibase, recursively constructs the loop containing - * said base and all deeper bases. - * - * @throws ExceptionNAViewAlgorithm - */ - private Loop construct_loop(int ibase) throws ExceptionNAViewAlgorithm { - if (debug) - System.out.println("construct_loop"); - int i, mate; - Loop retloop = new Loop(), lp = new Loop(); - Connection cp = new Connection(); - Region rp = new Region(); - Radloop rlp = new Radloop(); - retloop = loops.get(loop_count++); - retloop.setNconnection(0); - //System.out.println(""+ibase+" "+nbase); - //ArrayList a = new ArrayList(nbase + 1); - //retloop.setConnections(a); -// for (int index = 0; index < nbase + 1; index++) -// retloop.getConnections().add(new Connection()); - //for (int index = 0; index < nbase + 1; index++) - // retloop.addConnection(index,new Connection()); - retloop.setDepth(0); - retloop.setNumber(loop_count); - retloop.setRadius(0.0); - for (rlp = rlphead; rlp != null; rlp = rlp.getNext()) - if (rlp.getLoopnumber() == loop_count) - retloop.setRadius(rlp.getRadius()); - i = ibase; - do { - if ((mate = bases.get(i).getMate()) != 0) { - rp = bases.get(i).getRegion(); - if (!bases.get(rp.getStart1()).isExtracted()) { - if (i == rp.getStart1()) { - bases.get(rp.getStart1()).setExtracted(true); - bases.get(rp.getEnd1()).setExtracted(true); - bases.get(rp.getStart2()).setExtracted(true); - bases.get(rp.getEnd2()).setExtracted(true); - lp = construct_loop(rp.getEnd1() < nbase ? rp.getEnd1() + 1 - : 0); - } else if (i == rp.getStart2()) { - bases.get(rp.getStart2()).setExtracted(true); - bases.get(rp.getEnd2()).setExtracted(true); - bases.get(rp.getStart1()).setExtracted(true); - bases.get(rp.getEnd1()).setExtracted(true); - lp = construct_loop(rp.getEnd2() < nbase ? rp.getEnd2() + 1 - : 0); - } else { - throw new ExceptionNAViewAlgorithm( - "naview:Error detected in construct_loop. i = " - + i + " not found in region table.\n"); - } - retloop.setNconnection(retloop.getNconnection() + 1); - cp = new Connection(); - retloop.setConnection(retloop.getNconnection() - 1, cp); - retloop.setConnection(retloop.getNconnection(), null); - cp.setLoop(lp); - cp.setRegion(rp); - if (i == rp.getStart1()) { - cp.setStart(rp.getStart1()); - cp.setEnd(rp.getEnd2()); - } else { - cp.setStart(rp.getStart2()); - cp.setEnd(rp.getEnd1()); - } - cp.setExtruded(false); - cp.setBroken(false); - lp.setNconnection(lp.getNconnection() + 1); - cp = new Connection(); - lp.setConnection(lp.getNconnection() - 1, cp); - lp.setConnection(lp.getNconnection(), null); - cp.setLoop(retloop); - cp.setRegion(rp); - if (i == rp.getStart1()) { - cp.setStart(rp.getStart2()); - cp.setEnd(rp.getEnd1()); - } else { - cp.setStart(rp.getStart1()); - cp.setEnd(rp.getEnd2()); - } - cp.setExtruded(false); - cp.setBroken(false); - } - i = mate; - } - if (++i > nbase) - i = 0; - } while (i != ibase); - return retloop; - } - - /** - * Displays all the loops. - */ - private void dump_loops() { - System.out.println("dump_loops"); - int il, ilp, irp; - Loop lp; - Connection cp; - - System.out.printf("\nRoot loop is #%d\n", loops.indexOf(root) + 1); - for (il = 0; il < loop_count; il++) { - lp = loops.get(il); - System.out.printf("Loop %d has %d connections:\n", il + 1, lp - .getNconnection()); - for (int i = 0; (cp = lp.getConnection(i)) != null; i++) { - ilp = (loops.indexOf(cp.getLoop())) + 1; - irp = (regions.indexOf(cp.getRegion())) + 1; - System.out.printf(" Loop %d Region %d (%d-%d)\n", ilp, irp, cp - .getStart(), cp.getEnd()); - } - } - } - - /** - * Find node of greatest branching that is deepest. - */ - private void find_central_loop() { - if (debug) - System.out.println("find_central_loop"); - Loop lp = new Loop(); - int maxconn, maxdepth, i; - - determine_depths(); - maxconn = 0; - maxdepth = -1; - for (i = 0; i < loop_count; i++) { - lp = loops.get(i); - if (lp.getNconnection() > maxconn) { - maxdepth = lp.getDepth(); - maxconn = lp.getNconnection(); - root = lp; - } else if (lp.getDepth() > maxdepth - && lp.getNconnection() == maxconn) { - maxdepth = lp.getDepth(); - root = lp; - } - } - } - - /** - * Determine the depth of all loops. - */ - private void determine_depths() { - if (debug) - System.out.println("determine_depths"); - Loop lp = new Loop(); - int i, j; - - for (i = 0; i < loop_count; i++) { - lp = loops.get(i); - for (j = 0; j < loop_count; j++) - loops.get(j).setMark(false); - lp.setDepth(depth(lp)); - } - } - - /** - * Determines the depth of loop, lp. Depth is defined as the minimum - * distance to a leaf loop where a leaf loop is one that has only one or no - * connections. - */ - private int depth(Loop lp) { - if (debug) - System.out.println("depth"); - int count, ret, d; - - if (lp.getNconnection() <= 1) - return 0; - if (lp.isMark()) - return -1; - lp.setMark(true); - count = 0; - ret = 0; - for (int i = 0; lp.getConnection(i) != null; i++) { - d = depth(lp.getConnection(i).getLoop()); - if (d >= 0) { - if (++count == 1) - ret = d; - else if (ret > d) - ret = d; - } - } - lp.setMark(false); - return ret + 1; - } - - /** - * This is the workhorse of the display program. The algorithm is recursive - * based on processing individual loops. Each base pairing region is - * displayed using the direction given by the circle diagram, and the - * connections between the regions is drawn by equally spaced points. The - * radius of the loop is set to minimize the square error for lengths - * between sequential bases in the loops. The "correct" length for base - * links is 1. If the least squares fitting of the radius results in loops - * being less than 1/2 unit apart, then that segment is extruded. - * - * The variable, anchor_connection, gives the connection to the loop - * processed in an previous level of recursion. - * - * @throws ExceptionNAViewAlgorithm - */ - private void traverse_loop(Loop lp, Connection anchor_connection) - throws ExceptionNAViewAlgorithm { - if (debug) - System.out.println(" traverse_loop"); - double xs, ys, xe, ye, xn, yn, angleinc, r; - double radius, xc, yc, xo, yo, astart, aend, a; - Connection cp, cpnext, acp, cpprev; - int i, j, n, ic; - double da, maxang; - int count, icstart, icend, icmiddle, icroot; - boolean done, done_all_connections, rooted; - int sign; - double midx, midy, nrx, nry, mx, my, vx, vy, dotmv, nmidx, nmidy; - int icstart1, icup, icdown, icnext, direction; - double dan, dx, dy, rr; - double cpx, cpy, cpnextx, cpnexty, cnx, cny, rcn, rc, lnx, lny, rl, ac, acn, sx, sy, dcp; - int imaxloop = 0; - - angleinc = 2 * Math.PI / (nbase + 1); - acp = null; - icroot = -1; - int indice = 0; - - for (ic = 0; (cp = lp.getConnection(indice)) != null; indice++, ic++) { - // xs = cos(angleinc*cp.setStart(); ys = sin(angleinc*cp.setStart(); - // xe = - // cos(angleinc*cp.setEnd()); ye = sin(angleinc*cp.setEnd()); - xs = -Math.sin(angleinc * cp.getStart()); - ys = Math.cos(angleinc * cp.getStart()); - xe = -Math.sin(angleinc * cp.getEnd()); - ye = Math.cos(angleinc * cp.getEnd()); - xn = ye - ys; - yn = xs - xe; - r = Math.sqrt(xn * xn + yn * yn); - cp.setXrad(xn / r); - cp.setYrad(yn / r); - cp.setAngle(Math.atan2(yn, xn)); - if (cp.getAngle() < 0.0) - cp.setAngle(cp.getAngle() + 2 * Math.PI); - if (anchor_connection != null - && anchor_connection.getRegion() == cp.getRegion()) { - acp = cp; - icroot = ic; - } - } - // remplacement d'une etiquette de goto - set_radius: while (true) { - determine_radius(lp, lencut); - radius = lp.getRadius()/RADIUS_REDUCTION_FACTOR; - if (anchor_connection == null) - xc = yc = 0.0; - else { - xo = (bases.get(acp.getStart()).getX() + bases - .get(acp.getEnd()).getX()) / 2.0; - yo = (bases.get(acp.getStart()).getY() + bases - .get(acp.getEnd()).getY()) / 2.0; - xc = xo - radius * acp.getXrad(); - yc = yo - radius * acp.getYrad(); - } - - // The construction of the connectors will proceed in blocks of - // connected connectors, where a connected connector pairs means two - // connectors that are forced out of the drawn circle because they - // are too close together in angle. - - // First, find the start of a block of connected connectors - - if (icroot == -1) - icstart = 0; - else - icstart = icroot; - cp = lp.getConnection(icstart); - count = 0; - if (debug) - { - System.out.printf("Now processing loop %d\n", lp.getNumber()); - System.out.println(" "+lp); - } - done = false; - do { - j = icstart - 1; - if (j < 0) - j = lp.getNconnection() - 1; - cpprev = lp.getConnection(j); - if (!connected_connection(cpprev, cp)) { - done = true; - } else { - icstart = j; - cp = cpprev; - } - if (++count > lp.getNconnection()) { - // Here everything is connected. Break on maximum angular - // separation between connections. - - maxang = -1.0; - for (ic = 0; ic < lp.getNconnection(); ic++) { - j = ic + 1; - if (j >= lp.getNconnection()) - j = 0; - cp = lp.getConnection(ic); - cpnext = lp.getConnection(j); - ac = cpnext.getAngle() - cp.getAngle(); - if (ac < 0.0) - ac += 2 * Math.PI; - if (ac > maxang) { - maxang = ac; - imaxloop = ic; - } - } - icend = imaxloop; - icstart = imaxloop + 1; - if (icstart >= lp.getNconnection()) - icstart = 0; - cp = lp.getConnection(icend); - cp.setBroken(true); - done = true; - } - } while (!done); - done_all_connections = false; - icstart1 = icstart; - if (debug) - System.out.printf(" Icstart1 = %d\n", icstart1); - while (!done_all_connections) { - count = 0; - done = false; - icend = icstart; - rooted = false; - while (!done) { - cp = lp.getConnection(icend); - if (icend == icroot) - rooted = true; - j = icend + 1; - if (j >= lp.getNconnection()) { - j = 0; - } - cpnext = lp.getConnection(j); - if (connected_connection(cp, cpnext)) { - if (++count >= lp.getNconnection()) - break; - icend = j; - } else { - done = true; - } - } - icmiddle = find_ic_middle(icstart, icend, anchor_connection, - acp, lp); - ic = icup = icdown = icmiddle; - if (debug) - System.out.printf(" IC start = %d middle = %d end = %d\n", - icstart, icmiddle, icend); - done = false; - direction = 0; - while (!done) { - if (direction < 0) { - ic = icup; - } else if (direction == 0) { - ic = icmiddle; - } else { - ic = icdown; - } - if (ic >= 0) { - cp = lp.getConnection(ic); - if (anchor_connection == null || acp != cp) { - if (direction == 0) { - astart = cp.getAngle() - - Math.asin(1.0 / 2.0 / radius); - aend = cp.getAngle() - + Math.asin(1.0 / 2.0 / radius); - bases.get(cp.getStart()).setX( - xc + radius * Math.cos(astart)); - bases.get(cp.getStart()).setY( - yc + radius * Math.sin(astart)); - bases.get(cp.getEnd()).setX( - xc + radius * Math.cos(aend)); - bases.get(cp.getEnd()).setY( - yc + radius * Math.sin(aend)); - } else if (direction < 0) { - j = ic + 1; - if (j >= lp.getNconnection()) - j = 0; - cp = lp.getConnection(ic); - cpnext = lp.getConnection(j); - cpx = cp.getXrad(); - cpy = cp.getYrad(); - ac = (cp.getAngle() + cpnext.getAngle()) / 2.0; - if (cp.getAngle() > cpnext.getAngle()) - ac -= Math.PI; - cnx = Math.cos(ac); - cny = Math.sin(ac); - lnx = cny; - lny = -cnx; - da = cpnext.getAngle() - cp.getAngle(); - if (da < 0.0) - da += 2 * Math.PI; - if (cp.isExtruded()) { - if (da <= Math.PI / 2) - rl = 2.0; - else - rl = 1.5; - } else { - rl = 1.0; - } - bases.get(cp.getEnd()).setX( - bases.get(cpnext.getStart()).getX() - + rl * lnx); - bases.get(cp.getEnd()).setY( - bases.get(cpnext.getStart()).getY() - + rl * lny); - bases.get(cp.getStart()).setX( - bases.get(cp.getEnd()).getX() + cpy); - bases.get(cp.getStart()).setY( - bases.get(cp.getEnd()).getY() - cpx); - } else { - j = ic - 1; - if (j < 0) - j = lp.getNconnection() - 1; - cp = lp.getConnection(j); - cpnext = lp.getConnection(ic); - cpnextx = cpnext.getXrad(); - cpnexty = cpnext.getYrad(); - ac = (cp.getAngle() + cpnext.getAngle()) / 2.0; - if (cp.getAngle() > cpnext.getAngle()) - ac -= Math.PI; - cnx = Math.cos(ac); - cny = Math.sin(ac); - lnx = -cny; - lny = cnx; - da = cpnext.getAngle() - cp.getAngle(); - if (da < 0.0) - da += 2 * Math.PI; - if (cp.isExtruded()) { - if (da <= Math.PI / 2) - rl = 2.0; - else - rl = 1.5; - } else { - rl = 1.0; - } - bases.get(cpnext.getStart()).setX( - bases.get(cp.getEnd()).getX() + rl - * lnx); - bases.get(cpnext.getStart()).setY( - bases.get(cp.getEnd()).getY() + rl - * lny); - bases.get(cpnext.getEnd()).setX( - bases.get(cpnext.getStart()).getX() - - cpnexty); - bases.get(cpnext.getEnd()).setY( - bases.get(cpnext.getStart()).getY() - + cpnextx); - } - } - } - if (direction < 0) { - if (icdown == icend) { - icdown = -1; - } else if (icdown >= 0) { - if (++icdown >= lp.getNconnection()) { - icdown = 0; - } - } - direction = 1; - } else { - if (icup == icstart) - icup = -1; - else if (icup >= 0) { - if (--icup < 0) { - icup = lp.getNconnection() - 1; - } - } - direction = -1; - } - done = icup == -1 && icdown == -1; - } - icnext = icend + 1; - if (icnext >= lp.getNconnection()) - icnext = 0; - if (icend != icstart - && (!(icstart == icstart1 && icnext == icstart1))) { - - // Move the bases just constructed (or the radius) so that - // the bisector of the end points is radius distance away - // from the loop center. - - cp = lp.getConnection(icstart); - cpnext = lp.getConnection(icend); - dx = bases.get(cpnext.getEnd()).getX() - - bases.get(cp.getStart()).getX(); - dy = bases.get(cpnext.getEnd()).getY() - - bases.get(cp.getStart()).getY(); - midx = bases.get(cp.getStart()).getX() + dx / 2.0; - midy = bases.get(cp.getStart()).getY() + dy / 2.0; - rr = Math.sqrt(dx * dx + dy * dy); - mx = dx / rr; - my = dy / rr; - vx = xc - midx; - vy = yc - midy; - rr = Math.sqrt(dx * dx + dy * dy); - vx /= rr; - vy /= rr; - dotmv = vx * mx + vy * my; - nrx = dotmv * mx - vx; - nry = dotmv * my - vy; - rr = Math.sqrt(nrx * nrx + nry * nry); - nrx /= rr; - nry /= rr; - - // Determine which side of the bisector the center should - // be. - - dx = bases.get(cp.getStart()).getX() - xc; - dy = bases.get(cp.getStart()).getY() - yc; - ac = Math.atan2(dy, dx); - if (ac < 0.0) - ac += 2 * Math.PI; - dx = bases.get(cpnext.getEnd()).getX() - xc; - dy = bases.get(cpnext.getEnd()).getY() - yc; - acn = Math.atan2(dy, dx); - if (acn < 0.0) - acn += 2 * Math.PI; - if (acn < ac) - acn += 2 * Math.PI; - if (acn - ac > Math.PI) - sign = -1; - else - sign = 1; - nmidx = xc + sign * radius * nrx; - nmidy = yc + sign * radius * nry; - if (rooted) { - xc -= nmidx - midx; - yc -= nmidy - midy; - } else { - for (ic = icstart;;) { - cp = lp.getConnection(ic); - i = cp.getStart(); - bases.get(i).setX( - bases.get(i).getX() + nmidx - midx); - bases.get(i).setY( - bases.get(i).getY() + nmidy - midy); - i = cp.getEnd(); - bases.get(i).setX( - bases.get(i).getX() + nmidx - midx); - bases.get(i).setY( - bases.get(i).getY() + nmidy - midy); - if (ic == icend) - break; - if (++ic >= lp.getNconnection()) - ic = 0; - } - } - } - icstart = icnext; - done_all_connections = icstart == icstart1; - } - for (ic = 0; ic < lp.getNconnection(); ic++) { - cp = lp.getConnection(ic); - j = ic + 1; - if (j >= lp.getNconnection()) - j = 0; - cpnext = lp.getConnection(j); - dx = bases.get(cp.getEnd()).getX() - xc; - dy = bases.get(cp.getEnd()).getY() - yc; - rc = Math.sqrt(dx * dx + dy * dy); - ac = Math.atan2(dy, dx); - if (ac < 0.0) - ac += 2 * Math.PI; - dx = bases.get(cpnext.getStart()).getX() - xc; - dy = bases.get(cpnext.getStart()).getY() - yc; - rcn = Math.sqrt(dx * dx + dy * dy); - acn = Math.atan2(dy, dx); - if (acn < 0.0) - acn += 2 * Math.PI; - if (acn < ac) - acn += 2 * Math.PI; - dan = acn - ac; - dcp = cpnext.getAngle() - cp.getAngle(); - if (dcp <= 0.0) - dcp += 2 * Math.PI; - if (Math.abs(dan - dcp) > Math.PI) { - if (cp.isExtruded()) { - warningEmition("Warning from traverse_loop. Loop " - + lp.getNumber() + " has crossed regions\n"); - } else if ((cpnext.getStart() - cp.getEnd()) != 1) { - cp.setExtruded(true); - continue set_radius; // remplacement du goto - } - } - if (cp.isExtruded()) { - construct_extruded_segment(cp, cpnext); - } else { - n = cpnext.getStart() - cp.getEnd(); - if (n < 0) - n += nbase + 1; - angleinc = dan / n; - for (j = 1; j < n; j++) { - i = cp.getEnd() + j; - if (i > nbase) - i -= nbase + 1; - a = ac + j * angleinc; - rr = rc + (rcn - rc) * (a - ac) / dan; - bases.get(i).setX(xc + rr * Math.cos(a)); - bases.get(i).setY(yc + rr * Math.sin(a)); - } - } - } - break; - } - for (ic = 0; ic < lp.getNconnection(); ic++) { - if (icroot != ic) { - cp = lp.getConnection(ic); - generate_region(cp); - traverse_loop(cp.getLoop(), cp); - } - } - n = 0; - sx = 0.0; - sy = 0.0; - for (ic = 0; ic < lp.getNconnection(); ic++) { - j = ic + 1; - if (j >= lp.getNconnection()) - j = 0; - cp = lp.getConnection(ic); - cpnext = lp.getConnection(j); - n += 2; - sx += bases.get(cp.getStart()).getX() - + bases.get(cp.getEnd()).getX(); - sy += bases.get(cp.getStart()).getY() - + bases.get(cp.getEnd()).getY(); - if (!cp.isExtruded()) { - for (j = cp.getEnd() + 1; j != cpnext.getStart(); j++) { - if (j > nbase) - j -= nbase + 1; - n++; - sx += bases.get(j).getX(); - sy += bases.get(j).getY(); - } - } - } - lp.setX(sx / n); - lp.setY(sy / n); - } - - /** - * For the loop pointed to by lp, determine the radius of the loop that will - * ensure that each base around the loop will have a separation of at least - * lencut around the circle. If a segment joining two connectors will not - * support this separation, then the flag, extruded, will be set in the - * first of these two indicators. The radius is set in lp. - * - * The radius is selected by a least squares procedure where the sum of the - * squares of the deviations of length from the ideal value of 1 is used as - * the error function. - */ - private void determine_radius(Loop lp, double lencut) { - if (debug) - System.out.println(" Determine_radius"); - double mindit, ci, dt, sumn, sumd, radius, dit; - int i, j, end, start, imindit = 0; - Connection cp = new Connection(), cpnext = new Connection(); - double rt2_2 = 0.7071068; - - do { - mindit = 1.0e10; - for (sumd = 0.0, sumn = 0.0, i = 0; i < lp.getNconnection(); i++) { - cp = lp.getConnection(i); - j = i + 1; - if (j >= lp.getNconnection()) - j = 0; - cpnext = lp.getConnection(j); - end = cp.getEnd(); - start = cpnext.getStart(); - if (start < end) - start += nbase + 1; - dt = cpnext.getAngle() - cp.getAngle(); - if (dt <= 0.0) - dt += 2 * Math.PI; - if (!cp.isExtruded()) - ci = start - end; - else { - if (dt <= Math.PI / 2) - ci = 2.0; - else - ci = 1.5; - } - sumn += dt * (1.0 / ci + 1.0); - sumd += dt * dt / ci; - dit = dt / ci; - if (dit < mindit && !cp.isExtruded() && ci > 1.0) { - mindit = dit; - imindit = i; - } - } - radius = sumn / sumd; - if (radius < rt2_2) - radius = rt2_2; - if (mindit * radius < lencut) { - lp.getConnection(imindit).setExtruded(true); - } - } while (mindit * radius < lencut); - if (lp.getRadius() > 0.0) - radius = lp.getRadius(); - else - lp.setRadius(radius); - } - - /** - * Determines if the connections cp and cpnext are connected - */ - private boolean connected_connection(Connection cp, Connection cpnext) { - if (debug) - System.out.println(" Connected_connection"); - if (cp.isExtruded()) { - return true; - } else if (cp.getEnd() + 1 == cpnext.getStart()) { - return true; - } else { - return false; - } - } - - /** - * Finds the middle of a set of connected connectors. This is normally the - * middle connection in the sequence except if one of the connections is the - * anchor, in which case that connection will be used. - * - * @throws ExceptionNAViewAlgorithm - */ - private int find_ic_middle(int icstart, int icend, - Connection anchor_connection, Connection acp, Loop lp) - throws ExceptionNAViewAlgorithm { - if (debug) - System.out.println(" Find_ic_middle"); - int count, ret, ic, i; - boolean done; - - count = 0; - ret = -1; - ic = icstart; - done = false; - while (!done) { - if (count++ > lp.getNconnection() * 2) { - throw new ExceptionNAViewAlgorithm( - "Infinite loop detected in find_ic_middle"); - } - if (anchor_connection != null && lp.getConnection(ic) == acp) { - ret = ic; - } - done = ic == icend; - if (++ic >= lp.getNconnection()) { - ic = 0; - } - } - if (ret == -1) { - for (i = 1, ic = icstart; i < (count + 1) / 2; i++) { - if (++ic >= lp.getNconnection()) - ic = 0; - } - ret = ic; - } - return ret; - } - - /** - * Generates the coordinates for the base pairing region of a connection - * given the position of the starting base pair. - * - * @throws ExceptionNAViewAlgorithm - */ - private void generate_region(Connection cp) throws ExceptionNAViewAlgorithm { - if (debug) - System.out.println(" Generate_region"); - int l, start, end, i, mate; - Region rp; - - rp = cp.getRegion(); - l = 0; - if (cp.getStart() == rp.getStart1()) { - start = rp.getStart1(); - end = rp.getEnd1(); - } else { - start = rp.getStart2(); - end = rp.getEnd2(); - } - if (bases.get(cp.getStart()).getX() > ANUM - 100.0 - || bases.get(cp.getEnd()).getX() > ANUM - 100.0) { - throw new ExceptionNAViewAlgorithm( - "Bad region passed to generate_region. Coordinates not defined."); - } - for (i = start + 1; i <= end; i++) { - l++; - bases.get(i).setX( - bases.get(cp.getStart()).getX() + HELIX_FACTOR * l - * cp.getXrad()); - bases.get(i).setY( - bases.get(cp.getStart()).getY() + HELIX_FACTOR * l - * cp.getYrad()); - mate = bases.get(i).getMate(); - bases.get(mate).setX( - bases.get(cp.getEnd()).getX() + HELIX_FACTOR * l - * cp.getXrad()); - bases.get(mate).setY( - bases.get(cp.getEnd()).getY() + HELIX_FACTOR * l - * cp.getYrad()); - - } - } - - /** - * Draws the segment of residue between the bases numbered start through - * end, where start and end are presumed to be part of a base pairing - * region. They are drawn as a circle which has a chord given by the ends of - * two base pairing regions defined by the connections. - * - * @throws ExceptionNAViewAlgorithm - */ - private void construct_circle_segment(int start, int end) - throws ExceptionNAViewAlgorithm { - if (debug) - System.out.println(" Construct_circle_segment"); - double dx, dy, rr, midx, midy, xn, yn, nrx, nry, mx, my, a; - int l, j, i; - - dx = bases.get(end).getX() - bases.get(start).getX(); - dy = bases.get(end).getY() - bases.get(start).getY(); - rr = Math.sqrt(dx * dx + dy * dy); - l = end - start; - if (l < 0) - l += nbase + 1; - if (rr >= l) { - dx /= rr; - dy /= rr; - for (j = 1; j < l; j++) { - i = start + j; - if (i > nbase) - i -= nbase + 1; - bases.get(i).setX( - bases.get(start).getX() + dx * (double) j / (double) l); - bases.get(i).setY( - bases.get(start).getY() + dy * (double) j / (double) l); - } - } else { - find_center_for_arc((l - 1), rr); - dx /= rr; - dy /= rr; - midx = bases.get(start).getX() + dx * rr / 2.0; - midy = bases.get(start).getY() + dy * rr / 2.0; - xn = dy; - yn = -dx; - nrx = midx + _h * xn; - nry = midy + _h * yn; - mx = bases.get(start).getX() - nrx; - my = bases.get(start).getY() - nry; - rr = Math.sqrt(mx * mx + my * my); - a = Math.atan2(my, mx); - for (j = 1; j < l; j++) { - i = start + j; - if (i > nbase) - i -= nbase + 1; - bases.get(i).setX(nrx + rr * Math.cos(a + j * angleinc)); - bases.get(i).setY(nry + rr * Math.sin(a + j * angleinc)); - } - } - } - - /** - * Constructs the segment between cp and cpnext as a circle if possible. - * However, if the segment is too large, the lines are drawn between the two - * connecting regions, and bases are placed there until the connecting - * circle will fit. - * - * @throws ExceptionNAViewAlgorithm - */ - private void construct_extruded_segment(Connection cp, Connection cpnext) - throws ExceptionNAViewAlgorithm { - if (debug) - System.out.println(" Construct_extruded_segment"); - double astart, aend1, aend2, aave, dx, dy, a1, a2, ac, rr, da, dac; - int start, end, n, nstart, nend; - boolean collision; - - astart = cp.getAngle(); - aend2 = aend1 = cpnext.getAngle(); - if (aend2 < astart) - aend2 += 2 * Math.PI; - aave = (astart + aend2) / 2.0; - start = cp.getEnd(); - end = cpnext.getStart(); - n = end - start; - if (n < 0) - n += nbase + 1; - da = cpnext.getAngle() - cp.getAngle(); - if (da < 0.0) { - da += 2 * Math.PI; - } - if (n == 2) - construct_circle_segment(start, end); - else { - dx = bases.get(end).getX() - bases.get(start).getX(); - dy = bases.get(end).getY() - bases.get(start).getY(); - rr = Math.sqrt(dx * dx + dy * dy); - dx /= rr; - dy /= rr; - if (rr >= 1.5 && da <= Math.PI / 2) { - nstart = start + 1; - if (nstart > nbase) - nstart -= nbase + 1; - nend = end - 1; - if (nend < 0) - nend += nbase + 1; - bases.get(nstart).setX(bases.get(start).getX() + 0.5 * dx); - bases.get(nstart).setY(bases.get(start).getY() + 0.5 * dy); - bases.get(nend).setX(bases.get(end).getX() - 0.5 * dx); - bases.get(nend).setY(bases.get(end).getY() - 0.5 * dy); - start = nstart; - end = nend; - } - do { - collision = false; - construct_circle_segment(start, end); - nstart = start + 1; - if (nstart > nbase) - nstart -= nbase + 1; - dx = bases.get(nstart).getX() - bases.get(start).getX(); - dy = bases.get(nstart).getY() - bases.get(start).getY(); - a1 = Math.atan2(dy, dx); - if (a1 < 0.0) - a1 += 2 * Math.PI; - dac = a1 - astart; - if (dac < 0.0) - dac += 2 * Math.PI; - if (dac > Math.PI) - collision = true; - nend = end - 1; - if (nend < 0) - nend += nbase + 1; - dx = bases.get(nend).getX() - bases.get(end).getX(); - dy = bases.get(nend).getY() - bases.get(end).getY(); - a2 = Math.atan2(dy, dx); - if (a2 < 0.0) - a2 += 2 * Math.PI; - dac = aend1 - a2; - if (dac < 0.0) - dac += 2 * Math.PI; - if (dac > Math.PI) - collision = true; - if (collision) { - ac = minf2(aave, astart + 0.5); - bases.get(nstart).setX( - bases.get(start).getX() + Math.cos(ac)); - bases.get(nstart).setY( - bases.get(start).getY() + Math.sin(ac)); - start = nstart; - ac = maxf2(aave, aend2 - 0.5); - bases.get(nend).setX(bases.get(end).getX() + Math.cos(ac)); - bases.get(nend).setY(bases.get(end).getY() + Math.sin(ac)); - end = nend; - n -= 2; - } - } while (collision && n > 1); - } - } - - /** - * Given n points to be placed equidistantly and equiangularly on a polygon - * which has a chord of length, b, find the distance, h, from the midpoint - * of the chord for the center of polygon. Positive values mean the center - * is within the polygon and the chord, whereas negative values mean the - * center is outside the chord. Also, the radial angle for each polygon side - * is returned in theta. - * - * The procedure uses a bisection algorithm to find the correct value for - * the center. Two equations are solved, the angles around the center must - * add to 2*Math.PI, and the sides of the polygon excluding the chord must - * have a length of 1. - * - * @throws ExceptionNAViewAlgorithm - */ - private void find_center_for_arc(double n, double b) - throws ExceptionNAViewAlgorithm { - if (debug) - System.out.println(" Find_center_for_arc"); - double h, hhi, hlow, r, disc, theta, e, phi; - int iter; - - hhi = (n + 1.0) / Math.PI; - // changed to prevent div by zero if (ih) - hlow = -hhi - b / (n + 1.000001 - b); - if (b < 1) - // otherwise we might fail below (ih) - hlow = 0; - iter = 0; - do { - h = (hhi + hlow) / 2.0; - r = Math.sqrt(h * h + b * b / 4.0); - // if (r<0.5) {r = 0.5; h = 0.5*Math.sqrt(1-b*b);} - disc = 1.0 - 0.5 / (r * r); - if (Math.abs(disc) > 1.0) { - throw new ExceptionNAViewAlgorithm( - "Unexpected large magnitude discriminant = " + disc - + " " + r); - } - theta = Math.acos(disc); - // theta = 2*Math.acos(Math.sqrt(1-1/(4*r*r))); - phi = Math.acos(h / r); - e = theta * (n + 1) + 2 * phi - 2 * Math.PI; - if (e > 0.0) { - hlow = h; - } else { - hhi = h; - } - } while (Math.abs(e) > 0.0001 && ++iter < MAXITER); - if (iter >= MAXITER) { - if (noIterationFailureYet) { - warningEmition("Iteration failed in find_center_for_arc"); - noIterationFailureYet = false; - } - h = 0.0; - theta = 0.0; - } - _h = h; - angleinc = theta; - } - - private double minf2(double x1, double x2) { - return ((x1) < (x2)) ? (x1) : (x2); - } - - private double maxf2(double x1, double x2) { - return ((x1) > (x2)) ? (x1) : (x2); - } - - public void warningEmition(String warningMessage) throws ExceptionNAViewAlgorithm { - throw (new ExceptionNAViewAlgorithm(warningMessage)); - } -} diff --git a/src2/fr/orsay/lri/varna/models/naView/Radloop.java b/src2/fr/orsay/lri/varna/models/naView/Radloop.java deleted file mode 100644 index 1fc775b..0000000 --- a/src2/fr/orsay/lri/varna/models/naView/Radloop.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - 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.models.naView; - -public class Radloop { - private double radius; - private int loopnumber; - private Radloop next, prev; - - public double getRadius() { - return radius; - } - - public void setRadius(double radius) { - this.radius = radius; - } - - public int getLoopnumber() { - return loopnumber; - } - - public void setLoopnumber(int loopnumber) { - this.loopnumber = loopnumber; - } - - public Radloop getNext() { - return next; - } - - public void setNext(Radloop next) { - this.next = next; - } - - public Radloop getPrev() { - return prev; - } - - public void setPrev(Radloop prev) { - this.prev = prev; - } -} diff --git a/src2/fr/orsay/lri/varna/models/naView/Region.java b/src2/fr/orsay/lri/varna/models/naView/Region.java deleted file mode 100644 index 7633935..0000000 --- a/src2/fr/orsay/lri/varna/models/naView/Region.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - 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.models.naView; - -public class Region { - private int _start1, _end1, _start2, _end2; - - public int getStart1() { - return _start1; - } - - public void setStart1(int start1) { - this._start1 = start1; - } - - public int getEnd1() { - return _end1; - } - - public void setEnd1(int end1) { - this._end1 = end1; - } - - public int getStart2() { - return _start2; - } - - public void setStart2(int start2) { - this._start2 = start2; - } - - public int getEnd2() { - return _end2; - } - - public void setEnd2(int end2) { - this._end2 = end2; - } -} diff --git a/src2/fr/orsay/lri/varna/models/rna/DrawRNATemplate.java b/src2/fr/orsay/lri/varna/models/rna/DrawRNATemplate.java deleted file mode 100644 index 37b41b8..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/DrawRNATemplate.java +++ /dev/null @@ -1,1421 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.models.rna; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import fr.orsay.lri.varna.exceptions.ExceptionInvalidRNATemplate; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.geom.ComputeArcCenter; -import fr.orsay.lri.varna.models.geom.ComputeEllipseAxis; -import fr.orsay.lri.varna.models.geom.CubicBezierCurve; -import fr.orsay.lri.varna.models.geom.HalfEllipse; -import fr.orsay.lri.varna.models.geom.LinesIntersect; -import fr.orsay.lri.varna.models.geom.MiscGeom; -import fr.orsay.lri.varna.models.templates.DrawRNATemplateCurveMethod; -import fr.orsay.lri.varna.models.templates.DrawRNATemplateMethod; -import fr.orsay.lri.varna.models.templates.RNANodeValueTemplate; -import fr.orsay.lri.varna.models.templates.RNANodeValueTemplateBasePair; -import fr.orsay.lri.varna.models.templates.RNATemplate; -import fr.orsay.lri.varna.models.templates.RNATemplateAlign; -import fr.orsay.lri.varna.models.templates.RNATemplateDrawingAlgorithmException; -import fr.orsay.lri.varna.models.templates.RNATemplateMapping; -import fr.orsay.lri.varna.models.templates.RNATemplate.EdgeEndPointPosition; -import fr.orsay.lri.varna.models.templates.RNATemplate.In1Is; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateHelix; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateUnpairedSequence; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement.EdgeEndPoint; -import fr.orsay.lri.varna.models.treealign.Tree; - -public class DrawRNATemplate { - private RNA rna; - private RNATemplateMapping mapping; - private ArrayList _listeBases; - - - public DrawRNATemplate(RNA rna) { - this.rna = rna; - this._listeBases = rna.getListeBases(); - } - - public RNATemplateMapping getMapping() { - return mapping; - } - - - - /** - * Draw this RNA like the given template. - * The helixLengthAdjustmentMethod argument tells what to do in case - * some helices are of a different length in the template and the - * actual helix. See class DrawRNATemplateMethod above for possible values. - * @param straightBulges - */ - public void drawRNATemplate( - RNATemplate template, - VARNAConfig conf, - DrawRNATemplateMethod helixLengthAdjustmentMethod, - DrawRNATemplateCurveMethod curveMethod, boolean straightBulges) - throws RNATemplateDrawingAlgorithmException { - - // debug -// try { -// RNA perfectMatchingRNA = template.toRNA(); -// System.out.println("An RNA that would perfectly match this template would be:"); -// System.out.println(perfectMatchingRNA.getStructDBN()); -// } catch (ExceptionInvalidRNATemplate e) { -// e.printStackTrace(); -// } - - mapping = RNATemplateAlign.mapRNAWithTemplate(rna, template); - //System.out.println(mapping.showCompact(this)); - - // debug -// RNATemplateAlign.printMapping(mapping, template, getSeq()); -// try { -// TreeGraphviz.treeToGraphvizPostscript(alignment, "alignment_graphviz.ps"); -// } catch (IOException e) { -// e.printStackTrace(); -// } - - - - Iterator iter; - double globalIncreaseFactor = 1; - Map translateVectors = null; - if (helixLengthAdjustmentMethod == DrawRNATemplateMethod.MAXSCALINGFACTOR) { - // Compute increase factors for helices. - Map lengthIncreaseFactor = new HashMap(); - double maxLengthIncreaseFactor = Double.NEGATIVE_INFINITY; - //RNATemplateHelix maxIncreaseHelix = null; - iter = template.rnaIterator(); - while (iter.hasNext()) { - RNATemplateElement element = iter.next(); - if (element instanceof RNATemplateHelix - && mapping.getAncestor(element) != null - && !lengthIncreaseFactor.containsKey(element)) { - RNATemplateHelix helix = (RNATemplateHelix) element; - int[] basesInHelixArray = RNATemplateAlign.intArrayFromList(mapping.getAncestor(helix)); - Arrays.sort(basesInHelixArray); - double l = computeLengthIncreaseFactor(basesInHelixArray, helix, straightBulges); - lengthIncreaseFactor.put(helix, l); - if (l > maxLengthIncreaseFactor) { - maxLengthIncreaseFactor = l; - //maxIncreaseHelix = helix; - } - } - } - - // debug - //System.out.println("Max helix length increase factor = " + maxLengthIncreaseFactor + " reached with helix " + maxIncreaseHelix);; - - globalIncreaseFactor = Math.max(1, maxLengthIncreaseFactor); - - } else if (helixLengthAdjustmentMethod == DrawRNATemplateMethod.HELIXTRANSLATE) { - try { - // Now we need to propagate this helices translations - Tree templateAsTree = template.toTree(); - translateVectors = computeHelixTranslations(templateAsTree, mapping, straightBulges); - - } catch (ExceptionInvalidRNATemplate e) { - throw (new RNATemplateDrawingAlgorithmException("ExceptionInvalidRNATemplate: " + e.getMessage())); - } - } - - // Allocate the coords and centers arrays - // We create Point2D.Double objects in it but the algorithms - // we use may choose to create new Point2D.Double objects or to - // modify those created here. - Point2D.Double[] coords = new Point2D.Double[_listeBases.size()]; - Point2D.Double[] centers = new Point2D.Double[_listeBases.size()]; - double[] angles = new double[_listeBases.size()]; - for (int i = 0; i < _listeBases.size(); i++) { - coords[i] = new Point2D.Double(0, 0); - centers[i] = new Point2D.Double(0, 0); - } - - boolean computeCoords = true; - while (computeCoords) { - computeCoords = false; - // Compute coords and centers - Set alreadyDrawnHelixes = new HashSet(); - RNATemplateHelix lastMappedHelix = null; - EdgeEndPoint howWeGotOutOfLastHelix = null; - int howWeGotOutOfLastHelixBaseIndex = 0; - iter = template.rnaIterator(); - RNATemplateElement element = null; - while (iter.hasNext()) { - element = iter.next(); - if (element instanceof RNATemplateHelix - && mapping.getAncestor(element) != null) { - // We have a mapping between an helix in the RNA sequence - // and an helix in the template. - - RNATemplateHelix helix = (RNATemplateHelix) element; - boolean firstTimeWeMeetThisHelix; - int[] basesInHelixArray = RNATemplateAlign.intArrayFromList(mapping.getAncestor(helix)); - Arrays.sort(basesInHelixArray); - - // Draw this helix if it has not already been done - if (!alreadyDrawnHelixes.contains(helix)) { - firstTimeWeMeetThisHelix = true; - drawHelixLikeTemplateHelix(basesInHelixArray, helix, coords, centers,angles, globalIncreaseFactor, translateVectors, straightBulges); - alreadyDrawnHelixes.add(helix); - } else { - firstTimeWeMeetThisHelix = false; - } - - EdgeEndPoint howWeGetInCurrentHelix; - if (firstTimeWeMeetThisHelix) { - if (helix.getIn1Is() == In1Is.IN1_IS_5PRIME) { - howWeGetInCurrentHelix = helix.getIn1(); - } else { - howWeGetInCurrentHelix = helix.getIn2(); - } - } else { - if (helix.getIn1Is() == In1Is.IN1_IS_5PRIME) { - howWeGetInCurrentHelix = helix.getIn2(); - } else { - howWeGetInCurrentHelix = helix.getIn1(); - } - } - - Point2D.Double P0 = new Point2D.Double(); - Point2D.Double P3 = new Point2D.Double(); - - if (lastMappedHelix != null) { - // Now draw the RNA sequence (possibly containing helixes) - // between the last template drawn helix and this one. - - if (lastMappedHelix == helix) { - // Last helix is the same as the current one so - // nothing matched (or at best a single - // non-paired sequence) so we will just - // use the Radiate algorithm - - Point2D.Double helixVector = new Point2D.Double(); - computeHelixEndPointDirections(howWeGotOutOfLastHelix, helixVector, new Point2D.Double()); - - double angle = MiscGeom.angleFromVector(helixVector); - int b1 = basesInHelixArray[basesInHelixArray.length/2 - 1]; - P0.setLocation(coords[b1]); - int b2 = basesInHelixArray[basesInHelixArray.length/2]; - P3.setLocation(coords[b2]); - Point2D.Double loopCenter = new Point2D.Double((P0.x + P3.x)/2, (P0.y + P3.y)/2); - rna.drawLoop(b1, - b2, - loopCenter.x, - loopCenter.y, - angle, - coords, - centers, - angles, - straightBulges); - // If the helix is flipped, we need to compute the symmetric - // of the whole loop. - if (helix.isFlipped()) { - symmetric(loopCenter, helixVector, coords, b1, b2); - symmetric(loopCenter, helixVector, centers, b1, b2); - } - } else { - // No helices matched between the last helix and - // the current one, so we draw what is between - // using the radiate algorithm but on the Bezier curve. - - int b1 = howWeGotOutOfLastHelixBaseIndex; - int b2 = firstTimeWeMeetThisHelix ? basesInHelixArray[0] : basesInHelixArray[basesInHelixArray.length/2]; - P0.setLocation(coords[b1]); - P3.setLocation(coords[b2]); - - Point2D.Double P1, P2; - - if (howWeGotOutOfLastHelix.getOtherElement() instanceof RNATemplateUnpairedSequence - && howWeGetInCurrentHelix.getOtherElement() instanceof RNATemplateUnpairedSequence) { - // We will draw the bases on a Bezier curve - P1 = new Point2D.Double(); - computeBezierTangentVectorTarget(howWeGotOutOfLastHelix, P0, P1); - - P2 = new Point2D.Double(); - computeBezierTangentVectorTarget(howWeGetInCurrentHelix, P3, P2); - } else { - // We will draw the bases on a straight line between P0 and P3 - P1 = null; - P2 = null; - } - - drawAlongCurve(b1, b2, P0, P1, P2, P3, coords, centers, angles, curveMethod, lastMappedHelix.isFlipped(), straightBulges); - } - - } else if (basesInHelixArray[0] > 0) { - // Here we draw what is before the first mapped helix. - - RNATemplateUnpairedSequence templateSequence; - // Try to find our template sequence as the mapped element of base 0 - RNATemplateElement templateSequenceCandidate = mapping.getPartner(0); - if (templateSequenceCandidate != null - && templateSequenceCandidate instanceof RNATemplateUnpairedSequence) { - templateSequence = (RNATemplateUnpairedSequence) templateSequenceCandidate; - } else { - // Try other idea: first template element if it is a sequence - templateSequenceCandidate = template.getFirst(); - if (templateSequenceCandidate != null - && templateSequenceCandidate instanceof RNATemplateUnpairedSequence) { - templateSequence = (RNATemplateUnpairedSequence) templateSequenceCandidate; - } else { - // We don't know where to start - templateSequence = null; - } - } - - int b1 = 0; - int b2 = firstTimeWeMeetThisHelix ? basesInHelixArray[0] : basesInHelixArray[basesInHelixArray.length/2]; - P3.setLocation(coords[b2]); - - if (templateSequence != null) { - coords[0].setLocation(templateSequence.getVertex5()); - coords[0].x *= globalIncreaseFactor; - coords[0].y *= globalIncreaseFactor; - } else { - // Put b1 at an ideal distance from b2, using the "flat exterior loop" method - double idealLength = computeStraightLineIdealLength(b1, b2); - Point2D.Double j = new Point2D.Double(); - if (howWeGetInCurrentHelix != null) { - computeHelixEndPointDirections(howWeGetInCurrentHelix, new Point2D.Double(), j); - } else { - j.setLocation(1, 0); - } - coords[b1].setLocation(coords[b2].x + j.x*idealLength, coords[b2].y + j.y*idealLength); - } - P0.setLocation(coords[0]); - - Point2D.Double P1, P2; - - if (howWeGetInCurrentHelix.getOtherElement() instanceof RNATemplateUnpairedSequence - && templateSequence != null) { - // We will draw the bases on a Bezier curve - P1 = new Point2D.Double(); - computeBezierTangentVectorTarget(templateSequence.getIn(), P0, P1); - - P2 = new Point2D.Double(); - computeBezierTangentVectorTarget(howWeGetInCurrentHelix, P3, P2); - } else { - // We will draw the bases on a straight line between P0 and P3 - P1 = null; - P2 = null; - } - - drawAlongCurve(b1, b2, P0, P1, P2, P3, coords, centers, angles, curveMethod, false, straightBulges); - } - - lastMappedHelix = helix; - howWeGotOutOfLastHelix = howWeGetInCurrentHelix.getNextEndPoint(); - if (firstTimeWeMeetThisHelix) { - howWeGotOutOfLastHelixBaseIndex = basesInHelixArray[basesInHelixArray.length/2-1]; - } else { - howWeGotOutOfLastHelixBaseIndex = basesInHelixArray[basesInHelixArray.length-1]; - } - } - } // end template iteration - - - // Now we need to draw what is after the last mapped helix. - if (howWeGotOutOfLastHelixBaseIndex < coords.length-1 - && element != null - && coords.length > 1) { - - RNATemplateUnpairedSequence beginTemplateSequence = null; - if (lastMappedHelix == null) { - // No helix at all matched between the template and RNA! - // So the sequence we want to draw is the full RNA. - - // Try to find our template sequence as the mapped element of base 0 - RNATemplateElement templateSequenceCandidate = mapping.getPartner(0); - if (templateSequenceCandidate != null - && templateSequenceCandidate instanceof RNATemplateUnpairedSequence) { - beginTemplateSequence = (RNATemplateUnpairedSequence) templateSequenceCandidate; - } else { - // Try other idea: first template element if it is a sequence - templateSequenceCandidate = template.getFirst(); - if (templateSequenceCandidate != null - && templateSequenceCandidate instanceof RNATemplateUnpairedSequence) { - beginTemplateSequence = (RNATemplateUnpairedSequence) templateSequenceCandidate; - } else { - // We don't know where to start - beginTemplateSequence = null; - } - } - - if (beginTemplateSequence != null) { - coords[0].setLocation(beginTemplateSequence.getVertex5()); - coords[0].x *= globalIncreaseFactor; - coords[0].y *= globalIncreaseFactor; - } - - } - - RNATemplateUnpairedSequence endTemplateSequence; - // Try to find our template sequence as the mapped element of last base - RNATemplateElement templateSequenceCandidate = mapping.getPartner(coords.length-1); - if (templateSequenceCandidate != null - && templateSequenceCandidate instanceof RNATemplateUnpairedSequence) { - endTemplateSequence = (RNATemplateUnpairedSequence) templateSequenceCandidate; - } else { - // Try other idea: last template element if it is a sequence - templateSequenceCandidate = element; - if (templateSequenceCandidate != null - && templateSequenceCandidate instanceof RNATemplateUnpairedSequence) { - endTemplateSequence = (RNATemplateUnpairedSequence) templateSequenceCandidate; - } else { - // We don't know where to end - endTemplateSequence = null; - } - } - - int b1 = howWeGotOutOfLastHelixBaseIndex; - int b2 = coords.length - 1; - - if (endTemplateSequence != null) { - coords[b2].setLocation(endTemplateSequence.getVertex3()); - coords[b2].x *= globalIncreaseFactor; - coords[b2].y *= globalIncreaseFactor; - } else { - // Put b2 at an ideal distance from b1, using the "flat exterior loop" method - double idealLength = computeStraightLineIdealLength(b1, b2); - Point2D.Double j = new Point2D.Double(); - if (howWeGotOutOfLastHelix != null) { - computeHelixEndPointDirections(howWeGotOutOfLastHelix, new Point2D.Double(), j); - } else { - j.setLocation(1, 0); - } - coords[b2].setLocation(coords[b1].x + j.x*idealLength, coords[b1].y + j.y*idealLength); - } - - - Point2D.Double P0 = new Point2D.Double(); - Point2D.Double P3 = new Point2D.Double(); - - P0.setLocation(coords[b1]); - P3.setLocation(coords[b2]); - - Point2D.Double P1, P2; - - if (howWeGotOutOfLastHelix != null - && howWeGotOutOfLastHelix.getOtherElement() instanceof RNATemplateUnpairedSequence - && endTemplateSequence != null) { - // We will draw the bases on a Bezier curve - P1 = new Point2D.Double(); - computeBezierTangentVectorTarget(howWeGotOutOfLastHelix, P0, P1); - - P2 = new Point2D.Double(); - computeBezierTangentVectorTarget(endTemplateSequence.getOut(), P3, P2); - } else if (lastMappedHelix == null - && beginTemplateSequence != null - && endTemplateSequence != null) { - // We will draw the bases on a Bezier curve - P1 = new Point2D.Double(); - computeBezierTangentVectorTarget(beginTemplateSequence.getIn(), P0, P1); - - P2 = new Point2D.Double(); - computeBezierTangentVectorTarget(endTemplateSequence.getOut(), P3, P2); - } else { - // We will draw the bases on a straight line between P0 and P3 - P1 = null; - P2 = null; - } - - drawAlongCurve(b1, b2, P0, P1, P2, P3, coords, centers, angles, curveMethod, lastMappedHelix != null ? lastMappedHelix.isFlipped() : false, straightBulges); - - } - - - if (helixLengthAdjustmentMethod == DrawRNATemplateMethod.NOINTERSECT && coords.length > 3) { - // Are we happy with this value of globalIncreaseFactor? - Line2D.Double[] lines = new Line2D.Double[coords.length-1]; - for (int i=0; i 0) { - // Don't increase more than a maximum value - if (globalIncreaseFactor < 3) { - globalIncreaseFactor += 0.1; - //System.out.println("globalIncreaseFactor increased to " + globalIncreaseFactor); - // Compute the drawing again - computeCoords = true; - } - } - } - - } - - // debug - if (helixLengthAdjustmentMethod == DrawRNATemplateMethod.MAXSCALINGFACTOR - || helixLengthAdjustmentMethod == DrawRNATemplateMethod.NOINTERSECT) { - //System.out.println("globalIncreaseFactor = " + globalIncreaseFactor); - } - - // Now we actually move the bases, according to arrays coords and centers - // and taking in account the space between bases parameter. - for (int i = 0; i < _listeBases.size(); i++) { - _listeBases.get(i).setCoords( - new Point2D.Double(coords[i].x * conf._spaceBetweenBases, - coords[i].y * conf._spaceBetweenBases)); - _listeBases.get(i).setCenter( - new Point2D.Double(centers[i].x * conf._spaceBetweenBases, - centers[i].y * conf._spaceBetweenBases)); - } - - } - - - - - - - /** - * IN: Argument helixEndPoint is an IN argument (will be read), - * and must contain an helix edge endpoint. - * - * The other arguments are OUT arguments - * (must be existing objects, content will be overwritten). - * - * OUT: The i argument will contain a vector colinear to the vector - * from the helix startPosition to endPosition or the opposite - * depending on there the endpoint is (the endpoint will be on the - * destination side of the vector). ||i|| = 1 - * - * OUT: The j vector will contain an vector that is colinear - * to the last/first base pair connection on the side of this endpoint. - * The vector will be oriented to the side of the given endpoint. - * ||j|| = 1 - */ - private void computeHelixEndPointDirections( - EdgeEndPoint helixEndPoint, // IN - Point2D.Double i, // OUT - Point2D.Double j // OUT - ) { - RNATemplateHelix helix = (RNATemplateHelix) helixEndPoint.getElement(); - Point2D.Double startpos = helix.getStartPosition(); - Point2D.Double endpos = helix.getEndPosition(); - Point2D.Double helixVector = new Point2D.Double(); - switch (helixEndPoint.getPosition()) { - case IN1: - case OUT2: - helixVector.x = startpos.x - endpos.x; - helixVector.y = startpos.y - endpos.y; - break; - case IN2: - case OUT1: - helixVector.x = endpos.x - startpos.x; - helixVector.y = endpos.y - startpos.y; - break; - } - double helixVectorLength = Math.hypot(helixVector.x, helixVector.y); - // i is the vector which is colinear to helixVector and such that ||i|| = 1 - i.x = helixVector.x / helixVectorLength; - i.y = helixVector.y / helixVectorLength; - // Find j such that it is orthogonal to i, ||j|| = 1 - // and j goes to the side where the sequence will be connected - switch (helixEndPoint.getPosition()) { - case IN1: - case IN2: - // rotation of +pi/2 - j.x = - i.y; - j.y = i.x; - break; - case OUT1: - case OUT2: - // rotation of -pi/2 - j.x = i.y; - j.y = - i.x; - break; - } - if (helix.isFlipped()) { - j.x = - j.x; - j.y = - j.y; - } - - } - - /** - * A cubic Bezier curve can be defined by 4 points, - * see http://en.wikipedia.org/wiki/Bezier_curve#Cubic_B.C3.A9zier_curves - * For each of the curve end points, there is the last/first point of the - * curve and a point which gives the direction and length of the tangent - * vector on that side. This two points are respectively curveEndPoint - * and curveVectorOtherPoint. - * IN: Argument helixVector is the vector formed by the helix, - * in the right direction for our sequence. - * IN: Argument curveEndPoint is the position of the endpoint on the helix. - * OUT: Argument curveVectorOtherPoint must be allocated - * and the values will be modified. - */ - private void computeBezierTangentVectorTarget( - EdgeEndPoint endPoint, - Point2D.Double curveEndPoint, - Point2D.Double curveVectorOtherPoint) - throws RNATemplateDrawingAlgorithmException { - - boolean sequenceEndPointIsIn; - RNATemplateUnpairedSequence sequence; - - if (endPoint.getElement() instanceof RNATemplateHelix) { - sequence = (RNATemplateUnpairedSequence) endPoint.getOtherElement(); - EdgeEndPointPosition endPointPositionOnHelix = endPoint.getPosition(); - switch (endPointPositionOnHelix) { - case IN1: - case IN2: - sequenceEndPointIsIn = false; - break; - default: - sequenceEndPointIsIn = true; - } - - EdgeEndPoint endPointOnHelix = - sequenceEndPointIsIn ? - sequence.getIn().getOtherEndPoint() : - sequence.getOut().getOtherEndPoint(); - if (endPointOnHelix == null) { - throw (new RNATemplateDrawingAlgorithmException("Sequence is not connected to an helix.")); - } - } else { - // The endpoint is on an unpaired sequence. - sequence = (RNATemplateUnpairedSequence) endPoint.getElement(); - if (endPoint == sequence.getIn()) { - // endpoint is 5' - sequenceEndPointIsIn = true; - } else { - sequenceEndPointIsIn = false; - } - } - - double l = - sequenceEndPointIsIn ? - sequence.getInTangentVectorLength() : - sequence.getOutTangentVectorLength(); - - // Compute the absolute angle our line makes to the helix - double theta = - sequenceEndPointIsIn ? - sequence.getInTangentVectorAngle() : - sequence.getOutTangentVectorAngle(); - - // Compute v, the tangent vector of the Bezier curve - Point2D.Double v = new Point2D.Double(); - v.x = l * Math.cos(theta); - v.y = l * Math.sin(theta); - curveVectorOtherPoint.x = curveEndPoint.x + v.x; - curveVectorOtherPoint.y = curveEndPoint.y + v.y; - } - - - /** - * Compute (actual helix length / helix length in template). - * @param straightBulges - */ - private double computeLengthIncreaseFactor( - int[] basesInHelixArray, // IN - RNATemplateHelix helix, // IN - boolean straightBulges - ) { - double templateLength = computeHelixTemplateLength(helix); - double realLength = computeHelixRealLength(basesInHelixArray,straightBulges); - return realLength / templateLength; - } - - /** - * Compute (actual helix vector - helix vector in template). - */ - private Point2D.Double computeLengthIncreaseDelta( - int[] basesInHelixArray, // IN - RNATemplateHelix helix, // IN - boolean straightBulges - ) { - double templateLength = computeHelixTemplateLength(helix); - double realLength = computeHelixRealLength(basesInHelixArray,straightBulges); - Point2D.Double i = new Point2D.Double(); - computeTemplateHelixVectors(helix, null, i, null); - return new Point2D.Double(i.x*(realLength-templateLength), i.y*(realLength-templateLength)); - } - - /** - * Compute helix interesting vectors from template helix. - * @param helix The template helix you want to compute the vectors from. - * @param o This point coordinates will be set the origin of the helix (or not if null), - * ie. the point in the middle of the base pair with the two most extreme bases. - * @param i Will be set to the normalized helix vector. (nothing done if null) - * @param j Will be set to the normalized helix base pair vector (5' -> 3'). (nothing done if null) - */ - private void computeTemplateHelixVectors( - RNATemplateHelix helix, // IN - Point2D.Double o, // OUT - Point2D.Double i, // OUT - Point2D.Double j // OUT - ) { - Point2D.Double startpos, endpos; - if (helix.getIn1Is() == In1Is.IN1_IS_5PRIME) { - startpos = helix.getStartPosition(); - endpos = helix.getEndPosition(); - } else { - endpos = helix.getStartPosition(); - startpos = helix.getEndPosition(); - } - if (o != null) { - o.x = startpos.x; - o.y = startpos.y; - } - if (i != null || j != null) { - // (i_x,i_y) is the vector between two consecutive bases of the same side of an helix - if (i == null) - i = new Point2D.Double(); - i.x = (endpos.x - startpos.x); - i.y = (endpos.y - startpos.y); - double i_original_norm = Math.hypot(i.x, i.y); - // change its norm to 1 - i.x = i.x / i_original_norm; - i.y = i.y / i_original_norm; - if (j != null) { - j.x = - i.y; - j.y = i.x; - if (helix.isFlipped()) { - j.x = - j.x; - j.y = - j.y; - } - double j_original_norm = Math.hypot(j.x, j.y); - // change (j_x,j_y) so that its norm is 1 - j.x = j.x / j_original_norm; - j.y = j.y / j_original_norm; - } - } - } - - - /** - * Estimate bulge arc length. - */ - private double estimateBulgeArcLength(int firstBase, int lastBase) { - if (firstBase + 1 == lastBase) - return RNA.LOOP_DISTANCE; // there is actually no bulge - double len = 0.0; - int k = firstBase; - while (k < lastBase) { - int l = _listeBases.get(k).getElementStructure(); - if (k < l && l < lastBase) { - len += RNA.BASE_PAIR_DISTANCE; - k = l; - } else { - len += RNA.LOOP_DISTANCE; - k++; - } - } - return len; - } - - - /** - * Estimate bulge width, the given first and last bases must be those in the helix. - */ - private double estimateBulgeWidth(int firstBase, int lastBase) { - double len = estimateBulgeArcLength(firstBase, lastBase); - return 2 * (len / Math.PI); - } - - - /** - * Get helix length in template. - */ - private double computeHelixTemplateLength(RNATemplateHelix helix) { - return Math.hypot(helix.getStartPosition().x - helix.getEndPosition().x, - helix.getStartPosition().y - helix.getEndPosition().y); - } - - - /** - * Compute helix actual length (as drawHelixLikeTemplateHelix() would draw it). - */ - private double computeHelixRealLength(int[] basesInHelixArray, boolean straightBulges) { - return drawHelixLikeTemplateHelix(basesInHelixArray, null, null, null, null, 0, null,straightBulges); - } - - - /** - * Result type of countUnpairedLine(), see below. - */ - private static class UnpairedLineCounts { - public int nBP, nLD, total; - } - /** - * If we are drawing an unpaired region that may contains helices, - * and we are drawing it on a line (curve or straight, doesn't matter), - * how many intervals should have a base-pair length (start of an helix) - * and how many should have a consecutive unpaired bases length? - * Returns an array with three elements: - * - answer to first question - * - answer to second question - * - sum of both, ie. total number of intervals - * (this is NOT lastBase-firstBase because bases deep in helices do not count) - */ - private UnpairedLineCounts countUnpairedLine(int firstBase, int lastBase) { - UnpairedLineCounts counts = new UnpairedLineCounts(); - int nBP = 0; - int nLD = 0; - { - int b = firstBase; - while (b < lastBase) { - int l = _listeBases.get(b).getElementStructure(); - if (b < l && l < lastBase) { - nBP++; - b = l; - } else { - nLD++; - b++; - } - } - } - counts.nBP = nBP; - counts.nLD = nLD; - counts.total = nBP + nLD; - return counts; - } - - - /** - * Draw the given helix (given as a *SORTED* array of indexes) - * like defined in the given template helix. - * OUT: The bases positions are not changed in fact, - * instead the coords and centers arrays are modified. - * IN: The helix origin position is multiplied by scaleHelixOrigin - * and translateVectors.get(helix) is added. - * RETURN VALUE: - * The length of the drawn helix. - * @param straightBulges - * - */ - private double drawHelixLikeTemplateHelix( - int[] basesInHelixArray, // IN - RNATemplateHelix helix, // IN (optional, ie. may be null) - Point2D.Double[] coords, // OUT (optional, ie. may be null) - Point2D.Double[] centers, // OUT (optional, ie. may be null) - double[] angles, // OUT - double scaleHelixOrigin, // IN - Map translateVectors // IN (optional, ie. may be null) -, boolean straightBulges - ) { - int n = basesInHelixArray.length / 2; - if (n == 0) - return 0; - // Default values when not template helix is provided: - Point2D.Double o = new Point2D.Double(0, 0); - Point2D.Double i = new Point2D.Double(1, 0); - Point2D.Double j = new Point2D.Double(0, 1); - boolean flipped = false; - if (helix != null) { - computeTemplateHelixVectors(helix, o, i, j); - flipped = helix.isFlipped(); - } - Point2D.Double li = new Point2D.Double(i.x*RNA.LOOP_DISTANCE, i.y*RNA.LOOP_DISTANCE); - // We want o to be the point where the first base (5' end) is - o.x = (o.x - j.x * RNA.BASE_PAIR_DISTANCE / 2) * scaleHelixOrigin; - o.y = (o.y - j.y * RNA.BASE_PAIR_DISTANCE / 2) * scaleHelixOrigin; - if (translateVectors != null && translateVectors.containsKey(helix)) { - Point2D.Double v = translateVectors.get(helix); - o.x = o.x + v.x; - o.y = o.y + v.y; - } - - // We need this array so that we can store positions even if coords == null - Point2D.Double[] helixBasesPositions = new Point2D.Double[basesInHelixArray.length]; - for (int k=0; k= 1 && (basesInHelixArray[k] != basesInHelixArray[k-1] + 1 - || basesInHelixArray[kp+1] != basesInHelixArray[kp] + 1); - if (k >= 1) { - if (basesInHelixArray[k] < basesInHelixArray[k-1] - || basesInHelixArray[kp+1] < basesInHelixArray[kp]) { - throw new Error("Internal bug: basesInHelixArray must be sorted"); - } - if (bulge) { - // Estimate a good distance (delta) between the previous base pair and this one - double delta1 = estimateBulgeWidth(basesInHelixArray[k-1], basesInHelixArray[k]); - double delta2 = estimateBulgeWidth(basesInHelixArray[kp], basesInHelixArray[kp+1]); - // The biggest bulge defines the width - double delta = Math.max(delta1, delta2); - - if (coords != null) { - // Now, where do we put the bases that are part of the bulge? - for (int side=0; side<2; side++) { - Point2D.Double pstart = new Point2D.Double(); - Point2D.Double pend = new Point2D.Double(); - Point2D.Double bisectVect = new Point2D.Double(); - Point2D.Double is = new Point2D.Double(); - int firstBase, lastBase; - double alphasign = flipped ? -1 : 1; - if (side == 0) { - firstBase = basesInHelixArray[k-1]; - lastBase = basesInHelixArray[k]; - pstart.setLocation(o.x + accDelta.x, - o.y + accDelta.y); - pend.setLocation(o.x + accDelta.x + i.x*delta, - o.y + accDelta.y + i.y*delta); - bisectVect.setLocation(-j.x, -j.y); - is.setLocation(i); - } else { - firstBase = basesInHelixArray[kp]; - lastBase = basesInHelixArray[kp+1]; - pstart.setLocation(o.x + accDelta.x + i.x*delta + j.x*RNA.BASE_PAIR_DISTANCE, - o.y + accDelta.y + i.y*delta + j.y*RNA.BASE_PAIR_DISTANCE); - pend.setLocation(o.x + accDelta.x + j.x*RNA.BASE_PAIR_DISTANCE, - o.y + accDelta.y + j.y*RNA.BASE_PAIR_DISTANCE); - - bisectVect.setLocation(j); - is.setLocation(-i.x, -i.y); - } - double arclen = estimateBulgeArcLength(firstBase, lastBase); - double centerOnBisect = ComputeArcCenter.computeArcCenter(delta, arclen); - - // Should we draw the base on an arc or simply use a line? - if (centerOnBisect > -1000) { - Point2D.Double center = new Point2D.Double(pstart.x + is.x*delta/2 + bisectVect.x*centerOnBisect, - pstart.y + is.y*delta/2 + bisectVect.y*centerOnBisect); - int b = firstBase; - double len = 0; - double r = Math.hypot(pstart.x - center.x, pstart.y - center.y); - double alpha0 = MiscGeom.angleFromVector(pstart.x - center.x, pstart.y - center.y); - while (b < lastBase) { - int l = _listeBases.get(b).getElementStructure(); - if (b < l && l < lastBase) { - len += RNA.BASE_PAIR_DISTANCE; - b = l; - } else { - len += RNA.LOOP_DISTANCE; - b++; - } - if (b < lastBase) { - coords[b].x = center.x + r*Math.cos(alpha0 + alphasign*len/r); - coords[b].y = center.y + r*Math.sin(alpha0 + alphasign*len/r); - } - } - } else { - // Draw on a line - - // Distance between paired bases cannot be changed - // (imposed by helix width) but distance between other - // bases can be adjusted. - UnpairedLineCounts counts = countUnpairedLine(firstBase, lastBase); - double LD = Math.max((delta - counts.nBP*RNA.BASE_PAIR_DISTANCE) / (double) counts.nLD, 0); - //System.out.println("nBP=" + nBP + " nLD=" + nLD); - double len = 0; - { - int b = firstBase; - while (b < lastBase) { - int l = _listeBases.get(b).getElementStructure(); - if (b < l && l < lastBase) { - len += RNA.BASE_PAIR_DISTANCE; - b = l; - } else { - len += LD; - b++; - } - if (b < lastBase) { - coords[b].x = pstart.x + is.x*len; - coords[b].y = pstart.y + is.y*len; - } - } - } - //System.out.println("len=" + len + " delta=" + delta + " d(pstart,pend)=" + Math.hypot(pend.x-pstart.x, pend.y-pstart.y)); - } - - // Does the bulge contain an helix? - // If so, use drawLoop() to draw it. - { - int b = firstBase; - while (b < lastBase) { - int l = _listeBases.get(b).getElementStructure(); - if (b < l && l < lastBase) { - // Helix present in bulge - Point2D.Double b1pos = coords[b]; - Point2D.Double b2pos = coords[l]; - double beta = MiscGeom.angleFromVector(b2pos.x - b1pos.x, b2pos.y - b1pos.y) - Math.PI / 2 + (flipped ? Math.PI : 0); - Point2D.Double loopCenter = new Point2D.Double((b1pos.x + b2pos.x)/2, (b1pos.y + b2pos.y)/2); - rna.drawLoop(b, - l, - loopCenter.x, - loopCenter.y, - beta, - coords, - centers, - angles, - straightBulges); - // If the helix is flipped, we need to compute the symmetric - // of the whole loop. - if (helix.isFlipped()) { - Point2D.Double v = new Point2D.Double(Math.cos(beta), Math.sin(beta)); - symmetric(loopCenter, v, coords, b, l); - symmetric(loopCenter, v, centers, b, l); - } - // Continue - b = l; - } else { - b++; - } - } - } - } - } - - accDelta.x += i.x*delta; - accDelta.y += i.y*delta; - p1.x = o.x + accDelta.x; - p1.y = o.y + accDelta.y; - p2.x = p1.x + j.x*RNA.BASE_PAIR_DISTANCE; - p2.y = p1.y + j.y*RNA.BASE_PAIR_DISTANCE; - - } else { - accDelta.x += li.x; - accDelta.y += li.y; - p1.x = o.x + accDelta.x; - p1.y = o.y + accDelta.y; - p2.x = p1.x + j.x*RNA.BASE_PAIR_DISTANCE; - p2.y = p1.y + j.y*RNA.BASE_PAIR_DISTANCE; - } - } else { - // First base pair - p1.x = o.x; - p1.y = o.y; - p2.x = p1.x + j.x*RNA.BASE_PAIR_DISTANCE; - p2.y = p1.y + j.y*RNA.BASE_PAIR_DISTANCE; - } - } - - Point2D.Double p1 = helixBasesPositions[0]; - Point2D.Double p2 = helixBasesPositions[n-1]; - - if (coords != null) { - for (int k=0; k alongBezierCurve = new ArrayList(); - for (int depth=0, i=firstBase; i<=lastBase; i++) { - int k = _listeBases.get(i).getElementStructure(); - if (k < 0 || k > lastBase || k < firstBase) { - if (depth == 0) { - alongBezierCurve.add(i); - } - } else { - if (i < k) { - if (depth == 0) { - alongBezierCurve.add(i); - alongBezierCurve.add(k); - } - depth++; - } else { - depth--; - } - } - } - // number of bases along the Bezier curve - int n = alongBezierCurve.size(); - int[] alongBezierCurveArray = RNATemplateAlign.intArrayFromList(alongBezierCurve); - if (n > 0) { - if (curveMethod == DrawRNATemplateCurveMethod.ALWAYS_REPLACE_BY_ELLIPSES) { - drawOnEllipse(firstBase, lastBase, P0, P3, coords, centers, reverse); - } else if (curveMethod == DrawRNATemplateCurveMethod.SMART) { - boolean passed; - if (P1 != null && P2 != null) { - passed = drawOnBezierCurve(firstBase, lastBase, P0, P1, P2, P3, coords, centers, true); - } else { - passed = drawOnStraightLine(firstBase, lastBase, P0, P3, coords, centers, true); - } - if (!passed) { - drawOnEllipse(firstBase, lastBase, P0, P3, coords, centers, reverse); - } - } else { - if (P1 != null && P2 != null) { - drawOnBezierCurve(firstBase, lastBase, P0, P1, P2, P3, coords, centers, false); - } else { - drawOnStraightLine(firstBase, lastBase, P0, P3, coords, centers, false); - } - } - } - // Now use the radiate algorithm to draw the helixes - for (int k=0; k tree, // IN - Map translateVectors, // OUT (must be initialized) - RNATemplateMapping mapping, // IN - Point2D.Double parentDeltaVector, // IN - boolean straightBulges - ) { - RNANodeValueTemplate nvt = tree.getValue(); - Point2D.Double newDeltaVector = parentDeltaVector; - if (nvt instanceof RNANodeValueTemplateBasePair) { - RNATemplateHelix helix = ((RNANodeValueTemplateBasePair) nvt).getHelix(); - if (! translateVectors.containsKey(helix)) { - translateVectors.put(helix, parentDeltaVector); - int[] basesInHelixArray; - if (mapping.getAncestor(helix) != null) { - basesInHelixArray = RNATemplateAlign.intArrayFromList(mapping.getAncestor(helix)); - Arrays.sort(basesInHelixArray); - } else { - basesInHelixArray = new int[0]; - } - Point2D.Double helixDeltaVector = computeLengthIncreaseDelta(basesInHelixArray, helix, straightBulges); - newDeltaVector = new Point2D.Double(parentDeltaVector.x+helixDeltaVector.x, parentDeltaVector.y+helixDeltaVector.y); - } - } - for (Tree subtree: tree.getChildren()) { - computeHelixTranslations(subtree, translateVectors, mapping, newDeltaVector, straightBulges); - } - } - - private Map computeHelixTranslations( - Tree tree, // IN - RNATemplateMapping mapping, // IN - boolean straightBulges - ) { - Map translateVectors = new HashMap(); - computeHelixTranslations(tree, translateVectors, mapping, new Point2D.Double(0,0), straightBulges); - return translateVectors; - } -} diff --git a/src2/fr/orsay/lri/varna/models/rna/Mapping.java b/src2/fr/orsay/lri/varna/models/rna/Mapping.java deleted file mode 100644 index d9b952b..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/Mapping.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - 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.models.rna; - -import java.io.Serializable; -import java.util.Enumeration; -import java.util.Hashtable; - -import fr.orsay.lri.varna.exceptions.MappingException; - -public class Mapping implements Serializable { - - /** - * - */ - private static final long serialVersionUID = -3031358968555310380L; - - public static final int UNKNOWN = -1; - - Hashtable _mapping = new Hashtable(); - Hashtable _invMapping = new Hashtable(); - - public Mapping() { - - } - - public void addCouple(int i, int j) throws MappingException { - if (_mapping.containsKey(i) || _invMapping.containsKey(j)) { - throw new MappingException( - MappingException.MULTIPLE_PARTNERS_DEFINITION_ATTEMPT); - } - - _mapping.put(new Integer(i), new Integer(j)); - _invMapping.put(new Integer(j), new Integer(i)); - } - - public int getPartner(int i) { - if (!_mapping.containsKey(i)) - return UNKNOWN; - else - return _mapping.get(i); - } - - public int getAncestor(int j) { - if (!_invMapping.containsKey(j)) - return UNKNOWN; - else - return _invMapping.get(j); - } - - public int[] getSourceElems() { - int[] elems = new int[_mapping.size()]; - Enumeration en = _mapping.keys(); - int i = 0; - while (en.hasMoreElements()) { - int a = en.nextElement(); - elems[i] = a; - i++; - } - return elems; - } - - public int[] getTargetElems() { - int[] elems = new int[_invMapping.size()]; - Enumeration en = _invMapping.keys(); - int i = 0; - while (en.hasMoreElements()) { - int a = en.nextElement(); - elems[i] = a; - i++; - } - return elems; - } - - public static Mapping readMappingFromAlignment(String m, String n) - throws MappingException { - Mapping map = new Mapping(); - if (m.length() != n.length()) { - throw new MappingException(MappingException.BAD_ALIGNMENT_INPUT); - } - int i = 0; - int j = 0; - for (int k = 0; k < m.length(); k++) { - char a = m.charAt(k); - char b = n.charAt(k); - if ((a != '-') && (a != ':') && (b != '-') && (b != ':')) { - map.addCouple(i, j); - } - - if ((a != '-') && (a != ':')) { - j++; - } - if ((b != '-') && (b != ':')) { - i++; - } - } - return map; - } - - public static Mapping DefaultMapping(int n, int m) { - Mapping map = new Mapping(); - try { - for (int i = 0; i < Math.min(n, m); i++) { - map.addCouple(i, i); - } - } catch (MappingException e) { - e.printStackTrace(); - } - return map; - } - - public static Mapping DefaultOutermostMapping(int n, int m) { - Mapping map = new Mapping(); - try { - int k = Math.min(n, m); - int i = 0; - int j = 0; - boolean pile = true; - while (i <= (k - 1) - j) { - if (pile) { - map.addCouple(i, i); - i++; - } else { - map.addCouple(n - 1 - j, m - 1 - j); - j++; - } - pile = !pile; - } - } catch (MappingException e) { - e.printStackTrace(); - } - // System.println(map); - return map; - } - - public String toString() { - Enumeration en = _mapping.keys(); - String tmp = ""; - int l1 = 0; - int l2 = 0; - int maxIndex = 0; - while (en.hasMoreElements()) { - Integer i = en.nextElement(); - Integer j = _mapping.get(i); - l1 = Math.max(l1,i); - l2 = Math.max(l2,j); - tmp += "("+i+","+j+")"; - } - maxIndex = Math.max(maxIndex,Math.max(l1,l2)); - String tmp1 = ""; - String tmp2 = ""; - en = _mapping.keys(); - - int i = l1; - int j = l2; - while (en.hasMoreElements()) { - Integer a = en.nextElement(); - Integer b = _mapping.get(a); - while(a namesArray = new ArrayList(); - ArrayList valuesArray = new ArrayList(); - String[] param; - for (int i = 0; i < parametersL.length; i++) { - param = parametersL[i].split("="); - if (param.length != 2) - throw new ExceptionModeleStyleBaseSyntaxError( - "Bad parameter: '" + param[0] + "' ..."); - namesArray.add(param[0].replace(" ", "")); - valuesArray.add(param[1].replace(" ", "")); - - } - - for (int i = 0; i < namesArray.size(); i++) { - if (namesArray.get(i).toLowerCase().equals(PARAM_INNER_COLOR)) { - try { - setBaseInnerColor(getSafeColor(valuesArray.get(i))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), - "Bad inner color Syntax:" + valuesArray.get(i)); - } - } else if (namesArray.get(i).toLowerCase().equals(PARAM_TEXT_COLOR)) { - try { - setBaseNameColor(getSafeColor(valuesArray.get(i))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), - "Bad name color Syntax:" + valuesArray.get(i)); - } - } else if (namesArray.get(i).toLowerCase().equals( - PARAM_NUMBER_COLOR)) { - try { - setBaseNumberColor(getSafeColor(valuesArray.get(i))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), - "Bad numbers color Syntax:" + valuesArray.get(i)); - } - } else if (namesArray.get(i).toLowerCase().equals( - PARAM_OUTLINE_COLOR)) { - try { - setBaseOutlineColor(getSafeColor(valuesArray.get(i))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), - "Bad outline color Syntax:" + valuesArray.get(i)); - } - } else - throw new ExceptionModeleStyleBaseSyntaxError( - "Unknown parameter:" + namesArray.get(i)); - } - } - - /** - * Find the font style integer from a string. Return null if - * the font style is unknown. - * - * @param s - * The string to decode - * @return The font style integer as Font.PLAIN. - */ - public static Integer StyleToInteger(String s) { - Integer style; - if (s.toLowerCase().equals("italic")) - style = Font.ITALIC; - else if (s.toLowerCase().equals("bold")) - style = Font.BOLD; - else if (s.toLowerCase().equals("plain")) - style = Font.PLAIN; - else - style = null; - return style; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/rna/ModeleBP.java b/src2/fr/orsay/lri/varna/models/rna/ModeleBP.java deleted file mode 100644 index 138edb0..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/ModeleBP.java +++ /dev/null @@ -1,331 +0,0 @@ -/* - 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.models.rna; - -import java.awt.Color; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Random; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.exceptions.ExceptionModeleStyleBaseSyntaxError; -import fr.orsay.lri.varna.exceptions.ExceptionParameterError; -import fr.orsay.lri.varna.models.VARNAConfig; - - -public class ModeleBP implements Serializable, Comparable { - - /** - * - */ - private static final long serialVersionUID = -1344722280822711931L; - - public enum Edge { - WC, SUGAR, HOOGSTEEN; - } - public enum Stericity { - CIS, TRANS; - } - - private ModeleBase _partner5; - private Edge _edge5; - private ModeleBase _partner3; - private Edge _edge3; - private Stericity _stericity; - private ModeleBPStyle _style; - - - public static String XML_ELEMENT_NAME = "bp"; - public static String XML_VAR_PARTNER5_NAME = "part5"; - public static String XML_VAR_EDGE5_NAME = "edge5"; - public static String XML_VAR_PARTNER3_NAME = "part3"; - public static String XML_VAR_EDGE3_NAME = "edge3"; - public static String XML_VAR_STERICITY_NAME = "orient"; - public static String XML_VAR_SEC_STR_NAME = "secstr"; - - public void toXML(TransformerHandler hd, boolean inSecondaryStructure) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("","",XML_VAR_PARTNER5_NAME,"CDATA",""+_partner5.getIndex()); - atts.addAttribute("","",XML_VAR_PARTNER3_NAME,"CDATA",""+_partner3.getIndex()); - atts.addAttribute("","",XML_VAR_EDGE5_NAME,"CDATA",""+_edge5); - atts.addAttribute("","",XML_VAR_EDGE3_NAME,"CDATA",""+_edge3); - atts.addAttribute("","",XML_VAR_STERICITY_NAME,"CDATA",""+_stericity); - atts.addAttribute("","",XML_VAR_SEC_STR_NAME,"CDATA",""+inSecondaryStructure); - hd.startElement("","",XML_ELEMENT_NAME,atts); - _style.toXML(hd); - hd.endElement("","",XML_ELEMENT_NAME); - } - - public void toXML(TransformerHandler hd) throws SAXException - { - toXML(hd, false); - } - - - - public ModeleBP(ModeleBase part5, ModeleBase part3) { - this(part5, part3, Edge.WC, Edge.WC, Stericity.CIS); - } - - //private static Random rnd = new Random(System.currentTimeMillis()); - - public ModeleBP(ModeleBase part5, ModeleBase part3, Edge edge5, - Edge edge3, Stericity ster) { - _partner5 = part5; - _partner3 = part3; - _edge5 = edge5; - _edge3 = edge3; - _stericity = ster; - _style = new ModeleBPStyle(); - } - - public ModeleBP(String text) throws ExceptionModeleStyleBaseSyntaxError, ExceptionParameterError { - _style = new ModeleBPStyle(); - assignParameters(text); - } - - public void setStericity(Stericity s) { - _stericity = s; - } - - public void setEdge5(Edge e) { - _edge5 = e; - } - - public void setEdge3(Edge e) { - _edge3 = e; - } - - public void setStyle(ModeleBPStyle e) { - _style = e; - } - - public ModeleBPStyle getStyle() { - return _style; - } - - public boolean isCanonicalGC() { - String si = _partner5.getContent(); - String sj = _partner3.getContent(); - if ((si.length() >= 1) && (sj.length() >= 1)) { - char ci = si.toUpperCase().charAt(0); - char cj = sj.toUpperCase().charAt(0); - if (((ci == 'G') && (cj == 'C')) || ((ci == 'C') && (cj == 'G'))) { - return isCanonical() && (getStericity() == Stericity.CIS); - } - } - return false; - } - - public boolean isCanonicalAU() { - String si = _partner5.getContent(); - String sj = _partner3.getContent(); - if ((si.length() >= 1) && (sj.length() >= 1)) { - char ci = si.toUpperCase().charAt(0); - char cj = sj.toUpperCase().charAt(0); - if (((ci == 'A') && (cj == 'U')) - || ((ci == 'U') && (cj == 'A')) - || ((ci == 'U') && (cj == 'T')) - || ((ci == 'T') && (cj == 'U'))) { - return isCanonical(); - } - } - return false; - } - - public boolean isWobbleUG() { - String si = _partner5.getContent(); - String sj = _partner3.getContent(); - if ((si.length() >= 1) && (sj.length() >= 1)) { - char ci = si.toUpperCase().charAt(0); - char cj = sj.toUpperCase().charAt(0); - if (((ci == 'G') && (cj == 'U')) || ((ci == 'U') && (cj == 'G'))) { - return (isCanonical()); - } - } - return false; - } - - public boolean isCanonical() { - return (_edge5 == Edge.WC) && (_edge3 == Edge.WC) - && (_stericity == Stericity.CIS); - } - - public Stericity getStericity() { - return _stericity; - } - - public boolean isCIS() { - return (_stericity == Stericity.CIS); - } - - public boolean isTRANS() { - return (_stericity == Stericity.TRANS); - } - - public Edge getEdgePartner5() { - return _edge5; - } - - public Edge getEdgePartner3() { - return _edge3; - } - - public ModeleBase getPartner(ModeleBase mb) { - if (mb == _partner3) - return _partner5; - else - return _partner3; - } - - public ModeleBase getPartner5() { - return _partner5; - } - - public ModeleBase getPartner3() { - return _partner3; - } - - public int getIndex5() { - return _partner5.getIndex(); - } - - public int getIndex3() { - return _partner3.getIndex(); - } - - public void setPartner5(ModeleBase mb) { - _partner5 = mb; - } - - public void setPartner3(ModeleBase mb) { - _partner3 = mb; - } - - - - public static final String PARAM_COLOR = "color"; - public static final String PARAM_THICKNESS = "thickness"; - public static final String PARAM_EDGE5 = "edge5"; - public static final String PARAM_EDGE3 = "edge3"; - public static final String PARAM_STERICITY = "stericity"; - - public static final String VALUE_WATSON_CRICK = "wc"; - public static final String VALUE_HOOGSTEEN = "h"; - public static final String VALUE_SUGAR = "s"; - public static final String VALUE_CIS = "cis"; - public static final String VALUE_TRANS = "trans"; - - public void assignParameters(String parametersValue) - throws ExceptionModeleStyleBaseSyntaxError, ExceptionParameterError { - if (parametersValue.equals("")) - return; - - String[] parametersL = parametersValue.split(","); - - ArrayList namesArray = new ArrayList(); - ArrayList valuesArray = new ArrayList(); - String[] param; - for (int i = 0; i < parametersL.length; i++) { - param = parametersL[i].split("="); - if (param.length != 2) - throw new ExceptionModeleStyleBaseSyntaxError( - "Bad parameter: '" + param[0] + "' ..."); - namesArray.add(param[0].replace(" ", "")); - valuesArray.add(param[1].replace(" ", "")); - - } - for (int i = 0; i < namesArray.size(); i++) { - if (namesArray.get(i).toLowerCase().equals(PARAM_COLOR)) { - try { - _style.setCustomColor(ModelBaseStyle - .getSafeColor(valuesArray.get(i))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), - "Bad inner color Syntax:" + valuesArray.get(i)); - } - } else if (namesArray.get(i).toLowerCase().equals(PARAM_THICKNESS)) { - try { - _style.setThickness(Double.parseDouble(valuesArray.get(i))); - } catch (NumberFormatException e) { - throw new ExceptionParameterError(e.getMessage(), - "Bad value for bp thickness:" + valuesArray.get(i)); - } - } else if (namesArray.get(i).toLowerCase().equals(PARAM_EDGE5)) { - String s = valuesArray.get(i); - if (s.toLowerCase().equals(VALUE_WATSON_CRICK)) { - setEdge5(Edge.WC); - } else if (s.toLowerCase().equals(VALUE_HOOGSTEEN)) { - setEdge5(Edge.HOOGSTEEN); - } else if (s.toLowerCase().equals(VALUE_SUGAR)) { - setEdge5(Edge.SUGAR); - } else - throw new ExceptionParameterError("Bad value for edge:" - + valuesArray.get(i)); - } else if (namesArray.get(i).toLowerCase().equals(PARAM_EDGE3)) { - String s = valuesArray.get(i); - if (s.toLowerCase().equals(VALUE_WATSON_CRICK)) { - setEdge3(Edge.WC); - } else if (s.toLowerCase().equals(VALUE_HOOGSTEEN)) { - setEdge3(Edge.HOOGSTEEN); - } else if (s.toLowerCase().equals(VALUE_SUGAR)) { - setEdge3(Edge.SUGAR); - } else - throw new ExceptionParameterError("Bad value for edge:" - + valuesArray.get(i)); - } else if (namesArray.get(i).toLowerCase().equals(PARAM_STERICITY)) { - String s = valuesArray.get(i); - if (s.toLowerCase().equals(VALUE_CIS)) { - setStericity(Stericity.CIS); - } else if (s.toLowerCase().equals(VALUE_TRANS)) { - setStericity(Stericity.TRANS); - } else - throw new ExceptionParameterError( - "Bad value for stericity:" + valuesArray.get(i)); - } else - throw new ExceptionModeleStyleBaseSyntaxError( - "Unknown parameter:" + namesArray.get(i)); - } - } - - public String toString() { - String result = ""; - result += "(" + _partner5.getIndex() + "," + _partner3.getIndex() + ")"; - //result += " [" + _partner5.getElementStructure() + "," - // + _partner3.getElementStructure() + "]\n"; - //result += " 5':" + _partner5 + "\n"; - //result += " 3':" + _partner3; - return result; - } - - - public int compareTo(ModeleBP mb) { - if (getIndex5()!=mb.getIndex5()) - { return getIndex5()-mb.getIndex5(); } - return getIndex3()-mb.getIndex3(); - - } - - - -} diff --git a/src2/fr/orsay/lri/varna/models/rna/ModeleBPStyle.java b/src2/fr/orsay/lri/varna/models/rna/ModeleBPStyle.java deleted file mode 100644 index f5b7398..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/ModeleBPStyle.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - 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.models.rna; - -import java.awt.Color; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Random; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.exceptions.ExceptionModeleStyleBaseSyntaxError; -import fr.orsay.lri.varna.exceptions.ExceptionParameterError; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.utils.XMLUtils; - - -public class ModeleBPStyle implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3006493290669550139L; - /** - * - */ - private boolean _isCustomColored = false; - private Color _color = VARNAConfig.DEFAULT_BOND_COLOR; - - private double _thickness = -1.0; - private double _bent = 0.0; - - public static String XML_ELEMENT_NAME = "BPstyle"; - public static String XML_VAR_CUSTOM_STYLED_NAME = "custom"; - public static String XML_VAR_COLOR_NAME = "color"; - public static String XML_VAR_THICKNESS_NAME = "thickness"; - public static String XML_VAR_BENT_NAME = "bent"; - - public void toXML(TransformerHandler hd) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("","",XML_VAR_CUSTOM_STYLED_NAME,"CDATA",""+_isCustomColored); - atts.addAttribute("","",XML_VAR_COLOR_NAME,"CDATA",XMLUtils.toHTMLNotation(_color)); - atts.addAttribute("","",XML_VAR_THICKNESS_NAME,"CDATA",""+_thickness); - atts.addAttribute("","",XML_VAR_BENT_NAME,"CDATA",""+_bent); - hd.startElement("","",XML_ELEMENT_NAME,atts); - hd.endElement("","",XML_ELEMENT_NAME); - } - - - public double getBent() - { - return _bent; - } - - - public boolean isBent() - { - return (_bent!=0.0); - } - - public void setBent(double b) - { - _bent = b; - } - - - public ModeleBPStyle() { - } - - - public void setCustomColor(Color c) { - _isCustomColored = true; - _color = c; - } - - public void useDefaultColor() { - _isCustomColored = false; - } - - public boolean isCustomColored() { - return _isCustomColored; - } - - public Color getCustomColor() { - return _color; - } - - /** - * Returns the current custom color if such a color is defined to be used - * (through setCustomColor), or returns the default color. - * - * @param def - * - The default color is no custom color is defined - * @return The color to be used to draw this base-pair - */ - public Color getColor(Color def) { - if (isCustomColored()) { - return _color; - } else { - return def; - } - } - - public double getThickness(double def) { - if (_thickness > 0) - return _thickness; - else - return def; - } - - public void setThickness(double thickness) { - _thickness = thickness; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/rna/ModeleBackbone.java b/src2/fr/orsay/lri/varna/models/rna/ModeleBackbone.java deleted file mode 100644 index caa4b5f..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/ModeleBackbone.java +++ /dev/null @@ -1,75 +0,0 @@ -package fr.orsay.lri.varna.models.rna; - -import java.awt.Color; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Hashtable; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.models.rna.ModeleBackboneElement.BackboneType; -import fr.orsay.lri.varna.utils.XMLUtils; - -public class ModeleBackbone implements Serializable{ - - /** - * - */ - private Hashtable elems = new Hashtable(); - - private static final long serialVersionUID = -614968737102943216L; - - - - public static String XML_ELEMENT_NAME = "backbone"; - - public void toXML(TransformerHandler hd) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - hd.startElement("","",XML_ELEMENT_NAME,atts); - for (ModeleBackboneElement bck:elems.values()) - { - bck.toXML(hd); - } - hd.endElement("","",XML_ELEMENT_NAME); - atts.clear(); - } - - public void addElement(ModeleBackboneElement mbe) - { - elems.put(mbe.getIndex(),mbe); - } - - public BackboneType getTypeBefore(int indexBase) - { - return getTypeAfter(indexBase-1); - } - - public BackboneType getTypeAfter(int indexBase) - { - if (elems.containsKey(indexBase)) - return elems.get(indexBase).getType(); - else - return BackboneType.SOLID_TYPE; - } - - public Color getColorBefore(int indexBase, Color defCol) - { - return getColorAfter(indexBase-1,defCol); - } - - public Color getColorAfter(int indexBase, Color defCol) - { - if (elems.containsKey(indexBase)) - { - Color c = elems.get(indexBase).getColor(); - if (c != null) - return c; - } - return defCol; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/rna/ModeleBackboneElement.java b/src2/fr/orsay/lri/varna/models/rna/ModeleBackboneElement.java deleted file mode 100644 index 6b16a05..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/ModeleBackboneElement.java +++ /dev/null @@ -1,106 +0,0 @@ -package fr.orsay.lri.varna.models.rna; - -import java.awt.Color; -import java.io.Serializable; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.utils.XMLUtils; - -public class ModeleBackboneElement implements Serializable{ - - /** - * - */ - private static final long serialVersionUID = -614968737102943216L; - - public ModeleBackboneElement(int index, BackboneType t) - { - _index=index; - if (t==BackboneType.CUSTOM_COLOR) - { - throw new IllegalArgumentException("Error: Missing Color while constructing Backbone"); - } - _type=t; - } - - public ModeleBackboneElement(int index, Color c) - { - _index=index; - _type=BackboneType.CUSTOM_COLOR; - _color = c; - } - - public enum BackboneType{ - SOLID_TYPE ("solid"), - DISCONTINUOUS_TYPE ("discontinuous"), - MISSING_PART_TYPE ("missing"), - CUSTOM_COLOR ("custom"); - - private String label; - - BackboneType(String s) - { - label = s; - } - - public String getLabel() - { - return label; - } - - - public static BackboneType getType(String lbl) - { - BackboneType[] vals = BackboneType.values(); - for(int i=0;i { - - private ModeleBP _BP; - /** - * The base style. - */ - protected ModelBaseStyle _styleBase = new ModelBaseStyle(); - /** - * TRUE if this InterfaceBase has to be colored, else FALSE. - */ - protected Boolean _colorie = new Boolean(true); - /** - * The coordinate representation of this InterfaceBase on the final graphic. - */ - protected VARNAPoint _coords = new VARNAPoint(); - /** - * The nearest loop center of this InterfaceBase. - */ - protected VARNAPoint _center = new VARNAPoint(); - - /** - * The label of this base. - */ - protected String _label = ""; - - protected double _value; - protected int _realIndex = -1; - - public abstract void toXML(TransformerHandler hd) throws SAXException; - - - - /** - * The internal index for this Base - */ - public abstract int getIndex(); - - public abstract String getContent(); - public abstract void setContent(String s); - - /** - * Gets this InterfaceBase style. - * - * @return this InterfaceBase style. - */ - public ModelBaseStyle getStyleBase() { - return _styleBase; - } - - public double getValue() - { - return _value; - } - - public void setValue(double d) - { - _value = d; - } - - - /** - * Sets this InterfaceBase style. - * - * @param base - * - This InterfaceBase new style. - */ - public void setStyleBase(ModelBaseStyle base) { - _styleBase = new ModelBaseStyle(base); - } - - /** - * Gets this InterfaceBase color statement. - * - * @return TRUE if this InterfaceBase has to be colored, else FALSE. - */ - public final Boolean getColorie() { - return _colorie; - } - - /** - * Sets this InterfaceBase color statement. - * - * @param _colorie - * - TRUE if you want this InterfaceBase to be colored, else - * FALSE - */ - public final void setColorie(Boolean _colorie) { - this._colorie = _colorie; - } - - - /** - * Gets this InterfaceBase associated structure element. - * - * @return this InterfaceBase associated structure element. - */ - public int getElementStructure() { - if (_BP==null) - return -1; - else - { - if (_BP.getPartner5()==this) - return _BP.getPartner3().getIndex(); - else - return _BP.getPartner5().getIndex(); - } - } - - - /** - * Sets this InterfaceBase assiocated structure element. - * - * @param structure - * - This new assiocated structure element. - - public void setElementStructure(int structure) { - setElementStructure(structure, new ModeleBP()); - } */ - - /** - * Sets this InterfaceBase associated structure element. - * - * @param structure - * - This new associated structure element. - * @param type - * - The type of this base pair. - */ - public void setElementStructure(int structure, ModeleBP type) { -// _elementStructure = structure; - _BP = type; - - } - - public void removeElementStructure() { -// _elementStructure = -1; - _BP = null; - } - - - /** - * Gets the base pair type for this element. - * - * @return the base pair type for this element. - */ - public ModeleBP getStyleBP() { - return _BP; - } - - /** - * Sets the base pair type for this element. - * - * @param type - * - The new base pair type for this element. - */ - public void setStyleBP(ModeleBP type) { - _BP = type; - } - - public int getBaseNumber() { - return _realIndex; - } - - public void setBaseNumber(int bn) { - _realIndex = bn; - } - - public Point2D.Double getCoords() { - return new Point2D.Double(_coords.x,_coords.y); - } - - public void setCoords(Point2D.Double coords) { - this._coords.x = coords.x; - this._coords.y = coords.y; - } - - public Point2D.Double getCenter() { - return new Point2D.Double(_center.x,_center.y); - } - - public void setCenter(Point2D.Double center) { - this._center.x = center.x; - this._center.y = center.y; - } - - public String getLabel() { - if (_label==null || _label.equals("")) - { - return ""+this.getBaseNumber(); - } - else - { - return _label; - } - - } - - public void setLabel(String s) { - _label= s; - } - - public void setLabel(Point2D.Double center) { - this._center.x = center.x; - this._center.y = center.y; - } - - - public int compareTo(ModeleBase other) { - int nombre1 = ((ModeleBase) other).getIndex(); - int nombre2 = this.getIndex(); - if (nombre1 > nombre2) return -1; - else if(nombre1 == nombre2) return 0; - else return 1; - } - - public static String XML_VAR_TYPE_NAME = "type"; - public static String XML_VAR_INDEX_NAME = "index"; - public static String XML_VAR_LABEL_NAME = "label"; - public static String XML_VAR_VALUE_NAME = "val"; - public static String XML_VAR_POSITION_NAME = "pos"; - public static String XML_VAR_CENTER_NAME = "center"; - public static String XML_VAR_NUMBER_NAME = "num"; - public static String XML_VAR_CUSTOM_DRAWN_NAME = "custom"; - - -} diff --git a/src2/fr/orsay/lri/varna/models/rna/ModeleBaseNucleotide.java b/src2/fr/orsay/lri/varna/models/rna/ModeleBaseNucleotide.java deleted file mode 100644 index ad0c5c1..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/ModeleBaseNucleotide.java +++ /dev/null @@ -1,408 +0,0 @@ -/* - 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.models.rna; - -import java.awt.geom.Point2D; -import java.util.HashMap; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.utils.XMLUtils; - - -/** - * The rna base model with the first character of the nitrogenous base and it - * display - * - * @author darty - * - */ -public class ModeleBaseNucleotide extends ModeleBase { - - /** - * - */ - private static final long serialVersionUID = -5493938366569588113L; - private String _c; - private int _index; - - - - public static String XML_ELEMENT_NAME = "nt"; - public static String XML_VAR_CONTENT_NAME = "base"; - - - public void toXML(TransformerHandler hd) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("","",XML_VAR_INDEX_NAME,"CDATA",""+_index); - atts.addAttribute("","",XML_VAR_NUMBER_NAME,"CDATA",""+_realIndex); - atts.addAttribute("","",XML_VAR_CUSTOM_DRAWN_NAME,"CDATA",""+_colorie); - atts.addAttribute("","",XML_VAR_VALUE_NAME,"CDATA",""+_value); - atts.addAttribute("","",XML_VAR_LABEL_NAME,"CDATA",""+_label); - hd.startElement("","",XML_ELEMENT_NAME,atts); - atts.clear(); - hd.startElement("","",XML_VAR_CONTENT_NAME,atts); - XMLUtils.exportCDATAString(hd, _c); - hd.endElement("","",XML_VAR_CONTENT_NAME); - - _coords.toXML(hd,XML_VAR_POSITION_NAME); - _center.toXML(hd,XML_VAR_CENTER_NAME); - if (_colorie) - { _styleBase.toXML(hd); } - hd.endElement("","",XML_ELEMENT_NAME); - } - - /** - * Creates a new rna base with the default display style and a space as - * nitrogenous base - * @param index The index of this base - */ - public ModeleBaseNucleotide(int index) { - this(" ", index); - } - - /** - * Creates a new rna base with the nitrogenous base - * - * @param s - * The code of this base - * @param index The index of this base - */ - public ModeleBaseNucleotide(String s, int index) { - this(s, new ModelBaseStyle(), index); - } - - - /** - * Creates a new rna base with the nitrogenous base - * - * @param s - * The full label, potentially requiring further decoding - * @param index The index of this base - * @param baseNumber The number of this base, which may differ from the index (e.g. discontinuous numbering) - */ - public ModeleBaseNucleotide(String s, int index, int baseNumber) { - this(s, new ModelBaseStyle(), index); - _realIndex = baseNumber; - } - - /** - * Creates a new rna base with the nitrogenous base and the display style - * - * @param s - * The full label, potentially requiring further decoding - * @param msb - * The display style - * @param index The index of this base - */ - public ModeleBaseNucleotide(String s, ModelBaseStyle msb, int index) { - this(new Point2D.Double(), new Point2D.Double(), true, s, msb, -1, - index); - } - - /** - * Creates a new rna base with a display style - * - * @param msb - * The display style - */ - public ModeleBaseNucleotide(ModelBaseStyle msb, int index, int baseNumber) { - this("", msb, index); - _realIndex = baseNumber; - } - - /** - * Creates a new rna base with a space as the nitrogenous base and the - * display style - * - * @param coord - * @param index - */ - public ModeleBaseNucleotide(Point2D.Double coord, int index) { - this(new Point2D.Double(coord.getX(), coord.getY()), - new Point2D.Double(), true, "", new ModelBaseStyle(), -1, - index); - } - - /** - * Creates a new rna base from another one with the same attributes - * - * @param mb - * The base to copy - */ - public ModeleBaseNucleotide(ModeleBaseNucleotide mb, int index) { - this( - new Point2D.Double(mb.getCoords().getX(), mb.getCoords() - .getY()), new Point2D.Double(mb.getCenter().getX(), mb - .getCenter().getY()), true, mb.getBase(), mb - .getStyleBase(), mb.getElementStructure(), index); - } - - public ModeleBaseNucleotide(Point2D.Double coords, Point2D.Double center, - boolean colorie, String label, ModelBaseStyle mb, int elementStruct, - int index) { - _colorie = colorie; - _c = label; - _styleBase = mb; - _coords = new VARNAPoint(coords); - _center = new VARNAPoint(center); - _index = index; - _realIndex = index + 1; - _value = 0.0; - } - - - public ModelBaseStyle getStyleBase() { - if (_colorie) - return _styleBase; - return new ModelBaseStyle(); - } - - public String getBase() { - return decode(_c); - } - - public void setBase(String _s) { - this._c = _s; - } - - - - public String getContent() { - return getBase(); - } - - public void setContent(String s) { - setBase(s); - } - - public int getIndex() { - return _index; - } - - public String toString() - { - return ""+this._realIndex+" ("+_index+") (x,y):"+this._coords +" C:"+_center; - } - - - private enum STATE_SPECIAL_CHARS_STATES{ NORMAL,SUBSCRIPT, SUPERSCRIPT, COMMAND}; - - private static HashMap _subscripts = new HashMap(); - private static HashMap _superscripts = new HashMap(); - private static HashMap _commands = new HashMap(); - { - _subscripts.put('0', '\u2080'); - _subscripts.put('1', '\u2081'); - _subscripts.put('2', '\u2082'); - _subscripts.put('3', '\u2083'); - _subscripts.put('4', '\u2084'); - _subscripts.put('5', '\u2085'); - _subscripts.put('6', '\u2086'); - _subscripts.put('7', '\u2087'); - _subscripts.put('8', '\u2088'); - _subscripts.put('9', '\u2089'); - _subscripts.put('+', '\u208A'); - _subscripts.put('-', '\u208B'); - _subscripts.put('a', '\u2090'); - _subscripts.put('e', '\u2091'); - _subscripts.put('o', '\u2092'); - _subscripts.put('i', '\u1D62'); - _subscripts.put('r', '\u1D63'); - _subscripts.put('u', '\u1D64'); - _subscripts.put('v', '\u1D65'); - _subscripts.put('x', '\u2093'); - _superscripts.put('0', '\u2070'); - _superscripts.put('1', '\u00B9'); - _superscripts.put('2', '\u00B2'); - _superscripts.put('3', '\u00B3'); - _superscripts.put('4', '\u2074'); - _superscripts.put('5', '\u2075'); - _superscripts.put('6', '\u2076'); - _superscripts.put('7', '\u2077'); - _superscripts.put('8', '\u2078'); - _superscripts.put('9', '\u2079'); - _superscripts.put('+', '\u207A'); - _superscripts.put('-', '\u207B'); - _superscripts.put('i', '\u2071'); - _superscripts.put('n', '\u207F'); - _commands.put("alpha", '\u03B1'); - _commands.put("beta", '\u03B2'); - _commands.put("gamma", '\u03B3'); - _commands.put("delta", '\u03B4'); - _commands.put("epsilon",'\u03B5'); - _commands.put("zeta", '\u03B6'); - _commands.put("eta", '\u03B7'); - _commands.put("theta", '\u03B8'); - _commands.put("iota", '\u03B9'); - _commands.put("kappa", '\u03BA'); - _commands.put("lambda", '\u03BB'); - _commands.put("mu", '\u03BC'); - _commands.put("nu", '\u03BD'); - _commands.put("xi", '\u03BE'); - _commands.put("omicron",'\u03BF'); - _commands.put("pi", '\u03C1'); - _commands.put("rho", '\u03C2'); - _commands.put("sigma", '\u03C3'); - _commands.put("tau", '\u03C4'); - _commands.put("upsilon",'\u03C5'); - _commands.put("phi", '\u03C6'); - _commands.put("chi", '\u03C7'); - _commands.put("psi", '\u03C8'); - _commands.put("omega", '\u03C9'); - _commands.put("Psi", '\u03A8'); - _commands.put("Phi", '\u03A6'); - _commands.put("Sigma", '\u03A3'); - _commands.put("Pi", '\u03A0'); - _commands.put("Theta", '\u0398'); - _commands.put("Omega", '\u03A9'); - _commands.put("Gamma", '\u0393'); - _commands.put("Delta", '\u0394'); - _commands.put("Lambda", '\u039B'); - } - - - - private static String decode(String s) - { - if (s.length()<=1) - { - return s; - } - STATE_SPECIAL_CHARS_STATES state = STATE_SPECIAL_CHARS_STATES.NORMAL; - - String result = ""; - String buffer = ""; - for(int i=0;iThe RNA base comparison model. In each bases we'll place two - * characters representing nitrogenous bases of both RNA that have to be - * compared. So, in each base in the comparison model, we'll have a couple of - * bases, with the same coordinates on the final drawing. - * - * @author Masson - * - */ -public class ModeleBasesComparison extends ModeleBase { - - /* - * LOCAL FIELDS - */ - - /** - * - */ - private static final long serialVersionUID = -2733063250714562463L; - - /** - * The base of the first RNA associated with the base of the second RNA. - */ - private Character _base1; - - /** - * The base of the second RNA associated with the base of the first RNA. - */ - private Character _base2; - - /** - * This ModeleBasesComparison owning statement. It's value will be 0 if this - * base is common for both RNA that had been compared, 1 if this base is - * related to the first RNA, 2 if related to the second. Default is -1. - */ - private int _appartenance = -1; - - /** - * This base's offset in the sequence - */ - private int _index; - - public static String XML_ELEMENT_NAME = "NTPair"; - public static String XML_VAR_FIRST_CONTENT_NAME = "base1"; - public static String XML_VAR_SECOND_CONTENT_NAME = "base2"; - public static String XML_VAR_MEMBERSHIP_NAME = "type"; - - - - public void toXML(TransformerHandler hd) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("","",XML_VAR_INDEX_NAME,"CDATA",""+_index); - atts.addAttribute("","",XML_VAR_NUMBER_NAME,"CDATA",""+_realIndex); - atts.addAttribute("","",XML_VAR_CUSTOM_DRAWN_NAME,"CDATA",""+_colorie); - atts.addAttribute("","",XML_VAR_LABEL_NAME,"CDATA",""+_label); - atts.addAttribute("","",XML_VAR_MEMBERSHIP_NAME,"CDATA",""+_appartenance); - atts.addAttribute("","","VALUE","CDATA",""+_value); - hd.startElement("","",XML_ELEMENT_NAME,atts); - atts.clear(); - hd.startElement("","",XML_VAR_FIRST_CONTENT_NAME,atts); - XMLUtils.exportCDATAString(hd, ""+_base1); - hd.endElement("","",XML_VAR_FIRST_CONTENT_NAME); - atts.clear(); - hd.startElement("","",XML_VAR_SECOND_CONTENT_NAME,atts); - XMLUtils.exportCDATAString(hd, ""+_base2); - hd.endElement("","",XML_VAR_SECOND_CONTENT_NAME); - - _coords.toXML(hd,XML_VAR_POSITION_NAME); - _center.toXML(hd,XML_VAR_CENTER_NAME); - if (_colorie) - { _styleBase.toXML(hd); } - hd.endElement("","",XML_ELEMENT_NAME); - - } - - - /* - * -> END LOCAL FIELDS <-- - */ - - public static Color FIRST_RNA_COLOR = Color.decode("#FFDD99"); - public static Color SECOND_RNA_COLOR = Color.decode("#99DDFF"); - public static Color BOTH_RNA_COLOR = Color.decode("#99DD99"); - public static Color DEFAULT_RNA_COLOR = Color.white; - - /* - * CONSTRUCTORS - */ - - /** - * Creates a new comparison base with the default display style and no - * nitrogenous bases. - */ - public ModeleBasesComparison(int index) { - this(' ', ' ', index); - } - - /** - * Creates a new comparison base at the specified coordinates, with the - * default display style and no nitrogenous bases. - * - * @param coords - * - The coordinates in which the comparison base has to be - * placed. - */ - public ModeleBasesComparison(Point2D coords, int index) { - this(' ', ' ', new Point2D.Double(coords.getX(), coords.getY()), index); - } - - /** - * Creates a new comparison base with the specified nitrogenous bases. - * - * @param base1 - * - The first RNA' nitrogenous base - * @param base2 - * - The second RNA' nitrogenous base - */ - public ModeleBasesComparison(char base1, char base2, int index) { - this(base1, base2, -1, index); - } - - /** - * Creates a new comparison base with the specified nitrogenous bases, at - * the specified coordinates. - * - * @param base1 - * - The first RNA' nitrogenous base - * @param base2 - * - The second RNA' nitrogenous base - * @param coords - * - The coordinates in which the comparison base has to be - * placed. - */ - public ModeleBasesComparison(char base1, char base2, Point2D coords, - int index) { - this(new Point2D.Double(coords.getX(), coords.getY()), base1, base2, - true, new ModelBaseStyle(), -1, index); - } - - /** - * Creates a new comparison base with the specified nitrogenous bases. - * - * @param base1 - * - The first RNA' nitrogenous base - * @param base2 - * - The second RNA' nitrogenous base - */ - public ModeleBasesComparison(char base1, char base2, int elementStructure, - int index) { - this(new Point2D.Double(), base1, base2, true, new ModelBaseStyle(), - elementStructure, index); - } - - /** - * Creates a new comparison base with the specified nitrogenous bases. - * - * @param coords - * - This base's XY coordinates - * @param base1 - * - The first RNA' nitrogenous base - * @param base2 - * - The second RNA' nitrogenous base - * @param colorie - * - Whether or not this base will be drawn - * @param mb - * - The drawing style for this base - * @param elementStructure - * - The index of a bp partner in the secondary structure - * @param index - * - Index of this base in its initial sequence - */ - public ModeleBasesComparison(Point2D coords, char base1, char base2, - boolean colorie, ModelBaseStyle mb, int elementStructure, int index) { - _colorie = colorie; - _base1 = base1; - _base2 = base2; - _styleBase = mb; - _coords = new VARNAPoint(coords.getX(), coords.getY()); - _index = index; - } - - /* - * -> END CONSTRUCTORS <-- - */ - - /* - * GETTERS & SETTERS - */ - - /** - * Return the display style associated to this comparison base. - * - * @return The display style associated to this comparison base. - */ - public ModelBaseStyle getStyleBase() { - if (_colorie) - return _styleBase; - return new ModelBaseStyle(); - } - - /** - * Allows to know if this comparison base is colored. - * - * @return TRUE if this comparison base is colored, else FALSE. - */ - public Boolean getColored() { - return _colorie; - } - - /** - * Sets the coloration authorization of this comparison base. - * - * @param colored - * - TRUE if this comparison base has to be colored, else FALSE. - */ - public void set_colored(Boolean colored) { - this._colorie = colored; - } - - - /** - * Return the base of the first RNA in this comparison base. - * - * @return The base of the first RNA in this comparison base. - */ - public Character getBase1() { - return _base1; - } - - /** - * Sets the base of the first RNA in this comparison base. - * - * @param _base1 - * - The base of the first RNA in this comparison base. - */ - public void setBase1(Character _base1) { - this._base1 = _base1; - } - - /** - * Return the base of the second RNA in this comparison base. - * - * @return The base of the second RNA in this comparison base. - */ - public Character getBase2() { - return _base2; - } - - /** - * Sets the base of the second RNA in this comparison base. - * - * @param _base2 - * - The base of the second RNA in this comparison base. - */ - public void setBase2(Character _base2) { - this._base2 = _base2; - } - - /* - * --> END GETTERS & SETTERS <-- - */ - - /** - * Gets the string representation of the two bases in this - * ModeleBasesComparison. - * - * @return the string representation of the two bases in this - * ModeleBasesComparison. - */ - public String getBases() { - return String.valueOf(_base1) + String.valueOf(_base2); - } - - public String getContent() { - return getBases(); - } - - - /** - * Gets this base's related RNA. - * - * @return 0 if this base is common for both RNA
- * 1 if this base is related to the first RNA
- * 2 if this base is related to the second RNA - */ - public int get_appartenance() { - return _appartenance; - } - - /** - * Sets this base's related RNA. - * - * @param _appartenance - * : 0 if this base is common for both RNA
- * 1 if this base is related to the first RNA
- * 2 if this base is related to the second RNA. - */ - public void set_appartenance(int _appartenance) { - if (_appartenance == 0) { - this.getStyleBase().setBaseInnerColor(BOTH_RNA_COLOR); - } else if (_appartenance == 1) { - this.getStyleBase().setBaseInnerColor(FIRST_RNA_COLOR); - } else if (_appartenance == 2) { - this.getStyleBase().setBaseInnerColor(SECOND_RNA_COLOR); - } else { - this.getStyleBase().setBaseInnerColor(DEFAULT_RNA_COLOR); - } - this._appartenance = _appartenance; - } - - - - public int getIndex() { - return _index; - } - - @Override - public void setContent(String s) { - this.setBase1(s.charAt(0)); - this.setBase2(s.charAt(1)); - } - -} diff --git a/src2/fr/orsay/lri/varna/models/rna/ModeleColorMap.java b/src2/fr/orsay/lri/varna/models/rna/ModeleColorMap.java deleted file mode 100644 index 9570ad4..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/ModeleColorMap.java +++ /dev/null @@ -1,357 +0,0 @@ -package fr.orsay.lri.varna.models.rna; - -import java.awt.Color; -import java.io.IOException; -import java.io.Reader; -import java.io.Serializable; -import java.io.StreamTokenizer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Formatter; -import java.util.Vector; - -public class ModeleColorMap implements Cloneable, Serializable{ - /** - * - */ - private static final long serialVersionUID = 4055062096061553106L; -private Vector _map; - private Vector _values; - - public static final Color DEFAULT_COLOR = Color.GREEN; - - public enum NamedColorMapTypes { - RED ("red",ModeleColorMap.redColorMap()), - BLUE ("blue",ModeleColorMap.blueColorMap()), - GREEN ("green",ModeleColorMap.greenColorMap()), - HEAT ("heat",ModeleColorMap.heatColorMap()), - ENERGY ("energy",ModeleColorMap.energyColorMap()), - ROCKNROLL ("rocknroll",ModeleColorMap.rockNRollColorMap()), - VIENNA ("vienna",ModeleColorMap.viennaColorMap()), - BW ("bw",ModeleColorMap.bwColorMap()); - - String _id; - ModeleColorMap _cm; - - private NamedColorMapTypes(String id, ModeleColorMap cm) - { - _id = id; - _cm = cm; - } - - public String getId() - { - return _id; - } - public ModeleColorMap getColorMap() - { - return _cm; - } - public String toString() - { - return _id; - } - } - - - public ModeleColorMap() - { - this(new Vector(),new Vector()); - } - - - public ModeleColorMap(Vector map, - Vector values) - { - _map = map; - _values = values; - } - - public void addColor(double val, Color col) - { - int offset = Arrays.binarySearch(_values.toArray(), val) ; - if (offset<0) - { - int inspoint = (-offset)-1; - _map.insertElementAt(col, inspoint); - _values.insertElementAt(val,inspoint); - } - } - - public double getMinValue() - { - if (_values.size()>0) - return _values.get(0); - return 0.0; - } - - public double getMaxValue() - { - if (_values.size()>0) - return _values.get(_values.size()-1); - return 0.0; - } - - - public Color getMinColor() - { - if (_map.size()>0) - return _map.get(0); - return DEFAULT_COLOR; - } - - public Color getMaxColor() - { - if (_map.size()>0) - return _map.get(_map.size()-1); - return DEFAULT_COLOR; - } - - - public int getNumColors() - { - return (_map.size()); - } - - public Color getColorAt(int i) - { - return (_map.get(i)); - } - - public Double getValueAt(int i) - { - return (_values.get(i)); - } - - public Color getColorForValue(double val) - { - Color result; - if (val<=getMinValue()) - { result = getMinColor(); } - else if (val>=getMaxValue()) - { - result = getMaxColor(); - } - else - { - int offset = Arrays.binarySearch(_values.toArray(), val) ; - if (offset>=0) - { - result = _map.get(offset); - } - else - { - int inspoint = (-offset)-1; - Color c1 = _map.get(inspoint); - double v1 = _values.get(inspoint); - if (inspoint>0) - { - Color c2 = _map.get(inspoint-1); - double v2 = _values.get(inspoint-1); - double blendCoeff = (v2-val)/(v2-v1); - result = new Color((int)(blendCoeff*c1.getRed()+(1.0-blendCoeff)*c2.getRed()), - (int)(blendCoeff*c1.getGreen()+(1.0-blendCoeff)*c2.getGreen()), - (int)(blendCoeff*c1.getBlue()+(1.0-blendCoeff)*c2.getBlue())); - - } - else - { - result = c1; - } - } - } - return result; - } - - public static ModeleColorMap energyColorMap() - { - ModeleColorMap cm = new ModeleColorMap(); - cm.addColor(1.0,new Color(128,50,50).brighter()); - cm.addColor(0.9,new Color(255,50,50).brighter()); - cm.addColor(0.65,new Color(255,255,50).brighter()); - cm.addColor(0.55,new Color(20,255,50).brighter()); - cm.addColor(0.2,new Color(50,50,255).brighter()); - cm.addColor(0.0,new Color(50,50,128).brighter()); - return cm; - } - - public static ModeleColorMap viennaColorMap() - { - ModeleColorMap cm = new ModeleColorMap(); - cm.addColor(0.0,new Color(0,80,220)); - cm.addColor(0.1,new Color(0,139,220)); - cm.addColor(0.2,new Color(0,220,218)); - cm.addColor(0.3,new Color(0,220,123)); - cm.addColor(0.4,new Color(0,220,49)); - cm.addColor(0.5,new Color(34,220,0)); - cm.addColor(0.6,new Color(109,220,0)); - cm.addColor(0.7,new Color(199,220,0)); - cm.addColor(0.8,new Color(220,165,0)); - cm.addColor(0.9,new Color(220,86,0)); - cm.addColor(1.0,new Color(220,0,0)); - return cm; - } - - public static ModeleColorMap bwColorMap() - { - ModeleColorMap cm = new ModeleColorMap(); - cm.addColor(0.0,Color.white); - cm.addColor(1.0,Color.gray.darker()); - return cm; - } - - public static ModeleColorMap greenColorMap() - { - ModeleColorMap cm = new ModeleColorMap(); - cm.addColor(0.0,Color.gray.brighter().brighter()); - cm.addColor(1.0,Color.green.darker()); - return cm; - } - - public static ModeleColorMap blueColorMap() - { - ModeleColorMap cm = new ModeleColorMap(); - cm.addColor(0.0,Color.gray.brighter().brighter()); - cm.addColor(1.0,Color.blue); - return cm; - } - - public static ModeleColorMap redColorMap() - { - ModeleColorMap cm = new ModeleColorMap(); - cm.addColor(0.0,Color.gray.brighter().brighter()); - cm.addColor(1.0,Color.red); - return cm; - } - - public static ModeleColorMap heatColorMap() - { - ModeleColorMap cm = new ModeleColorMap(); - cm.addColor(0.0,Color.yellow); - cm.addColor(1.0,Color.red); - return cm; - } - - public static ModeleColorMap rockNRollColorMap() - { - ModeleColorMap cm = new ModeleColorMap(); - cm.addColor(0.0,Color.red.brighter()); - cm.addColor(1.0,Color.black); - cm.addColor(2.0,Color.green.brighter()); - return cm; - } - - - public static ModeleColorMap defaultColorMap() - { - return energyColorMap(); - } - - public static ModeleColorMap parseColorMap(String s) - { - String[] data = s.split("[;,]"); - if (data.length==1) - { - String name = data[0].toLowerCase(); - for (NamedColorMapTypes p : NamedColorMapTypes.values()) - { - if (name.equals(p.getId().toLowerCase())) - { - return p.getColorMap(); - } - } - return ModeleColorMap.defaultColorMap(); - } - else - { - ModeleColorMap cm = new ModeleColorMap(); - - for(int i=0;i1) - return cm; - } - return ModeleColorMap.defaultColorMap(); - } - - public void setMinValue(double newMin) - { - rescale(newMin,getMaxValue()); - } - - public void setMaxValue(double newMax) - { - rescale(getMinValue(),newMax); - } - - public void rescale(double newMin, double newMax) - { - double minBck = getMinValue(); - double maxBck = getMaxValue(); - double spanBck = maxBck-minBck; - if (newMax!=newMin) - { - newMax = Math.max(newMax,newMin+1.0); - for (int i=0;i<_values.size();i++) - { - double valBck = _values.get(i); - _values.set(i, newMin+(newMax-newMin)*(valBck-minBck)/(spanBck)); - } - } - } - - public ModeleColorMap clone() - { - ModeleColorMap cm = new ModeleColorMap(); - cm._map = (Vector) _map.clone(); - cm._values = (Vector)_values.clone(); - return cm; - } - - public boolean equals(ModeleColorMap cm) - { - if ( getNumColors()!=cm.getNumColors()) - return false; - for (int i=0;i _strand = new ArrayList(); - private boolean hasBeenPlaced = false; - private boolean strandLeft = false; - private boolean strandRight = false; - private int levelPosition; - - public ModeleStrand(){ - - } - - public void addBase(ModeleBase mb){ - this._strand.add(mb); - } - - public void addBase(int index, ModeleBase mb){ - this._strand.add(index, mb); - } - - public int sizeStrand() { - return this._strand.size(); - } - - public ModeleBase getMB(int a) { - return this._strand.get(a); - } - - public ArrayList getArrayListMB() { - return this._strand; - } - - public int getLevelPosition(){ - return this.levelPosition; - } - - public void setLevelPosition(int a){ - this.levelPosition=a; - } - - public boolean getStrandRight(){ - return this.strandRight; - } - - public void setStrandRight(boolean bool){ - this.strandRight=bool; - } - - public boolean getStrandLeft(){ - return this.strandLeft; - } - - public void setStrandLeft(boolean bool){ - this.strandLeft=bool; - } - - public boolean hasBeenPlaced(){ - return this.hasBeenPlaced; - } - - public void setHasBeenPlaced(boolean bool){ - this.hasBeenPlaced =bool; - } - - public boolean existInStrand(int a){ - int size =sizeStrand(); - boolean exist=false; - for (int i=0; iRNAViz - */ - public static final int DRAW_MODE_RADIATE = 2; - - /** - * Selects the NAView algorithm. - */ - public static final int DRAW_MODE_NAVIEW = 3; - /** - * Selects the linear algorithm. - */ - public static final int DRAW_MODE_LINEAR = 4; - - public static final int DRAW_MODE_VARNA_VIEW = 5; - - /** - * Selects the RNAView algorithm. - */ - public static final int DRAW_MODE_MOTIFVIEW = 6; - - public static final int DRAW_MODE_TEMPLATE = 7; - - public static final int DEFAULT_DRAW_MODE = DRAW_MODE_RADIATE; - - public int BASE_RADIUS = 10; - public static final double LOOP_DISTANCE = 40.0; // distance between base - // pairs in an helix - public static final double BASE_PAIR_DISTANCE = 65.0; // distance between - // the two bases of - // a pair - public static final double MULTILOOP_DISTANCE = 35.0; - public static final double VIRTUAL_LOOP_RADIUS = 40.0; - - public double CHEM_PROB_DIST = 14; - public double CHEM_PROB_BASE_LENGTH = 30; - public double CHEM_PROB_ARROW_HEIGHT = 10; - public double CHEM_PROB_ARROW_WIDTH = 5; - public double CHEM_PROB_TRIANGLE_WIDTH = 2.5; - public double CHEM_PROB_PIN_SEMIDIAG = 6; - public double CHEM_PROB_DOT_RADIUS = 6.; - public static double CHEM_PROB_ARROW_THICKNESS = 2.0; - - public static ArrayList NormalBases = new ArrayList(); - { - NormalBases.add("a"); - NormalBases.add("c"); - NormalBases.add("g"); - NormalBases.add("u"); - NormalBases.add("t"); - } - - public GeneralPath _debugShape = null; - - /** - * The draw algorithm mode - */ - private int _drawMode = DRAW_MODE_RADIATE; - private boolean _drawn = false; - private String _name = ""; - private String _id = ""; - public double _bpHeightIncrement = VARNAConfig.DEFAULT_BP_INCREMENT; - /** - * the base list - */ - private ArrayList _listeBases; - /** - * the strand list - */ - StructureTemp _listStrands = new StructureTemp(); - /** - * Additional bonds and info can be specified here. - */ - private ArrayList _structureAux = new ArrayList(); - private ArrayList _listeAnnotations = new ArrayList(); - private ArrayList _listeRegionHighlights = new ArrayList(); - private ArrayList _chemProbAnnotations = new ArrayList(); - private ModeleBackbone _backbone = new ModeleBackbone(); - - public static String XML_ELEMENT_NAME = "RNA"; - public static String XML_VAR_BASE_SPACING_NAME = "spacing"; - public static String XML_VAR_DRAWN_NAME = "drawn"; - public static String XML_VAR_NAME_NAME = "name"; - public static String XML_VAR_DRAWN_MODE_NAME = "mode"; - public static String XML_VAR_ID_NAME = "id"; - public static String XML_VAR_BP_HEIGHT_NAME = "delta"; - public static String XML_VAR_BASES_NAME = "bases"; - public static String XML_VAR_BASEPAIRS_NAME = "BPs"; - public static String XML_VAR_ANNOTATIONS_NAME = "annotations"; - public static String XML_VAR_BACKBONE_NAME = "backbone"; - - public void toXML(TransformerHandler hd) throws SAXException { - AttributesImpl atts = new AttributesImpl(); - atts.addAttribute("", "", XML_VAR_DRAWN_NAME, "CDATA", "" + _drawn); - atts.addAttribute("", "", XML_VAR_DRAWN_MODE_NAME, "CDATA", "" - + _drawMode); - atts.addAttribute("", "", XML_VAR_ID_NAME, "CDATA", "" + _id); - atts.addAttribute("", "", XML_VAR_BP_HEIGHT_NAME, "CDATA", "" - + _bpHeightIncrement); - hd.startElement("", "", XML_ELEMENT_NAME, atts); - - atts.clear(); - hd.startElement("", "", XML_VAR_NAME_NAME, atts); - XMLUtils.exportCDATAString(hd, "" + _name); - hd.endElement("", "", XML_VAR_NAME_NAME); - - atts.clear(); - hd.startElement("", "", XML_VAR_BASES_NAME, atts); - for (ModeleBase mb : _listeBases) { - mb.toXML(hd); - } - hd.endElement("", "", XML_VAR_BASES_NAME); - atts.clear(); - - hd.startElement("", "", XML_VAR_BASEPAIRS_NAME, atts); - for (ModeleBP mbp : getSecStrBPs()) { - mbp.toXML(hd, true); - } - for (ModeleBP mbp : _structureAux) { - mbp.toXML(hd, false); - } - hd.endElement("", "", XML_VAR_BASEPAIRS_NAME); - atts.clear(); - - getBackbone().toXML(hd); - atts.clear(); - - hd.startElement("", "", XML_VAR_ANNOTATIONS_NAME, atts); - for (TextAnnotation ta : _listeAnnotations) { - ta.toXML(hd); - } - for (HighlightRegionAnnotation hra : _listeRegionHighlights) { - hra.toXML(hd); - } - for (ChemProbAnnotation cpa : _chemProbAnnotations) { - cpa.toXML(hd); - } - hd.endElement("", "", XML_VAR_ANNOTATIONS_NAME); - hd.endElement("", "", XML_ELEMENT_NAME); - } - - public ModeleBackbone getBackbone() { - return _backbone; - } - - public void setBackbone(ModeleBackbone b) { - _backbone = b; - } - - transient private ArrayList _listeVARNAListener = new ArrayList(); - - public RNA() { - this(""); - } - - public RNA(String name) { - _name = name; - _listeBases = new ArrayList(); - _drawn = false; - init(); - } - - public String toString() { - if (_name.equals("")) { - return getStructDBN(); - } else { - return _name; - } - } - - public RNA(RNA r) { - _drawMode = r._drawMode; - _listeBases.addAll(r._listeBases); - _listeVARNAListener = (ArrayList) r._listeVARNAListener; - _drawn = r._drawn; - init(); - } - - public void init() { - } - - public void saveRNADBN(String path, String title) - throws ExceptionWritingForbidden { - try { - FileWriter out = new FileWriter(path); - if (!title.equals("")) { - out.write("> " + title + "\n"); - } - out.write(getListeBasesToString()); - out.write('\n'); - String str = ""; - for (int i = 0; i < _listeBases.size(); i++) { - if (_listeBases.get(i).getElementStructure() == -1) { - str += '.'; - } else { - if (_listeBases.get(i).getElementStructure() > i) { - str += '('; - } else { - str += ')'; - } - } - } - out.write(str); - out.write('\n'); - out.close(); - } catch (IOException e) { - throw new ExceptionWritingForbidden(e.getMessage()); - } - } - - public Color getBaseInnerColor(int i, VARNAConfig conf) { - Color result = _listeBases.get(i).getStyleBase().getBaseInnerColor(); - String res = _listeBases.get(i).getContent(); - if (conf._drawColorMap) { - result = conf._cm.getColorForValue(_listeBases.get(i).getValue()); - } else if ((conf._colorDashBases && (res.contains("-")))) { - result = conf._dashBasesColor; - } else if ((conf._colorSpecialBases && !NormalBases.contains(res - .toLowerCase()))) { - result = conf._specialBasesColor; - } - return result; - } - - public Color getBaseOuterColor(int i, VARNAConfig conf) { - Color result = _listeBases.get(i).getStyleBase() - .getBaseOutlineColor(); - return result; - } - - private static double correctComponent(double c) - { - c = c / 255.0; - if (c <= 0.03928) - c = c/12.92; - else - c = Math.pow(((c+0.055)/1.055) , 2.4); - return c; - } - public static double getLuminance(Color c) - { - return 0.2126 * correctComponent(c.getRed()) + 0.7152 * correctComponent(c.getGreen()) + 0.0722 * correctComponent(c.getBlue()); - } - - public static boolean whiteLabelPreferrable(Color c) - { - if (getLuminance(c) > 0.32) - return false; - return true; - } - - - - public Color getBaseNameColor(int i, VARNAConfig conf) { - Color result = _listeBases.get(i).getStyleBase().getBaseNameColor(); - if ( RNA.whiteLabelPreferrable(getBaseInnerColor(i, conf))) - { - result=Color.white; - } - - return result; - } - - public Color getBasePairColor(ModeleBP bp, VARNAConfig conf) { - Color bondColor = conf._bondColor; - if (conf._useBaseColorsForBPs) { - bondColor = _listeBases.get(bp.getPartner5().getIndex()) - .getStyleBase().getBaseInnerColor(); - } - if (bp != null) { - bondColor = bp.getStyle().getColor(bondColor); - } - return bondColor; - } - - public double getBasePairThickness(ModeleBP bp, VARNAConfig conf) { - double thickness = bp.getStyle().getThickness(conf._bpThickness); - return thickness; - } - - private void drawSymbol(SecStrDrawingProducer out, double posx, - double posy, double normx, double normy, double radius, - boolean isCIS, ModeleBP.Edge e, double thickness) { - Color bck = out.getCurrentColor(); - switch (e) { - case WC: - if (isCIS) { - out.fillCircle(posx, posy, (radius / 2.0), thickness, bck); - } else { - out.fillCircle(posx, posy, (radius / 2.0), thickness, - Color.white); - out.setColor(bck); - out.drawCircle(posx, posy, (radius / 2.0), thickness); - } - break; - case HOOGSTEEN: { - double xtab[] = new double[4]; - double ytab[] = new double[4]; - xtab[0] = posx - radius * normx / 2.0 - radius * normy / 2.0; - ytab[0] = posy - radius * normy / 2.0 + radius * normx / 2.0; - xtab[1] = posx + radius * normx / 2.0 - radius * normy / 2.0; - ytab[1] = posy + radius * normy / 2.0 + radius * normx / 2.0; - xtab[2] = posx + radius * normx / 2.0 + radius * normy / 2.0; - ytab[2] = posy + radius * normy / 2.0 - radius * normx / 2.0; - xtab[3] = posx - radius * normx / 2.0 + radius * normy / 2.0; - ytab[3] = posy - radius * normy / 2.0 - radius * normx / 2.0; - if (isCIS) { - out.fillPolygon(xtab, ytab, bck); - } else { - out.fillPolygon(xtab, ytab, Color.white); - out.setColor(bck); - out.drawPolygon(xtab, ytab, thickness); - } - } - break; - case SUGAR: { - double ix = radius * normx / 2.0; - double iy = radius * normy / 2.0; - double jx = radius * normy / 2.0; - double jy = -radius * normx / 2.0; - double xtab[] = new double[3]; - double ytab[] = new double[3]; - xtab[0] = posx - ix + jx; - ytab[0] = posy - iy + jy; - xtab[1] = posx + ix + jx; - ytab[1] = posy + iy + jy; - xtab[2] = posx - jx; - ytab[2] = posy - jy; - - if (isCIS) { - out.fillPolygon(xtab, ytab, bck); - } else { - out.fillPolygon(xtab, ytab, Color.white); - out.setColor(bck); - out.drawPolygon(xtab, ytab, thickness); - } - } - break; - } - out.setColor(bck); - } - - private void drawBasePairArc(SecStrDrawingProducer out, int i, int j, - Point2D.Double orig, Point2D.Double dest, ModeleBP style, - VARNAConfig conf) { - double coef; - double distance; - Point2D.Double center = new Point2D.Double((orig.x + dest.x)/2., (orig.y + dest.y)/2. + BASE_RADIUS); - if (j - i == 1) - coef = _bpHeightIncrement * 2; - else - coef = _bpHeightIncrement * 1; - distance = (int) Math.round(dest.x - orig.x); - if (conf._mainBPStyle != BP_STYLE.LW) { - out.drawArc(center, distance, distance * coef, 180, 0); - } else { - double thickness = getBasePairThickness(style, conf); - double radiusCircle = ((BASE_PAIR_DISTANCE - BASE_RADIUS) / 5.0); - - if (style.isCanonical()) { - if (style.isCanonicalGC()) { - if ((orig.x != dest.x) || (orig.y != dest.y)) { - out.drawArc(center, distance - BASE_RADIUS / 2., - distance * coef - BASE_RADIUS / 2, 180, 0); - out.drawArc(center, distance + BASE_RADIUS / 2., - distance * coef + BASE_RADIUS / 2, 180, 0); - } - } else if (!style.isWobbleUG()) { - out.drawArc(center, distance, distance * coef, 180, 0); - drawSymbol(out, center.x, center.y + distance * coef / 2., 180., 0, - radiusCircle, style.isCIS(), - style.getEdgePartner5(), thickness); - } else { - out.drawArc(orig, distance, distance * coef, 180, 0); - } - } else { - ModeleBP.Edge p1 = style.getEdgePartner5(); - ModeleBP.Edge p2 = style.getEdgePartner3(); - out.drawArc(center, distance, distance * coef, 180, 0); - if (p1 == p2) { - drawSymbol(out, center.x, center.y + distance * coef / 2., 1., 0, - radiusCircle, style.isCIS(), - style.getEdgePartner5(), thickness); - } else { - drawSymbol(out, center.x - BASE_RADIUS, - center.y + distance * coef / 2., 1., 0, radiusCircle, - style.isCIS(), p1, thickness); - drawSymbol(out, center.x + BASE_RADIUS, - center.y + distance * coef / 2., 1., 0, radiusCircle, - style.isCIS(), p2, thickness); - } - } - } - } - - private void drawBasePair(SecStrDrawingProducer out, Point2D.Double orig, - Point2D.Double dest, ModeleBP style, VARNAConfig conf) { - double dx = dest.x - orig.x; - double dy = dest.y - orig.y; - double dist = Math.sqrt((dest.x - orig.x) * (dest.x - orig.x) - + (dest.y - orig.y) * (dest.y - orig.y)); - dx /= dist; - dy /= dist; - double nx = -dy; - double ny = dx; - orig = new Point2D.Double(orig.x + BASE_RADIUS * dx, orig.y - + BASE_RADIUS * dy); - dest = new Point2D.Double(dest.x - BASE_RADIUS * dx, dest.y - - BASE_RADIUS * dy); - if (conf._mainBPStyle == VARNAConfig.BP_STYLE.LW) { - double thickness = getBasePairThickness(style, conf); - double radiusCircle = ((BASE_PAIR_DISTANCE - BASE_RADIUS) / 5.0); - - if (style.isCanonical()) { - if (style.isCanonicalGC()) { - if ((orig.x != dest.x) || (orig.y != dest.y)) { - nx *= BASE_RADIUS / 4.0; - ny *= BASE_RADIUS / 4.0; - out.drawLine((orig.x + nx), (orig.y + ny), - (dest.x + nx), (dest.y + ny), conf._bpThickness); - out.drawLine((orig.x - nx), (orig.y - ny), - (dest.x - nx), (dest.y - ny), conf._bpThickness); - } - } else if (style.isCanonicalAU()) { - out.drawLine(orig.x, orig.y, dest.x, dest.y, - conf._bpThickness); - } else if (style.isWobbleUG()) { - double cx = (dest.x + orig.x) / 2.0; - double cy = (dest.y + orig.y) / 2.0; - out.drawLine(orig.x, orig.y, dest.x, dest.y, - conf._bpThickness); - drawSymbol(out, cx, cy, nx, ny, radiusCircle, false, - ModeleBP.Edge.WC, thickness); - } - - else { - double cx = (dest.x + orig.x) / 2.0; - double cy = (dest.y + orig.y) / 2.0; - out.drawLine(orig.x, orig.y, dest.x, dest.y, - conf._bpThickness); - drawSymbol(out, cx, cy, nx, ny, radiusCircle, - style.isCIS(), style.getEdgePartner5(), thickness); - } - } else { - ModeleBP.Edge p1 = style.getEdgePartner5(); - ModeleBP.Edge p2 = style.getEdgePartner3(); - double cx = (dest.x + orig.x) / 2.0; - double cy = (dest.y + orig.y) / 2.0; - out.drawLine(orig.x, orig.y, dest.x, dest.y, conf._bpThickness); - if (p1 == p2) { - drawSymbol(out, cx, cy, nx, ny, radiusCircle, - style.isCIS(), p1, thickness); - } else { - double vdx = (dest.x - orig.x); - double vdy = (dest.y - orig.y); - vdx /= 6.0; - vdy /= 6.0; - drawSymbol(out, cx + vdx, cy + vdy, nx, ny, radiusCircle, - style.isCIS(), p2, thickness); - drawSymbol(out, cx - vdx, cy - vdy, nx, ny, radiusCircle, - style.isCIS(), p1, thickness); - } - } - } else if (conf._mainBPStyle == VARNAConfig.BP_STYLE.RNAVIZ) { - double xcenter = (orig.x + dest.x) / 2.0; - double ycenter = (orig.y + dest.y) / 2.0; - out.fillCircle(xcenter, ycenter, 3.0 * conf._bpThickness, - conf._bpThickness, out.getCurrentColor()); - } else if (conf._mainBPStyle == VARNAConfig.BP_STYLE.SIMPLE) { - out.drawLine(orig.x, orig.y, dest.x, dest.y, conf._bpThickness); - } - } - - private void drawColorMap(VARNAConfig _conf, SecStrDrawingProducer out) { - double v1 = _conf._cm.getMinValue(); - double v2 = _conf._cm.getMaxValue(); - int x, y; - double xSpaceAvail = 0; - double ySpaceAvail = 0; - double thickness = 1.0; - /* - * ySpaceAvail = - * Math.min((getHeight()-rnabbox.height*scaleFactor-getTitleHeight - * ())/2.0,scaleFactor*(_conf._colorMapHeight+VARNAConfig. - * DEFAULT_COLOR_MAP_FONT_SIZE)); if ((int)ySpaceAvail==0) { xSpaceAvail - * = - * Math.min((getWidth()-rnabbox.width*scaleFactor)/2,scaleFactor*(_conf - * ._colorMapWidth)+VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH); } - */ - Rectangle2D.Double currentBBox = out.getBoundingBox(); - - double xBase = (currentBBox.getMaxX() - _conf._colorMapWidth - _conf._colorMapXOffset); - // double yBase = (minY - _conf._colorMapHeight + - // _conf._colorMapYOffset); - double yBase = (currentBBox.getMinY() - _conf._colorMapHeight - VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE); - - for (int i = 0; i < _conf._colorMapWidth; i++) { - double ratio = (((double) i) / ((double) _conf._colorMapWidth - 1)); - double val = v1 + (v2 - v1) * ratio; - Color c = _conf._cm.getColorForValue(val); - x = (int) (xBase + i); - y = (int) yBase; - out.fillRectangle(x, y, VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH, - _conf._colorMapHeight, c); - } - out.setColor(VARNAConfig.DEFAULT_COLOR_MAP_OUTLINE); - out.drawRectangle(xBase, yBase, (double) _conf._colorMapWidth - + VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH - 1, - _conf._colorMapHeight, thickness); - - out.setColor(VARNAConfig.DEFAULT_COLOR_MAP_FONT_COLOR); - out.setFont(out.getCurrentFont(), - VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE / 1.5); - out.drawText(xBase, yBase + _conf._colorMapHeight - + VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE / 1.7, - "" + _conf._cm.getMinValue()); - out.drawText(xBase + VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH - + _conf._colorMapWidth, yBase + _conf._colorMapHeight - + VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE / 1.7, - "" + _conf._cm.getMaxValue()); - out.drawText( - xBase - + (VARNAConfig.DEFAULT_COLOR_MAP_STRIPE_WIDTH + _conf._colorMapWidth) - / 2.0, yBase - - (VARNAConfig.DEFAULT_COLOR_MAP_FONT_SIZE / 1.7), - _conf._colorMapCaption); - - } - - private void renderRegionHighlights(SecStrDrawingProducer out, - Point2D.Double[] realCoords, Point2D.Double[] realCenters) { - for (HighlightRegionAnnotation r : _listeRegionHighlights) { - GeneralPath s = r.getShape(realCoords, realCenters, 1.0); - out.setColor(r.getFillColor()); - out.fillPolygon(s, r.getFillColor()); - out.setColor(r.getOutlineColor()); - out.drawPolygon(s, 1l); - } - - } - - private void saveRNA(String path, VARNAConfig conf, double scale, - SecStrDrawingProducer out) throws ExceptionWritingForbidden { - out.setScale(scale); - // Computing bounding boxes - double EPSMargin = 40; - double minX = Double.MAX_VALUE; - double maxX = Double.MIN_VALUE; - double minY = Double.MAX_VALUE; - double maxY = Double.MIN_VALUE; - - double x0, y0, x1, y1, xc, yc, xp, yp, dx, dy, norm; - - for (int i = 0; i < _listeBases.size(); i++) { - minX = Math.min(minX, (_listeBases.get(i).getCoords().getX() - - BASE_RADIUS - EPSMargin)); - minY = Math.min(minY, -(_listeBases.get(i).getCoords().getY() - - BASE_RADIUS - EPSMargin)); - maxX = Math.max(maxX, (_listeBases.get(i).getCoords().getX() - + BASE_RADIUS + EPSMargin)); - maxY = Math.max(maxY, -(_listeBases.get(i).getCoords().getY() - + BASE_RADIUS + EPSMargin)); - } - - // Rescaling everything - Point2D.Double[] coords = new Point2D.Double[_listeBases.size()]; - Point2D.Double[] centers = new Point2D.Double[_listeBases.size()]; - for (int i = 0; i < _listeBases.size(); i++) { - xp = (_listeBases.get(i).getCoords().getX() - minX); - yp = -(_listeBases.get(i).getCoords().getY() - minY); - coords[i] = new Point2D.Double(xp, yp); - - Point2D.Double centerBck = getCenter(i); - if (get_drawMode() == RNA.DRAW_MODE_NAVIEW - || get_drawMode() == RNA.DRAW_MODE_RADIATE) { - if ((_listeBases.get(i).getElementStructure() != -1) - && i < _listeBases.size() - 1 && i > 1) { - ModeleBase b1 = get_listeBases().get(i - 1); - ModeleBase b2 = get_listeBases().get(i + 1); - int j1 = b1.getElementStructure(); - int j2 = b2.getElementStructure(); - if ((j1 == -1) ^ (j2 == -1)) { - // alors la position du nombre associé doit etre - // décalé - Point2D.Double a1 = b1.getCoords(); - Point2D.Double a2 = b2.getCoords(); - Point2D.Double c1 = b1.getCenter(); - Point2D.Double c2 = b2.getCenter(); - - centerBck.x = _listeBases.get(i).getCoords().x - + (c1.x - a1.x) / c1.distance(a1) - + (c2.x - a2.x) / c2.distance(a2); - centerBck.y = _listeBases.get(i).getCoords().y - + (c1.y - a1.y) / c1.distance(a1) - + (c2.y - a2.y) / c2.distance(a2); - } - } - } - xc = (centerBck.getX() - minX); - yc = -(centerBck.getY() - minY); - centers[i] = new Point2D.Double(xc, yc); - } - - // Drawing background - if (conf._drawBackground) - out.setBackgroundColor(conf._backgroundColor); - - // Drawing region highlights - renderRegionHighlights(out, coords, centers); - - // Drawing backbone - if (conf._drawBackbone) - { - for (int i = 1; i < _listeBases.size(); i++) { - Point2D.Double p1 = coords[i - 1]; - Point2D.Double p2 = coords[i]; - x0 = p1.x; - y0 = p1.y; - x1 = p2.x; - y1 = p2.y; - Point2D.Double vn = new Point2D.Double(); - double dist = p1.distance(p2); - int a = _listeBases.get(i - 1).getElementStructure(); - int b = _listeBases.get(i).getElementStructure(); - BackboneType bt = _backbone.getTypeBefore(i); - boolean consecutivePair = (a == i) && (b == i - 1); - - if (dist > 0) { - if (bt != BackboneType.DISCONTINUOUS_TYPE) { - Color c = _backbone.getColorBefore(i, conf._backboneColor); - if (bt == BackboneType.MISSING_PART_TYPE) { - c.brighter(); - } - out.setColor(c); - - vn.x = (x1 - x0) / dist; - vn.y = (y1 - y0) / dist; - if (consecutivePair - &&(getDrawMode() != RNA.DRAW_MODE_LINEAR) - && (getDrawMode() != RNA.DRAW_MODE_CIRCULAR)) { - int dir = 0; - if (i + 1 < coords.length) { - dir = (testDirectionality(i - 1, i, i + 1) ? 1 : -1); - } else if (i - 2 >= 0) { - dir = (testDirectionality(i - 2, i - 1, i) ? 1 : -1); - } - Point2D.Double centerSeg = new Point2D.Double( - (p1.x + p2.x) / 2.0, (p1.y + p2.y) / 2.0); - double centerDist = RNA.VIRTUAL_LOOP_RADIUS * scale; - Point2D.Double centerLoop = new Point2D.Double( - centerSeg.x + centerDist * dir * vn.y, - centerSeg.y - centerDist * dir * vn.x); - // Debug crosshair - //out.drawLine(centerLoop.x - 5, centerLoop.y, - // centerLoop.x + 5, centerLoop.y, 2.0); - //out.drawLine(centerLoop.x, centerLoop.y - 5, - // centerLoop.x, centerLoop.y + 5, 2.0); - - double radius = centerLoop.distance(p1); - double a1 = 360. - * (Math.atan2(p1.y - centerLoop.y, p1.x - centerLoop.x)) - / (2. * Math.PI); - double a2 = 360. - * (Math.atan2(p2.y - centerLoop.y, p2.x - centerLoop.x)) - / (2. * Math.PI); - if (dir>0) - { - double tmp = a1; - a1 = a2; - a2 = tmp; - } - if (a1 < 0) { - a1 += 360.; - } - if (a2 < 0) { - a2 += 360.; - } - out.drawArc(centerLoop, 2. * radius, 2. * radius, a1, - a2); - } else { - out.drawLine((x0 + BASE_RADIUS * vn.x), - (y0 + BASE_RADIUS * vn.y), (x1 - BASE_RADIUS - * vn.x), (y1 - BASE_RADIUS * vn.y), 1.0); - } - } - } - } - } - - // Drawing bonds - for (int i = 0; i < _listeBases.size(); i++) { - if (_listeBases.get(i).getElementStructure() > i) { - ModeleBP style = _listeBases.get(i).getStyleBP(); - if (style.isCanonical() || conf._drawnNonCanonicalBP) { - Color bpcol = getBasePairColor(style, conf); - out.setColor(bpcol); - - int j = _listeBases.get(i).getElementStructure(); - x0 = coords[i].x; - y0 = coords[i].y; - x1 = coords[j].x; - y1 = coords[j].y; - dx = x1 - x0; - dy = y1 - y0; - norm = Math.sqrt(dx * dx + dy * dy); - dx /= norm; - dy /= norm; - - if (_drawMode == DRAW_MODE_CIRCULAR - || _drawMode == DRAW_MODE_RADIATE - || _drawMode == DRAW_MODE_NAVIEW) { - drawBasePair(out, new Point2D.Double(x0, y0), - new Point2D.Double(x1, y1), style, conf); - } else if (_drawMode == DRAW_MODE_LINEAR) { - drawBasePairArc(out, i, j, new Point2D.Double(x0, y0), - new Point2D.Double(x1, y1), style, conf); - } - } - } - } - - // Drawing additional bonds - if (conf._drawnNonPlanarBP) { - for (int i = 0; i < _structureAux.size(); i++) { - ModeleBP bp = _structureAux.get(i); - out.setColor(getBasePairColor(bp, conf)); - - int a = bp.getPartner5().getIndex(); - int b = bp.getPartner3().getIndex(); - - if (bp.isCanonical() || conf._drawnNonCanonicalBP) { - x0 = coords[a].x; - y0 = coords[a].y; - x1 = coords[b].x; - y1 = coords[b].y; - dx = x1 - x0; - dy = y1 - y0; - norm = Math.sqrt(dx * dx + dy * dy); - dx /= norm; - dy /= norm; - if ((_drawMode == DRAW_MODE_CIRCULAR) - || (_drawMode == DRAW_MODE_RADIATE) - || _drawMode == DRAW_MODE_NAVIEW) { - drawBasePair(out, new Point2D.Double(x0, y0), - new Point2D.Double(x1, y1), bp, conf); - } else if (_drawMode == DRAW_MODE_LINEAR) { - drawBasePairArc(out, a, b, new Point2D.Double(x0, y0), - new Point2D.Double(x1, y1), bp, conf); - } - } - } - } - - // Drawing Bases - double baseFontSize = (1.5 * BASE_RADIUS); - out.setFont(PSExport.FONT_HELVETICA_BOLD, baseFontSize); - - for (int i = 0; i < _listeBases.size(); i++) { - x0 = coords[i].x; - y0 = coords[i].y; - - Color baseInnerColor = getBaseInnerColor(i, conf); - Color baseOuterColor = getBaseOuterColor(i, conf); - Color baseNameColor = getBaseNameColor(i, conf); - if ( RNA.whiteLabelPreferrable(baseInnerColor)) - { - baseNameColor=Color.white; - } - - - if (_listeBases.get(i) instanceof ModeleBasesComparison) { - ModeleBasesComparison mb = (ModeleBasesComparison) _listeBases - .get(i); - if (conf._fillBases) { - out.fillRectangle(x0 - 1.5 * BASE_RADIUS, y0 - BASE_RADIUS, - 3 * BASE_RADIUS, 2 * BASE_RADIUS, - baseInnerColor); - } - if (conf._drawOutlineBases) { - out.setColor(baseOuterColor); - out.drawRectangle(x0 - 1.5 * BASE_RADIUS, y0 - BASE_RADIUS, - 3 * BASE_RADIUS, 2 * BASE_RADIUS, 1l); - out.drawLine(x0, y0 - BASE_RADIUS, x0, y0 + BASE_RADIUS, 1l); - } - - out.setColor(baseNameColor); - out.drawText(x0 - .75 * BASE_RADIUS, y0, "" + mb.getBase1()); - out.drawText(x0 + .75 * BASE_RADIUS, y0, "" + mb.getBase2()); - } else if (_listeBases.get(i) instanceof ModeleBaseNucleotide) { - if (conf._fillBases) { - out.fillCircle(x0, y0, BASE_RADIUS, 1l, - baseInnerColor); - } - if (conf._drawOutlineBases) { - out.setColor(baseOuterColor); - out.drawCircle(x0, y0, BASE_RADIUS, 1l); - } - out.setColor(baseNameColor); - out.drawText(x0, y0, _listeBases.get(i).getContent()); - - } - } - - // Drawing base numbers - double numFontSize = (double) (1.5 * BASE_RADIUS); - out.setFont(PSExport.FONT_HELVETICA_BOLD, numFontSize); - - for (int i = 0; i < _listeBases.size(); i++) { - int basenum = _listeBases.get(i).getBaseNumber(); - if (basenum == -1) { - basenum = i + 1; - } - ModeleBase mb = _listeBases.get(i); - if (this.isNumberDrawn(mb, conf._numPeriod)) { - out.setColor(mb.getStyleBase() - .getBaseNumberColor()); - x0 = coords[i].x; - y0 = coords[i].y; - x1 = centers[i].x; - y1 = centers[i].y; - dx = x1 - x0; - dy = y1 - y0; - norm = Math.sqrt(dx * dx + dy * dy); - dx /= norm; - dy /= norm; - Point2D.Double vn = VARNAPanel.computeExcentricUnitVector(i,coords,centers); - - out.drawLine((x0 + 1.5 * BASE_RADIUS * vn.x), (y0 + 1.5 - * BASE_RADIUS * vn.y), (x0 + 2.5 * BASE_RADIUS * vn.x), - (y0 + 2.5 * BASE_RADIUS * vn.y), 1); - out.drawText( - (x0 + (conf._distNumbers + 1.0) * BASE_RADIUS * vn.x), - (y0 + (conf._distNumbers + 1.0) * BASE_RADIUS * vn.y), mb.getLabel()); - } - } - renderAnnotations(out, minX, minY, conf); - - // Draw color map - if (conf._drawColorMap) { - drawColorMap(conf, out); - } - - // Drawing Title - Rectangle2D.Double currentBBox = out.getBoundingBox(); - double titleFontSize = (2.0 * conf._titleFont.getSize()); - out.setColor(conf._titleColor); - out.setFont(PSExport.FONT_HELVETICA, titleFontSize); - double yTitle = currentBBox.y - titleFontSize / 2.0; - if (!getName().equals("")) { - out.drawText((maxX - minX) / 2.0, yTitle, getName()); - } - - OutputStreamWriter fout; - - try { - fout = new OutputStreamWriter(new FileOutputStream(path), "UTF-8"); - - fout.write(out.export()); - fout.close(); - } catch (IOException e) { - throw new ExceptionWritingForbidden(e.getMessage()); - } - } - - Point2D.Double buildCaptionPosition(ModeleBase mb, double heightEstimate, - VARNAConfig conf) { - double radius = 2.0; - if (isNumberDrawn(mb, conf._numPeriod)) { - radius += (conf._distNumbers + 1.0); - } - Point2D.Double center = mb.getCenter(); - Point2D.Double p = mb.getCoords(); - double realDistance = BASE_RADIUS * radius + heightEstimate; - return new Point2D.Double(center.getX() + (p.getX() - center.getX()) - * ((p.distance(center) + realDistance) / p.distance(center)), - center.getY() - + (p.getY() - center.getY()) - * ((p.distance(center) + realDistance) / p - .distance(center))); - } - - public double getBPHeightIncrement() { - return this._bpHeightIncrement; - } - - public void setBPHeightIncrement(double d) { - _bpHeightIncrement = d; - } - - private void drawChemProbAnnotation(SecStrDrawingProducer out, - ChemProbAnnotation cpa, Point2D.Double anchor, double minX, - double minY) { - out.setColor(cpa.getColor()); - Point2D.Double v = cpa.getDirVector(); - Point2D.Double vn = cpa.getNormalVector(); - Point2D.Double base = new Point2D.Double((anchor.x + CHEM_PROB_DIST - * v.x), (anchor.y + CHEM_PROB_DIST * v.y)); - Point2D.Double edge = new Point2D.Double( - (base.x + CHEM_PROB_BASE_LENGTH * cpa.getIntensity() * v.x), - (base.y + CHEM_PROB_BASE_LENGTH * cpa.getIntensity() * v.y)); - double thickness = CHEM_PROB_ARROW_THICKNESS * cpa.getIntensity(); - switch (cpa.getType()) { - case ARROW: { - Point2D.Double arrowTip1 = new Point2D.Double( - (base.x + cpa.getIntensity() - * (CHEM_PROB_ARROW_WIDTH * vn.x + CHEM_PROB_ARROW_HEIGHT - * v.x)), - (base.y + cpa.getIntensity() - * (CHEM_PROB_ARROW_WIDTH * vn.y + CHEM_PROB_ARROW_HEIGHT - * v.y))); - Point2D.Double arrowTip2 = new Point2D.Double( - (base.x + cpa.getIntensity() - * (-CHEM_PROB_ARROW_WIDTH * vn.x + CHEM_PROB_ARROW_HEIGHT - * v.x)), - (base.y + cpa.getIntensity() - * (-CHEM_PROB_ARROW_WIDTH * vn.y + CHEM_PROB_ARROW_HEIGHT - * v.y))); - out.drawLine(base.x - minX, minY - base.y, edge.x - minX, minY - - edge.y, thickness); - out.drawLine(base.x - minX, minY - base.y, arrowTip1.x - minX, minY - - arrowTip1.y, thickness); - out.drawLine(base.x - minX, minY - base.y, arrowTip2.x - minX, minY - - arrowTip2.y, thickness); - } - break; - case PIN: { - Point2D.Double side1 = new Point2D.Double( - (edge.x - cpa.getIntensity() - * (CHEM_PROB_PIN_SEMIDIAG * v.x)), - (edge.y - cpa.getIntensity() - * (CHEM_PROB_PIN_SEMIDIAG * v.y))); - Point2D.Double side2 = new Point2D.Double( - (edge.x - cpa.getIntensity() - * (CHEM_PROB_PIN_SEMIDIAG * vn.x)), - (edge.y - cpa.getIntensity() - * (CHEM_PROB_PIN_SEMIDIAG * vn.y))); - Point2D.Double side3 = new Point2D.Double( - (edge.x + cpa.getIntensity() - * (CHEM_PROB_PIN_SEMIDIAG * v.x)), - (edge.y + cpa.getIntensity() - * (CHEM_PROB_PIN_SEMIDIAG * v.y))); - Point2D.Double side4 = new Point2D.Double( - (edge.x + cpa.getIntensity() - * (CHEM_PROB_PIN_SEMIDIAG * vn.x)), - (edge.y + cpa.getIntensity() - * (CHEM_PROB_PIN_SEMIDIAG * vn.y))); - GeneralPath p2 = new GeneralPath(); - p2.moveTo((float) (side1.x - minX), (float) (minY - side1.y)); - p2.lineTo((float) (side2.x - minX), (float) (minY - side2.y)); - p2.lineTo((float) (side3.x - minX), (float) (minY - side3.y)); - p2.lineTo((float) (side4.x - minX), (float) (minY - side4.y)); - p2.closePath(); - out.fillPolygon(p2, cpa.getColor()); - out.drawLine(base.x - minX, minY - base.y, edge.x - minX, minY - - edge.y, thickness); - } - break; - case TRIANGLE: { - Point2D.Double arrowTip1 = new Point2D.Double( - (edge.x + cpa.getIntensity() - * (CHEM_PROB_TRIANGLE_WIDTH * vn.x)), - (edge.y + cpa.getIntensity() - * (CHEM_PROB_TRIANGLE_WIDTH * vn.y))); - Point2D.Double arrowTip2 = new Point2D.Double( - (edge.x + cpa.getIntensity() - * (-CHEM_PROB_TRIANGLE_WIDTH * vn.x)), - (edge.y + cpa.getIntensity() - * (-CHEM_PROB_TRIANGLE_WIDTH * vn.y))); - GeneralPath p2 = new GeneralPath(); - p2.moveTo((float) (base.x - minX), (float) (minY - base.y)); - p2.lineTo((float) (arrowTip1.x - minX), - (float) (minY - arrowTip1.y)); - p2.lineTo((float) (arrowTip2.x - minX), - (float) (minY - arrowTip2.y)); - p2.closePath(); - out.fillPolygon(p2, cpa.getColor()); - } - break; - case DOT: { - Double radius = CHEM_PROB_DOT_RADIUS * cpa.getIntensity(); - Point2D.Double center = new Point2D.Double((base.x + radius * v.x) - - minX, minY - (base.y + radius * v.y)); - out.fillCircle(center.x, center.y, radius, thickness, - cpa.getColor()); - } - break; - } - } - - private void renderAnnotations(SecStrDrawingProducer out, double minX, - double minY, VARNAConfig conf) { - for (TextAnnotation textAnnotation : getAnnotations()) { - out.setColor(textAnnotation.getColor()); - out.setFont(PSExport.FONT_HELVETICA_BOLD, 2.0 * textAnnotation - .getFont().getSize()); - Point2D.Double position = textAnnotation.getCenterPosition(); - if (textAnnotation.getType() == TextAnnotation.AnchorType.BASE) { - ModeleBase mb = (ModeleBase) textAnnotation.getAncrage(); - double fontHeight = Math.ceil(textAnnotation.getFont() - .getSize()); - position = buildCaptionPosition(mb, fontHeight, conf); - - } - out.drawText(position.x - minX, -(position.y - minY), - textAnnotation.getTexte()); - } - for (ChemProbAnnotation cpa : getChemProbAnnotations()) { - Point2D.Double anchor = cpa.getAnchorPosition(); - drawChemProbAnnotation(out, cpa, anchor, minX, minY); - } - } - - public boolean isNumberDrawn(ModeleBase mb, int numPeriod) { - if (numPeriod <= 0) - return false; - return ((mb.getIndex() == 0) || ((mb.getBaseNumber()) % numPeriod == 0) || (mb - .getIndex() == get_listeBases().size() - 1)); - } - - public void saveRNAEPS(String path, VARNAConfig conf) - throws ExceptionWritingForbidden { - PSExport out = new PSExport(); - saveRNA(path, conf, 0.4, out); - } - - public void saveRNAXFIG(String path, VARNAConfig conf) - throws ExceptionWritingForbidden { - XFIGExport out = new XFIGExport(); - saveRNA(path, conf, 20, out); - } - - public void saveRNATIKZ(String path, VARNAConfig conf) - throws ExceptionWritingForbidden { - TikzExport out = new TikzExport(); - saveRNA(path, conf, 0.15, out); - } - - public void saveRNASVG(String path, VARNAConfig conf) - throws ExceptionWritingForbidden { - SVGExport out = new SVGExport(); - saveRNA(path, conf, 0.5, out); - } - - public Rectangle2D.Double getBBox() { - Rectangle2D.Double result = new Rectangle2D.Double(10, 10, 10, 10); - double minx, maxx, miny, maxy; - minx = Double.MAX_VALUE; - miny = Double.MAX_VALUE; - maxx = -Double.MAX_VALUE; - maxy = -Double.MAX_VALUE; - for (int i = 0; i < _listeBases.size(); i++) { - minx = Math.min( - _listeBases.get(i).getCoords().getX() - BASE_RADIUS, minx); - miny = Math.min( - _listeBases.get(i).getCoords().getY() - BASE_RADIUS, miny); - maxx = Math.max( - _listeBases.get(i).getCoords().getX() + BASE_RADIUS, maxx); - maxy = Math.max( - _listeBases.get(i).getCoords().getY() + BASE_RADIUS, maxy); - } - result.x = minx; - result.y = miny; - result.width = Math.max(maxx - minx, 1); - result.height = Math.max(maxy - miny, 1); - if (_drawMode == RNA.DRAW_MODE_LINEAR) { - double realHeight = _bpHeightIncrement * result.width / 2.0; - result.height += realHeight; - result.y -= realHeight; - } - return result; - } - - public void setCoord(int index, Point2D.Double p) { - setCoord(index, p.x, p.y); - } - - public void setCoord(int index, double x, double y) { - if (index < _listeBases.size()) { - _listeBases.get(index).setCoords(new Point2D.Double(x, y)); - } - } - - public Point2D.Double getCoords(int i) { - if (i < _listeBases.size() && i >= 0) { - return _listeBases.get(i).getCoords(); - } - return new Point2D.Double(); - } - - public String getBaseContent(int i) { - if ((i >= 0) && (i < _listeBases.size())) { - return _listeBases.get(i).getContent(); - } - return ""; - } - - public int getBaseNumber(int i) { - if ((i >= 0) && (i < _listeBases.size())) { - return _listeBases.get(i).getBaseNumber(); - } - return -1; - } - - public Point2D.Double getCenter(int i) { - if (i < _listeBases.size()) { - return _listeBases.get(i).getCenter(); - } - - return new Point2D.Double(); - } - - public void setCenter(int i, double x, double y) { - setCenter(i, new Point2D.Double(x, y)); - } - - public void setCenter(int i, Point2D.Double p) { - if (i < _listeBases.size()) { - _listeBases.get(i).setCenter(p); - } - } - - public void drawRNACircle(VARNAConfig conf) { - _drawn = true; - _drawMode = DRAW_MODE_CIRCULAR; - int radius = (int) ((3 * (_listeBases.size() + 1) * BASE_RADIUS) / (2 * Math.PI)); - double angle; - for (int i = 0; i < _listeBases.size(); i++) { - angle = -((((double) -(i + 1)) * 2.0 * Math.PI) - / ((double) (_listeBases.size() + 1)) - Math.PI / 2.0); - _listeBases - .get(i) - .setCoords( - new Point2D.Double( - (radius * Math.cos(angle) * conf._spaceBetweenBases), - (radius * Math.sin(angle) * conf._spaceBetweenBases))); - _listeBases.get(i).setCenter(new Point2D.Double(0, 0)); - } - } - - public void drawRNAVARNAView(VARNAConfig conf) { - _drawn = true; - _drawMode = DRAW_MODE_VARNA_VIEW; - VARNASecDraw vs = new VARNASecDraw(); - vs.drawRNA(1, this); - } - - public void drawRNALine(VARNAConfig conf) { - _drawn = true; - _drawMode = DRAW_MODE_LINEAR; - for (int i = 0; i < get_listeBases().size(); i++) { - get_listeBases().get(i).setCoords( - new Point2D.Double(i * conf._spaceBetweenBases * 20, 0)); - get_listeBases().get(i).setCenter( - new Point2D.Double(i * conf._spaceBetweenBases * 20, -10)); - } - } - - public RNATemplateMapping drawRNATemplate(RNATemplate template, boolean straightBulges, - VARNAConfig conf) throws RNATemplateDrawingAlgorithmException { - return drawRNATemplate(template, conf, - DrawRNATemplateMethod.getDefault(), - DrawRNATemplateCurveMethod.getDefault(), straightBulges); - } - - public RNATemplateMapping drawRNATemplate(RNATemplate template, - VARNAConfig conf, DrawRNATemplateMethod helixLengthAdjustmentMethod, - boolean straightBulges) - throws RNATemplateDrawingAlgorithmException { - return drawRNATemplate(template, conf, helixLengthAdjustmentMethod, - DrawRNATemplateCurveMethod.getDefault(),straightBulges); - } - - public RNATemplateMapping drawRNATemplate(RNATemplate template, - VARNAConfig conf, - DrawRNATemplateMethod helixLengthAdjustmentMethod, - DrawRNATemplateCurveMethod curveMethod, - boolean straightBulges) - throws RNATemplateDrawingAlgorithmException { - _drawn = true; - _drawMode = DRAW_MODE_TEMPLATE; - - DrawRNATemplate drawRNATemplate = new DrawRNATemplate(this); - drawRNATemplate.drawRNATemplate(template, conf, - helixLengthAdjustmentMethod, curveMethod, - straightBulges); - return drawRNATemplate.getMapping(); - } - - private static double objFun(int n1, int n2, double r, double bpdist, - double multidist) { - return (((double) n1) * 2.0 * Math.asin(((double) bpdist) / (2.0 * r)) - + ((double) n2) * 2.0 - * Math.asin(((double) multidist) / (2.0 * r)) - (2.0 * Math.PI)); - } - - public double determineRadius(int nbHel, int nbUnpaired, double startRadius) { - return determineRadius(nbHel, nbUnpaired, startRadius, - BASE_PAIR_DISTANCE, MULTILOOP_DISTANCE); - } - - public static double determineRadius(int nbHel, int nbUnpaired, - double startRadius, double bpdist, double multidist) { - double xmin = bpdist / 2.0; - double xmax = 3.0 * multidist + 1; - double x = (xmin + xmax) / 2.0; - double y = 10000.0; - double ymin = -1000.0; - double ymax = 1000.0; - int numIt = 0; - double precision = 0.00001; - while ((Math.abs(y) > precision) && (numIt < 10000)) { - x = (xmin + xmax) / 2.0; - y = objFun(nbHel, nbUnpaired, x, bpdist, multidist); - ymin = objFun(nbHel, nbUnpaired, xmax, bpdist, multidist); - ymax = objFun(nbHel, nbUnpaired, xmin, bpdist, multidist); - if (ymin > 0.0) { - xmax = xmax + (xmax - xmin); - } else if ((y <= 0.0) && (ymax > 0.0)) { - xmax = x; - } else if ((y >= 0.0) && (ymin < 0.0)) { - xmin = x; - } else if (ymax < 0.0) { - xmin = Math.max(xmin - (x - xmin), - Math.max(bpdist / 2.0, multidist / 2.0)); - xmax = x; - } - numIt++; - } - return x; - } - - public void drawRNA(VARNAConfig conf) throws ExceptionNAViewAlgorithm { - drawRNA(RNA.DEFAULT_DRAW_MODE, conf); - } - - public void drawRNA(int mode, VARNAConfig conf) - throws ExceptionNAViewAlgorithm { - _drawMode = mode; - switch (get_drawMode()) { - case RNA.DRAW_MODE_RADIATE: - drawRNARadiate(conf); - break; - case RNA.DRAW_MODE_LINEAR: - drawRNALine(conf); - break; - case RNA.DRAW_MODE_CIRCULAR: - drawRNACircle(conf); - break; - case RNA.DRAW_MODE_NAVIEW: - drawRNANAView(conf); - break; - case RNA.DRAW_MODE_VARNA_VIEW: - drawRNAVARNAView(conf); - break; - default: - break; - } - - } - - public int getDrawMode() { - return _drawMode; - } - - public static double HYSTERESIS_EPSILON = .15; - public static final double[] HYSTERESIS_ATTRACTORS = {0.,Math.PI/4.,Math.PI/2.,3.*Math.PI/4.,Math.PI,5.*(Math.PI)/4.,3.*(Math.PI)/2,7.*(Math.PI)/4.}; - - public static double normalizeAngle(double angle) - { - return normalizeAngle(angle,0.); - } - - public static double normalizeAngle(double angle, double fromVal) - { - double toVal = fromVal +2.*Math.PI; - double result = angle; - while(result= toVal) - { - result -= 2.*Math.PI; - } - return result; - } - - public static double correctHysteresis(double angle) - { - double result = normalizeAngle(angle); - - for (int i=0;i bases) - { - double mydist = Math.abs(radius*(angle / (bases.size() + 1))); - double addedRadius= 0.; - Point2D.Double PA = new Point2D.Double(center.x + radius * Math.cos(base + pHel), - center.y + radius * Math.sin(base + pHel)); - Point2D.Double PB = new Point2D.Double(center.x + radius * Math.cos(base + pHel+angle), - center.y + radius * Math.sin(base + pHel+angle)); - double dist = PA.distance(PB); - Point2D.Double VN = new Point2D.Double((PB.y-PA.y)/dist,(-PB.x+PA.x)/dist); - if (mydist<2*BASE_RADIUS) - { - addedRadius=Math.min(1.0,(2*BASE_RADIUS-mydist)/4)*computeRadius(mydist, 2.29*(bases.size() + 1)*BASE_RADIUS-mydist); - } - - - ArrayList pos = computeNewAngles(bases.size(),center,VN, angle,base + pHel,radius,addedRadius); - for (int i = 0; i < bases.size(); i++) - { - int k = bases.get(i); - setCoord(k, pos.get(i)); - } - - } - - private double computeRadius(double b, double pobj) - { - double a=b, aL=a, aU=Double.POSITIVE_INFINITY; - double h = (a-b)*(a-b)/((a+b)*(a+b)); - double p = Math.PI*(a+b)*(1+h/4.+h*h/64.+h*h*h/256.+25.*h*h*h*h/16384.)/2.0; - double aold = a+1.; - while ((Math.abs(p-pobj)>10e-4)&&(aold!=a)){ - aold = a; - if (p prevBases,Vector nextBases) - { - if (isDirect) { - double anglePrev = normalizeAngle(angleLimitLeft - angleRightPartner); - double angleNext = normalizeAngle(angleLeftPartner - angleLimitRight); - distributeUnpaired(radius,anglePrev, angleRightPartner, base, - center,prevBases); - distributeUnpaired(radius,-angleNext, angleLeftPartner, base, - center,nextBases); - } else { - double anglePrev = normalizeAngle(angleLeftPartner - angleLimitRight); - double angleNext = normalizeAngle(angleLimitLeft - angleRightPartner); - distributeUnpaired(radius,-anglePrev, angleLeftPartner, base, - center,prevBases); - distributeUnpaired(radius,angleNext, angleRightPartner, base, - center,nextBases); - } - - } - - private static Point2D.Double getPoint(double angleLine, double angleBulge, Point2D.Double center, - Point2D.Double VN,double radius, double addedRadius, double dirBulge) - { - return new Point2D.Double( - center.x + radius * Math.cos(angleLine)+ - dirBulge*addedRadius*Math.sin(angleBulge)*VN.x, - center.y + radius * Math.sin(angleLine)+ - dirBulge*addedRadius*Math.sin(angleBulge)*VN.y); - } - - - private ArrayList computeNewAngles(int numPoints, Point2D.Double center, - Point2D.Double VN, double angle, double angleBase, double radius, double addedRadius) - { - ArrayList result = new ArrayList(); - if (numPoints>0) - { - ArrayList factors = new ArrayList(); - - - Point2D.Double prevP = new Point2D.Double( - center.x + radius * Math.cos(angleBase), - center.y + radius * Math.sin(angleBase)); - - - double fact = 0.; - - double angleBulge = 0.; - double dirBulge = (angle<0)?-1.:1.; - double dtarget =2.*BASE_RADIUS; - - for (int i = 0; i < numPoints; i++) - { - double lbound = fact; - double ubound = 1.0; - double angleLine = angleBase + angle*fact; - angleBulge = Math.PI*fact; - Point2D.Double currP = getPoint(angleLine, angleBulge, center,VN,radius, addedRadius, dirBulge); - - int numIter = 0; - while ((Math.abs(currP.distance(prevP)-dtarget)>0.01)&& (numIter<100)) - { - if (currP.distance(prevP)> dtarget) - { - ubound = fact; - fact = (fact+lbound)/2.0; - } - else - { - lbound = fact; - fact = (fact+ubound)/2.0; - } - angleLine = angleBase + angle*fact; - angleBulge = Math.PI*fact; - currP = getPoint(angleLine, angleBulge, center,VN,radius, addedRadius, dirBulge); - numIter++; - } - factors.add(fact); - prevP = currP; - } - - - double rescale = 1.0/(factors.get(factors.size()-1)+factors.get(0)); - - for(int j=0;j0) - { - prevP = getPoint(angleBase, 0, center,VN,radius, addedRadius, dirBulge); - double totDist = 0.0; - for(int j=0;j(); - prevP = new Point2D.Double( - center.x + radius * Math.cos(angleBase), - center.y + radius * Math.sin(angleBase)); - for (int i = 0; i < numPoints; i++) - { - double lbound = fact; - double ubound = 1.5; - double angleLine = angleBase + angle*fact; - angleBulge = Math.PI*fact; - Point2D.Double currP = getPoint(angleLine, angleBulge, center,VN,radius, addedRadius, dirBulge); - - int numIter = 0; - while ((Math.abs(currP.distance(prevP)-dtarget)>0.01)&& (numIter<100)) - { - if (currP.distance(prevP)> dtarget) - { - ubound = fact; - fact = (fact+lbound)/2.0; - } - else - { - lbound = fact; - fact = (fact+ubound)/2.0; - } - angleLine = angleBase + angle*fact; - angleBulge = Math.PI*fact; - currP = getPoint(angleLine, angleBulge, center,VN,radius, addedRadius, dirBulge); - numIter++; - } - factors.add(fact); - prevP = currP; - } - rescale = 1.0/(factors.get(factors.size()-1)+factors.get(0)); - for(int j=0;j j) { - return; - } - - // BasePaired - if (_listeBases.get(i).getElementStructure() == j) { - double normalAngle = Math.PI / 2.0; - centers[i] = new Point2D.Double(x, y); - centers[j] = new Point2D.Double(x, y); - coords[i].x = (x + BASE_PAIR_DISTANCE - * Math.cos(dirAngle - normalAngle) / 2.0); - coords[i].y = (y + BASE_PAIR_DISTANCE - * Math.sin(dirAngle - normalAngle) / 2.0); - coords[j].x = (x + BASE_PAIR_DISTANCE - * Math.cos(dirAngle + normalAngle) / 2.0); - coords[j].y = (y + BASE_PAIR_DISTANCE - * Math.sin(dirAngle + normalAngle) / 2.0); - drawLoop(i + 1, j - 1, x + LOOP_DISTANCE * Math.cos(dirAngle), y - + LOOP_DISTANCE * Math.sin(dirAngle), dirAngle, coords, - centers, angles, straightBulges); - } else { - int k = i; - Vector basesMultiLoop = new Vector(); - Vector helices = new Vector(); - int l; - while (k <= j) { - l = _listeBases.get(k).getElementStructure(); - if (l > k) { - basesMultiLoop.add(new Integer(k)); - basesMultiLoop.add(new Integer(l)); - helices.add(new Integer(k)); - k = l + 1; - } else { - basesMultiLoop.add(new Integer(k)); - k++; - } - } - int mlSize = basesMultiLoop.size() + 2; - int numHelices = helices.size() + 1; - double totalLength = MULTILOOP_DISTANCE * (mlSize - numHelices) - + BASE_PAIR_DISTANCE * numHelices; - double multiLoopRadius; - double angleIncrementML; - double angleIncrementBP; - if (mlSize > 3) { - multiLoopRadius = determineRadius(numHelices, mlSize - - numHelices, (totalLength) / (2.0 * Math.PI), - BASE_PAIR_DISTANCE, MULTILOOP_DISTANCE); - angleIncrementML = -2.0 - * Math.asin(((float) MULTILOOP_DISTANCE) - / (2.0 * multiLoopRadius)); - angleIncrementBP = -2.0 - * Math.asin(((float) BASE_PAIR_DISTANCE) - / (2.0 * multiLoopRadius)); - } - else { - multiLoopRadius = 35.0; - angleIncrementBP = -2.0 - * Math.asin(((float) BASE_PAIR_DISTANCE) - / (2.0 * multiLoopRadius)); - angleIncrementML = (-2.0 * Math.PI - angleIncrementBP) / 2.0; - } - // System.out.println("MLr:"+multiLoopRadius+" iBP:"+angleIncrementBP+" iML:"+angleIncrementML); - - double centerDist = Math.sqrt(Math.max(Math.pow(multiLoopRadius, 2) - - Math.pow(BASE_PAIR_DISTANCE / 2.0, 2), 0.0)) - - LOOP_DISTANCE; - Point2D.Double mlCenter = new Point2D.Double( - (x + (centerDist * Math.cos(dirAngle))), - (y + (centerDist * Math.sin(dirAngle)))); - - // Base directing angle for (multi|hairpin) loop, from the center's - // perspective - double baseAngle = dirAngle - // U-turn - + Math.PI - // Account for already drawn supporting base-pair - + 0.5 * angleIncrementBP - // Base cannot be paired twice, so next base is at - // "unpaired base distance" - + 1.0 * angleIncrementML; - - ArrayList currUnpaired = new ArrayList(); - Couple currInterval = new Couple(0.,baseAngle-1.0 * angleIncrementML); - ArrayList,Couple>> intervals = new ArrayList,Couple>>(); - - for (k = basesMultiLoop.size() - 1; k >= 0; k--) { - l = basesMultiLoop.get(k).intValue(); - //System.out.println(l+" "); - centers[l] = mlCenter; - boolean isPaired = (_listeBases.get(l).getElementStructure() != -1); - boolean isPaired3 = isPaired && (_listeBases.get(l).getElementStructure() < l); - boolean isPaired5 = isPaired && !isPaired3; - if (isPaired3) { - if ((numHelices == 2) && straightBulges) - { - baseAngle = dirAngle-angleIncrementBP/2.; - } - else - { - baseAngle = correctHysteresis(baseAngle+angleIncrementBP/2.)-angleIncrementBP/2.; - } - currInterval.first = baseAngle; - intervals.add(new Couple,Couple>(currUnpaired,currInterval)); - currInterval = new Couple(-1.,-1.); - currUnpaired = new ArrayList(); - } - else if (isPaired5) - { - currInterval.second = baseAngle; - } - else - { - currUnpaired.add(l); - } - - angles[l] = baseAngle; - if (isPaired3) - { - baseAngle += angleIncrementBP; - } - else { - baseAngle += angleIncrementML; - } - } - currInterval.first = dirAngle - - Math.PI - - 0.5 * angleIncrementBP; - intervals.add(new Couple,Couple>(currUnpaired,currInterval)); - //System.out.println("Inc. ML:"+angleIncrementML+" BP:"+angleIncrementBP); - - for(Couple,Couple> inter: intervals) - { - //double mid = inter.second.second; - double mina = inter.second.first; - double maxa = normalizeAngle(inter.second.second,mina); - //System.out.println(""+mina+" " +maxa); - - for (int n=0;n= 0; k--) { - l = basesMultiLoop.get(k).intValue(); - coords[l].x = mlCenter.x + multiLoopRadius - * Math.cos(angles[l]); - coords[l].y = mlCenter.y + multiLoopRadius - * Math.sin(angles[l]); - } - - // System.out.println("n1:"+n1+" n2:"+n2); - double newAngle; - int m, n; - for (k = 0; k < helices.size(); k++) { - m = helices.get(k).intValue(); - n = _listeBases.get(m).getElementStructure(); - newAngle = (angles[m] + angles[n]) / 2.0; - drawLoop(m + 1, n - 1, (LOOP_DISTANCE * Math.cos(newAngle)) - + (coords[m].x + coords[n].x) / 2.0, - (LOOP_DISTANCE * Math.sin(newAngle)) - + (coords[m].y + coords[n].y) / 2.0, newAngle, - coords, centers, angles, straightBulges); - } - } - } - - private Vector getPreviousUnpaired(Point h) - { - Vector prevBases = new Vector(); - boolean over = false; - int i = h.y + 1; - while (!over) { - if (i >=get_listeBases().size()) { - over = true; - } else { - if (get_listeBases().get(i) - .getElementStructure() == -1) { - prevBases.add(new Integer(i)); - } else { - over = true; - } - } - i++; - } - return prevBases; - } - - private Vector getNextUnpaired(Point h) - { - boolean over = false; - int i = h.x - 1; - Vector nextBases = new Vector(); - while (!over) { - if (i < 0) { - over = true; - } else { - if (get_listeBases().get(i) - .getElementStructure() == -1) { - nextBases.add(new Integer(i)); - } else { - over = true; - } - } - i--; - } - return nextBases; - } - - - public void rotateEverything(double delta, double base, double pLimL, double pLimR, Point h, Point ml, Hashtable backupPos) - { - boolean isDirect = testDirectionality(ml.x, ml.y, h.x); - Point2D.Double center = get_listeBases().get(h.x).getCenter(); - for(int k=h.x;k<=h.y;k++) - { backupPos.put(k, getBaseAt(k).getCoords()); } - rotateHelix(center, h.x, h.y, delta); - - // Re-assigns unpaired atoms - Point2D.Double helixStart = getCoords(h.x); - Point2D.Double helixStop = getCoords(h.y); - double pHelR,pHelL; - if (isDirect) { - pHelR = computeAngle(center, helixStop) - base; - pHelL = computeAngle(center, helixStart) - base; - } else { - pHelL = computeAngle(center, helixStop) - base; - pHelR = computeAngle(center, helixStart) - base; - } - - Vector prevBases = getPreviousUnpaired(h); - Vector nextBases = getNextUnpaired(h); - - double radius = center.distance(helixStart); - - for (int j = 0; j < prevBases.size(); j++) - { - int k = prevBases.get(j); - backupPos.put(k, getCoords(k)); - } - for (int j = 0; j < nextBases.size(); j++) - { - int k = nextBases.get(j); - backupPos.put(k, getCoords(k)); - } - fixUnpairedPositions(isDirect, pHelR, pLimL, pLimR, pHelL, radius, base,center,prevBases,nextBases); - } - - - - public void drawRNARadiate() { - drawRNARadiate(-1.0, VARNAConfig.DEFAULT_SPACE_BETWEEN_BASES, true, true); - } - - public void drawRNARadiate(VARNAConfig conf) { - drawRNARadiate(-1.0, conf._spaceBetweenBases, conf._flatExteriorLoop, false); - } - - public static final double FLAT_RECURSIVE_INCREMENT = 20.; - - public void drawRNARadiate(double dirAngle, double _spaceBetweenBases, - boolean flatExteriorLoop, boolean straightBulges) { - _drawn = true; - straightBulges = true; - _drawMode = DRAW_MODE_RADIATE; - Point2D.Double[] coords = new Point2D.Double[_listeBases.size()]; - Point2D.Double[] centers = new Point2D.Double[_listeBases.size()]; - double[] angles = new double[_listeBases.size()]; - for (int i = 0; i < _listeBases.size(); i++) { - coords[i] = new Point2D.Double(0, 0); - centers[i] = new Point2D.Double(0, 0); - } - if (flatExteriorLoop) { - dirAngle += 1.0 - Math.PI / 2.0; - int i = 0; - double x = 0.0; - double y = 0.0; - double vx = -Math.sin(dirAngle); - double vy = Math.cos(dirAngle); - while (i < _listeBases.size()) { - coords[i].x = x; - coords[i].y = y; - centers[i].x = x + BASE_PAIR_DISTANCE * vy; - centers[i].y = y - BASE_PAIR_DISTANCE * vx; - int j = _listeBases.get(i).getElementStructure(); - if (j > i) { - double increment = 0.; - if (i+1<_listeBases.size()) - { - if (_listeBases.get(i+1).getElementStructure()==-1) - { - //increment = -FLAT_RECURSIVE_INCREMENT; - } - } - drawLoop(i, j, x + (BASE_PAIR_DISTANCE * vx / 2.0), y - + (BASE_PAIR_DISTANCE * vy / 2.0)+increment, dirAngle, - coords, centers, angles, straightBulges); - centers[i].x = coords[i].x + BASE_PAIR_DISTANCE * vy; - centers[i].y = y - BASE_PAIR_DISTANCE * vx; - i = j; - x += BASE_PAIR_DISTANCE * vx; - y += BASE_PAIR_DISTANCE * vy; - centers[i].x = coords[i].x + BASE_PAIR_DISTANCE * vy; - centers[i].y = y - BASE_PAIR_DISTANCE * vx; - } - x += MULTILOOP_DISTANCE * vx; - y += MULTILOOP_DISTANCE * vy; - i += 1; - } - } else { - drawLoop(0, _listeBases.size() - 1, 0, 0, dirAngle, coords, centers, angles, straightBulges); - } - for (int i = 0; i < _listeBases.size(); i++) { - _listeBases.get(i).setCoords( - new Point2D.Double(coords[i].x * _spaceBetweenBases, - coords[i].y * _spaceBetweenBases)); - _listeBases.get(i).setCenter( - new Point2D.Double(centers[i].x * _spaceBetweenBases, - centers[i].y * _spaceBetweenBases)); - } - - // TODO - // change les centres des bases de la premiere helice vers la boucle la - // plus proche - } - - public void drawRNANAView(VARNAConfig conf) throws ExceptionNAViewAlgorithm { - _drawMode = DRAW_MODE_NAVIEW; - _drawn = true; - - ArrayList X = new ArrayList(_listeBases.size()); - ArrayList Y = new ArrayList(_listeBases.size()); - ArrayList pair_table = new ArrayList(_listeBases.size()); - - for (int i = 0; i < _listeBases.size(); i++) { - pair_table.add(Short.valueOf(String.valueOf(_listeBases.get(i) - .getElementStructure()))); - } - NAView naView = new NAView(); - naView.naview_xy_coordinates(pair_table, X, Y); - - // Updating individual base positions - for (int i = 0; i < _listeBases.size(); i++) { - _listeBases.get(i).setCoords( - new Point2D.Double( - X.get(i) * 2.5 * conf._spaceBetweenBases, Y.get(i) - * 2.5 * conf._spaceBetweenBases)); - } - - // Updating centers - for (int i = 0; i < _listeBases.size(); i++) { - int indicePartner = _listeBases.get(i).getElementStructure(); - if (indicePartner != -1) { - Point2D.Double base = _listeBases.get(i).getCoords(); - Point2D.Double partner = _listeBases.get(indicePartner) - .getCoords(); - _listeBases.get(i).setCenter( - new Point2D.Double((base.x + partner.x) / 2.0, - (base.y + partner.y) / 2.0)); - } else { - Vector loop = getLoopBases(i); - double tmpx = 0.0; - double tmpy = 0.0; - for (int j = 0; j < loop.size(); j++) { - int partner = loop.elementAt(j); - Point2D.Double loopmember = _listeBases.get(partner) - .getCoords(); - tmpx += loopmember.x; - tmpy += loopmember.y; - } - _listeBases.get(i).setCenter( - new Point2D.Double(tmpx / loop.size(), tmpy - / loop.size())); - } - } - } - - /* - * public void drawMOTIFView() { _drawn = true; _drawMode = - * DRAW_MODE_MOTIFVIEW; int spaceBetweenStrand =0; Motif motif = new - * Motif(this,get_listeBases()); motif.listStrand(); for (int i = 0; i < - * motif.getListStrand().sizeStruct(); i++ ){ for (int j = 0; j < - * motif.getListStrand().getStrand(i).sizeStrand(); j++ ){ int indice = - * motif.getListStrand().getStrand(i).getMB(j).getIndex(); - * get_listeBases().get(indice).setCoords( new Point2D.Double(0,0)); - * get_listeBases().get(indice).setCenter( new Point2D.Double(0, 0)); - * - * } } //Recherche du brin central int centralStrand = - * motif.getCentralStrand(); - * - * //Cas o? l'on a un motif en ?toile if(centralStrand!=-1){ //On positionne - * le brin central motif.positionneSpecificStrand(centralStrand, - * spaceBetweenStrand); - * - * //On place les autres brins par rapport a ce brin central - * motif.orderStrands(centralStrand); } - * - * else { centralStrand = 0; motif.positionneStrand(); motif.ajusteStrand(); - * } motif.reajustement(); motif.deviationBasePair(); - * motif.setCenterMotif(); } - */ - - public ArrayList getAllPartners(int indice) { - ArrayList result = new ArrayList(); - ModeleBase me = this.getBaseAt(indice); - int i = me.getElementStructure(); - if (i != -1) { - result.add(getBaseAt(i)); - } - ArrayList msbps = getAuxBPs(indice); - for (ModeleBP m : msbps) { - result.add(m.getPartner(me)); - } - return result; - } - - public int get_drawMode() { - return _drawMode; - } - - public void setDrawMode(int drawMode) { - _drawMode = drawMode; - } - - public Set getSeparatorPositions(String s) { - HashSet result = new HashSet(); - int index = s.indexOf(DBNStrandSep); - while (index >= 0) { - result.add(index); - index = s.indexOf(DBNStrandSep, index + 1); - } - return result; - } - - public static String DBNStrandSep = "&"; - - public void setRNA(String seq, String str) - throws ExceptionFileFormatOrSyntax, - ExceptionUnmatchedClosingParentheses { - ArrayList al = RNA.explodeSequence(seq); - Set sepPos = getSeparatorPositions(str); - ArrayList alRes = new ArrayList(); - Set resSepPos = new HashSet(); - String strRes = ""; - for (int i = 0; i < al.size(); i++) { - if (sepPos.contains(i) && al.get(i).equals(DBNStrandSep)) { - resSepPos.add(alRes.size() - 1); - } else { - alRes.add(al.get(i)); - if (i s = RNA.explodeSequence(seq); - int[] str = new int[s.size()]; - for (int i = 0; i < str.length; i++) { - str[i] = -1; - } - try { - setRNA(s, str); - } catch (ExceptionFileFormatOrSyntax e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - public void setRNA(String seq, int[] str) - throws ExceptionFileFormatOrSyntax, - ExceptionUnmatchedClosingParentheses { - setRNA(RNA.explodeSequence(seq), str); - } - - public void setRNA(String[] seq, int[] str) - throws ExceptionFileFormatOrSyntax { - setRNA(seq, str, 1); - } - - public void setRNA(List seq, int[] str) - throws ExceptionFileFormatOrSyntax { - setRNA(seq.toArray(new String[seq.size()]), str, 1); - } - - public void setRNA(List seq, int[] str, int baseIndex) - throws ExceptionFileFormatOrSyntax { - setRNA(seq.toArray(new String[seq.size()]), str, baseIndex); - } - - public void setRNA(String[] seq, int[] str, int baseIndex) - throws ExceptionFileFormatOrSyntax { - clearAnnotations(); - _listeBases = new ArrayList(); - if (seq.length != str.length) { - warningEmition("Sequence length " + seq.length - + " differs from that of secondary structure " + str.length - + ". \nAdapting sequence length ..."); - if (seq.length < str.length) { - String[] nseq = new String[str.length]; - for (int i = 0; i < seq.length; i++) { - nseq[i] = seq[i]; - } - for (int i = seq.length; i < nseq.length; i++) { - nseq[i] = ""; - } - seq = nseq; - } else { - String[] seqTmp = new String[str.length]; - for (int i = 0; i < str.length; i++) { - seqTmp[i] = seq[i]; - } - seq = seqTmp; - } - } - for (int i = 0; i < str.length; i++) { - _listeBases.add(new ModeleBaseNucleotide(seq[i], i, baseIndex + i)); - } - applyStruct(str); - } - - /** - * Sets the RNA to be drawn. Uses when comparison mode is on. Will draw the - * super-structure passed in parameters and apply specials styles to the - * bases owning by each RNA alignment and both. - * - * @param seq - * - The sequence of the super-structure This sequence shall be - * designed like this: - * firstRNA1stBaseSecondRNA1stBaseFirstRNA2ndBaseSecondRNA2ndBase [...] - *
- * Example: AAC-GUAGA--UGG - * @param struct - * - The super-structure - * @param basesOwn - * - The RNA owning bases array (each index will be:0 when common - * base, 1 when first RNA alignment base, 2 when second RNA - * alignment base) - * @throws ExceptionUnmatchedClosingParentheses - * @throws ExceptionFileFormatOrSyntax - */ - public void setRNA(String seq, String struct, ArrayList basesOwn) - throws ExceptionUnmatchedClosingParentheses, - ExceptionFileFormatOrSyntax { - clearAnnotations(); - _listeBases = new ArrayList(); - // On "parse" la structure (repérage des points, tiret et couples - // parentheses ouvrante/fermante) - int[] array_struct = parseStruct(struct); - int size = struct.length(); - int j = 0; - for (int i = 0; i < size; i++) { - ModeleBase mb; - if (seq.charAt(j) != seq.charAt(j + 1)) { - ModeleBasesComparison mbc = new ModeleBasesComparison( - seq.charAt(j), seq.charAt(j + 1), i); - mbc.set_appartenance(basesOwn.get(i)); - mbc.setBaseNumber(i + 1); - mb = mbc; - } else { - mb = new ModeleBaseNucleotide("" + seq.charAt(j), i, i + 1); - - } - _listeBases.add(mb); - j += 2; - } - for (int i = 0; i < size; i++) { - if (array_struct[i] != -1) { - this.addBPNow(i, array_struct[i]); - } - - j += 2; - } - } - - public void setRNA(List seq, String dbnStr) - throws ExceptionUnmatchedClosingParentheses, - ExceptionFileFormatOrSyntax { - clearAnnotations(); - int[] finStr = RNAFactory.parseSecStr(dbnStr); - setRNA(seq, finStr); - } - - public static ArrayList explodeSequence(String seq) { - ArrayList analyzedSeq = new ArrayList(); - int i = 0; - while (i < seq.length()) { - if (seq.charAt(i) == '{') { - boolean found = false; - String buf = ""; - i++; - while (!found & (i < seq.length())) { - if (seq.charAt(i) != '}') { - buf += seq.charAt(i); - i++; - } else { - found = true; - } - } - analyzedSeq.add(buf); - } else { - analyzedSeq.add("" + seq.charAt(i)); - } - i++; - } - return analyzedSeq; - } - - public int[] parseStruct(String str) - throws ExceptionUnmatchedClosingParentheses, - ExceptionFileFormatOrSyntax { - int[] result = new int[str.length()]; - int unexpectedChar = -1; - Stack p = new Stack(); - for (int i = 0; i < str.length(); i++) { - char c = str.charAt(i); - if (c == '(') { - p.push(new Integer(i)); - } else if (c == '.' || c == '-' || c == ':') { - result[i] = -1; - } else if (c == ')') { - if (p.size() == 0) { - throw new ExceptionUnmatchedClosingParentheses(i + 1); - } - int j = p.pop().intValue(); - result[i] = j; - result[j] = i; - } else { - if (unexpectedChar == -1) - unexpectedChar = i; - break; - } - } - - if (unexpectedChar != -1) { - // warningEmition("Unexpected Character at index:" + - // unexpectedChar); - } - - if (p.size() != 0) { - throw new ExceptionUnmatchedClosingParentheses( - p.pop().intValue() + 1); - } - - return result; - } - - public Point getHelixInterval(int index) { - if ((index < 0) || (index >= _listeBases.size())) { - return new Point(index, index); - } - int j = _listeBases.get(index).getElementStructure(); - if (j != -1) { - int minH = index; - int maxH = index; - if (j > index) { - maxH = j; - } else { - minH = j; - } - boolean over = false; - while (!over) { - if ((minH < 0) || (maxH >= _listeBases.size())) { - over = true; - } else { - if (_listeBases.get(minH).getElementStructure() == maxH) { - minH--; - maxH++; - } else { - over = true; - } - } - } - minH++; - maxH--; - return new Point(minH, maxH); - } - return new Point(0, 0); - } - - public Point getExteriorHelix(int index) { - Point h = getHelixInterval(index); - int a = h.x; - int b = h.y; - while (!((h.x==0))) - { - a = h.x; - b = h.y; - h = getHelixInterval(a-1); - } - return new Point(a, b); - } - - - public ArrayList getHelix(int index) { - ArrayList result = new ArrayList(); - if ((index < 0) || (index >= _listeBases.size())) { - return result; - } - Point p = getHelixInterval(index); - for (int i = p.x; i <= p.y; i++) { - result.add(i); - result.add(this._listeBases.get(i).getElementStructure()); - } - return result; - } - - public Point getMultiLoop(int index) { - if ((index < 0) || (index >= _listeBases.size())) { - return new Point(index, index); - } - Point h = getHelixInterval(index); - int minH = h.x - 1; - int maxH = h.y + 1; - boolean over = false; - while (!over) { - if (minH < 0) { - over = true; - minH = 0; - } else { - if (_listeBases.get(minH).getElementStructure() == -1) { - minH--; - } else if (_listeBases.get(minH).getElementStructure() < minH) { - minH = _listeBases.get(minH).getElementStructure() - 1; - } else { - over = true; - } - } - } - over = false; - while (!over) { - if (maxH > _listeBases.size() - 1) { - over = true; - maxH = _listeBases.size() - 1; - } else { - if (_listeBases.get(maxH).getElementStructure() == -1) { - maxH++; - } else if (_listeBases.get(maxH).getElementStructure() > maxH) { - maxH = _listeBases.get(maxH).getElementStructure() + 1; - } else { - over = true; - } - } - } - return new Point(minH, maxH); - } - - public Vector getLoopBases(int startIndex) { - Vector result = new Vector(); - - if ((startIndex < 0) || (startIndex >= _listeBases.size())) { - return result; - } - int index = startIndex; - result.add(startIndex); - if (_listeBases.get(index).getElementStructure() <= index) { - index = (index + 1) % _listeBases.size(); - } else { - index = _listeBases.get(index).getElementStructure(); - result.add(index); - index = (index + 1) % _listeBases.size(); - } - - while (index != startIndex) { - result.add(index); - if (_listeBases.get(index).getElementStructure() == -1) { - index = (index + 1) % _listeBases.size(); - } else { - index = _listeBases.get(index).getElementStructure(); - result.add(index); - index = (index + 1) % _listeBases.size(); - } - } - return result; - } - - /** - * Returns the RNA secondary structure displayed by this panel as a - * well-parenthesized word, accordingly to the DBN format - * - * @return This panel's secondary structure - */ - public String getStructDBN() { - String result = ""; - for (int i = 0; i < _listeBases.size(); i++) { - int j = _listeBases.get(i).getElementStructure(); - if (j == -1) { - result += "."; - } else if (i > j) { - result += ")"; - } else { - result += "("; - } - } - return addStrandSeparators(result); - } - - private ArrayList getNonCrossingSubset( - ArrayList> rankedBPs) { - ArrayList currentBPs = new ArrayList(); - Stack pile = new Stack(); - for (int i = 0; i < rankedBPs.size(); i++) { - ArrayList lbp = rankedBPs.get(i); - if (!lbp.isEmpty()) { - ModeleBP bp = lbp.get(0); - boolean ok = true; - if (!pile.empty()) { - int x = pile.peek(); - if ((bp.getIndex3() >= x)) { - ok = false; - } - } - if (ok) { - lbp.remove(0); - currentBPs.add(bp); - pile.add(bp.getIndex3()); - } - } - if (!pile.empty() && (i == pile.peek())) { - pile.pop(); - } - } - return currentBPs; - } - - public ArrayList paginateStructure() { - ArrayList result = new ArrayList(); - // Mumbo jumbo to sort the basepair list - ArrayList bps = this.getAllBPs(); - ModeleBP[] mt = new ModeleBP[bps.size()]; - bps.toArray(mt); - Arrays.sort(mt, new Comparator() { - public int compare(ModeleBP arg0, ModeleBP arg1) { - if (arg0.getIndex5() != arg1.getIndex5()) - return arg0.getIndex5() - arg1.getIndex5(); - else - return arg0.getIndex3() - arg1.getIndex3(); - - } - }); - ArrayList> rankedBps = new ArrayList>(); - for (int i = 0; i < getSize(); i++) { - rankedBps.add(new ArrayList()); - } - for (int i = 0; i < mt.length; i++) { - rankedBps.get(mt[i].getIndex5()).add(mt[i]); - } - - while (!bps.isEmpty()) { - //System.out.println("Page: " + result.size()); - ArrayList currentBPs = getNonCrossingSubset(rankedBps); - int[] ss = new int[this.getSize()]; - for (int i = 0; i < ss.length; i++) { - ss[i] = -1; - } - - for (int i = 0; i < currentBPs.size(); i++) { - ModeleBP mbp = currentBPs.get(i); - ss[mbp.getIndex3()] = mbp.getIndex5(); - ss[mbp.getIndex5()] = mbp.getIndex3(); - } - bps.removeAll(currentBPs); - result.add(ss); - } - return result; - } - - private void showBasic(int[] res) { - for (int i = 0; i < res.length; i++) { - System.out.print(res[i] + ","); - } - System.out.println(); - - } - - public int[] getStrandShifts() - { - int[] result = new int[getSize()]; - int acc = 0; - for (int i=0;i pages = paginateStructure(); - char[] res = new char[getSize()]; - for (int i = 0; i < res.length; i++) { - res[i] = '.'; - } - char[] open = { '(', '[', '{', '<', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; - - char[] close = new char[open.length]; - close[0] = ')'; - close[1] = ']'; - close[2] = '}'; - close[3] = '>'; - for (int i=4; i i && res[i] == '.' - && res[page[i]] == '.') { - res[i] = open[p]; - res[page[i]] = close[p]; - } - } - } - result = ""; - for (int i = 0; i < res.length; i++) { - result += res[i]; - } - - } - return addStrandSeparators(result); - - } - - public String getStructDBN(int[] str) { - String result = ""; - for (int i = 0; i < str.length; i++) { - if (str[i] == -1) { - result += "."; - } else if (str[i] > i) { - result += "("; - } else { - result += ")"; - } - } - return addStrandSeparators(result); - } - - /** - * Returns the raw nucleotides sequence for the displayed RNA - * - * @return The RNA sequence - */ - public String getSeq() { - String result = ""; - for (int i = 0; i < _listeBases.size(); i++) { - result += ((ModeleBase) _listeBases.get(i)).getContent(); - } - return addStrandSeparators(result); - } - - public String getStructBPSEQ() { - String result = ""; - int[] str = getNonOverlappingStruct(); - for (int i = 0; i < _listeBases.size(); i++) { - result += (i + 1) + " " - + ((ModeleBaseNucleotide) _listeBases.get(i)).getContent() - + " " + (str[i] + 1) + "\n"; - } - return result; - } - - public int[] getNonCrossingStruct() { - int[] result = new int[_listeBases.size()]; - // Adding "planar" base-pairs - for (int i = 0; i < _listeBases.size(); i++) { - result[i] = _listeBases.get(i).getElementStructure(); - } - return result; - } - - public int[] getNonOverlappingStruct() { - int[] result = getNonCrossingStruct(); - // Adding additional base pairs when possible (No more than one - // base-pair per base) - for (int i = 0; i < _structureAux.size(); i++) { - ModeleBP msbp = _structureAux.get(i); - ModeleBase mb5 = msbp.getPartner5(); - ModeleBase mb3 = msbp.getPartner3(); - int j5 = mb5.getIndex(); - int j3 = mb3.getIndex(); - if ((result[j3] == -1) && (result[j5] == -1)) { - result[j3] = j5; - result[j5] = j3; - } - } - return result; - } - - public String getStructCT() { - String result = ""; - for (int i = 0; i < _listeBases.size(); i++) { - result += (i + 1) + " " - + ((ModeleBase) _listeBases.get(i)).getContent() + " " + i - + " " + (i + 2) + " " - + (_listeBases.get(i).getElementStructure() + 1) + " " - + (i + 1) + "\n"; - } - return result; - } - - public void saveAsBPSEQ(String path, String title) - throws ExceptionExportFailed, ExceptionPermissionDenied { - try { - FileWriter f = new FileWriter(path); - f.write("# " + title + "\n"); - f.write(this.getStructBPSEQ() + "\n"); - f.close(); - } catch (IOException e) { - throw new ExceptionExportFailed(e.getMessage(), path); - } - } - - public void saveAsCT(String path, String title) - throws ExceptionExportFailed, ExceptionPermissionDenied { - try { - FileWriter f = new FileWriter(path); - f.write("" + _listeBases.size() + " " + title + "\n"); - f.write(this.getStructCT() + "\n"); - f.close(); - } catch (IOException e) { - throw new ExceptionExportFailed(e.getMessage(), path); - } - } - - public void saveAsDBN(String path, String title) - throws ExceptionExportFailed, ExceptionPermissionDenied { - try { - FileWriter f = new FileWriter(path); - f.write("> " + title + "\n"); - f.write(getListeBasesToString() + "\n"); - f.write(getStructDBN() + "\n"); - f.close(); - } catch (IOException e) { - throw new ExceptionExportFailed(e.getMessage(), path); - } - } - - public String getListeBasesToString() { - String s = new String(); - for (int i = 0; i < _listeBases.size(); i++) { - s += ((ModeleBaseNucleotide) _listeBases.get(i)).getContent(); - } - return addStrandSeparators(s); - } - - public void applyBPs(ArrayList allbps) { - ArrayList planar = new ArrayList(); - ArrayList others = new ArrayList(); - // System.err.println("Sequence: "+this.getSeq()); - RNAMLParser.planarize(allbps, planar, others, getSize()); - // System.err.println("All:"+allbps); - // System.err.println("=> Planar: "+planar); - // System.err.println("=> Others: "+others); - - for (ModeleBP mb : planar) { - addBPnow(mb.getPartner5().getIndex(), mb.getPartner3().getIndex(), - mb); - } - - for (ModeleBP mb : others) { - addBPAux(mb.getPartner5().getIndex(), mb.getPartner3().getIndex(), - mb); - } - } - - public void set_listeBases(ArrayList _liste) { - this._listeBases = _liste; - } - - public void addVARNAListener(InterfaceVARNAListener rl) { - _listeVARNAListener.add(rl); - } - - public void warningEmition(String warningMessage) { - for (int i = 0; i < _listeVARNAListener.size(); i++) { - _listeVARNAListener.get(i).onWarningEmitted(warningMessage); - } - } - - public void applyStyleOnBases(ArrayList basesList, - ModelBaseStyle style) { - for (int i = 1; i < basesList.size(); i++) { - _listeBases.get(basesList.get(i)).setStyleBase(style); - } - } - - private int[] correctReciprocity(int[] str) { - int[] result = new int[str.length]; - for (int i = 0; i < str.length; i++) { - if (str[i] != -1) { - if (i == str[str[i]]) { - result[i] = str[i]; - } else { - str[str[i]] = i; - } - } else { - result[i] = -1; - } - } - return result; - } - - private void applyStruct(int[] str) throws ExceptionFileFormatOrSyntax { - str = correctReciprocity(str); - - int[] planarSubset = RNAMLParser.planarize(str); - _structureAux.clear(); - - for (int i = 0; i < planarSubset.length; i++) { - if (str[i] > i) { - if (planarSubset[i] > i) { - addBPNow(i, planarSubset[i]); - } else if ((planarSubset[i] != str[i])) { - addBPAux(i, str[i]); - } - } - } - - } - - public ArrayList get_listeBases() { - return _listeBases; - } - - public int getSize() { - return _listeBases.size(); - } - - public ArrayList findAll() { - ArrayList listAll = new ArrayList(); - for (int i = 0; i < get_listeBases().size(); i++) { - listAll.add(i); - } - return listAll; - } - - public ArrayList findBulge(int index) { - ArrayList listUp = new ArrayList(); - if (get_listeBases().get(index).getElementStructure() == -1) { - int i = index; - boolean over = false; - while ((i < get_listeBases().size()) && !over) { - int j = get_listeBases().get(i).getElementStructure(); - if (j == -1) { - listUp.add(i); - i++; - } else { - over = true; - } - } - i = index - 1; - over = false; - while ((i >= 0) && !over) { - int j = get_listeBases().get(i).getElementStructure(); - if (j == -1) { - listUp.add(i); - i--; - } else { - over = true; - } - } - } - return listUp; - } - - public ArrayList findStem(int index) { - ArrayList listUp = new ArrayList(); - int i = index; - do { - listUp.add(i); - int j = get_listeBases().get(i).getElementStructure(); - if (j == -1) { - i = (i + 1) % getSize(); - } else { - if ((j < i) && (index <= i) && (j <= index)) { - i = j; - } else { - i = (i + 1) % getSize(); - } - } - } while (i != index); - return listUp; - } - - public int getHelixCountOnLoop(int indice) { - int cptHelice = 0; - if (indice < 0 || indice >= get_listeBases().size()) - return cptHelice; - int i = indice; - int j = get_listeBases().get(i).getElementStructure(); - // Only way to distinguish "supporting base-pair" from others - boolean justJumped = false; - if ((j != -1) && (j < i)) { - i = j + 1; - indice = i; - } - do { - j = get_listeBases().get(i).getElementStructure(); - if ((j != -1) && (!justJumped)) { - i = j; - justJumped = true; - cptHelice++; - } else { - i = (i + 1) % get_listeBases().size(); - justJumped = false; - } - } while (i != indice); - return cptHelice; - } - - public ArrayList findLoop(int indice) { - return findLoopForward(indice); - } - - public ArrayList findLoopForward(int indice) { - ArrayList base = new ArrayList(); - if (indice < 0 || indice >= get_listeBases().size()) - return base; - int i = indice; - int j = get_listeBases().get(i).getElementStructure(); - // Only way to distinguish "supporting base-pair" from others - boolean justJumped = false; - if (j != -1) { - i = Math.min(i, j) + 1; - indice = i; - } - do { - base.add(i); - j = get_listeBases().get(i).getElementStructure(); - if ((j != -1) && (!justJumped)) { - i = j; - justJumped = true; - } else { - i = (i + 1) % get_listeBases().size(); - justJumped = false; - } - } while (i != indice); - return base; - } - - public ArrayList findPair(int indice) { - ArrayList base = new ArrayList(); - int j = get_listeBases().get(indice).getElementStructure(); - if (j != -1) { - base.add(Math.min(indice, j)); - base.add(Math.max(indice, j)); - } - - return base; - - } - - public ArrayList findLoopBackward(int indice) { - ArrayList base = new ArrayList(); - if (indice < 0 || indice >= get_listeBases().size()) - return base; - int i = indice; - int j = get_listeBases().get(i).getElementStructure(); - // Only way to distinguish "supporting base-pair" from others - boolean justJumped = false; - if (j != -1) { - i = Math.min(i, j) - 1; - indice = i; - } - if (i < 0) { - return base; - } - do { - base.add(i); - j = get_listeBases().get(i).getElementStructure(); - if ((j != -1) && (!justJumped)) { - i = j; - justJumped = true; - } else { - i = (i + get_listeBases().size() - 1) % get_listeBases().size(); - justJumped = false; - } - } while (i != indice); - return base; - } - - public ArrayList findHelix(int indice) { - ArrayList list = new ArrayList(); - if (get_listeBases().get(indice).getElementStructure() != -1) { - list.add(indice); - list.add(get_listeBases().get(indice).getElementStructure()); - int i = 1, prec = get_listeBases().get(indice) - .getElementStructure(); - while (indice + i < get_listeBases().size() - && get_listeBases().get(indice + i).getElementStructure() != -1 - && get_listeBases().get(indice + i).getElementStructure() == prec - 1) { - list.add(indice + i); - list.add(get_listeBases().get(indice + i).getElementStructure()); - prec = get_listeBases().get(indice + i).getElementStructure(); - i++; - } - i = -1; - prec = get_listeBases().get(indice).getElementStructure(); - while (indice + i >= 0 - && get_listeBases().get(indice + i).getElementStructure() != -1 - && get_listeBases().get(indice + i).getElementStructure() == prec + 1) { - list.add(indice + i); - list.add(get_listeBases().get(indice + i).getElementStructure()); - prec = get_listeBases().get(indice + i).getElementStructure(); - i--; - } - } - return list; - } - - public ArrayList find3Prime(int indice) { - ArrayList list = new ArrayList(); - boolean over = false; - while ((indice >= 0) && !over) { - over = (get_listeBases().get(indice).getElementStructure() != -1); - indice--; - } - indice++; - if (over) { - indice++; - } - for (int i = indice; i < get_listeBases().size(); i++) { - list.add(i); - if (get_listeBases().get(i).getElementStructure() != -1) { - return new ArrayList(); - } - } - return list; - } - - public ArrayList find5Prime(int indice) { - ArrayList list = new ArrayList(); - for (int i = 0; i <= indice; i++) { - list.add(i); - if (get_listeBases().get(i).getElementStructure() != -1) { - return new ArrayList(); - } - } - return list; - } - - public static Double angle(Point2D.Double p1, Point2D.Double p2, - Point2D.Double p3) { - Double alpha = Math.atan2(p1.y - p2.y, p1.x - p2.x); - Double beta = Math.atan2(p3.y - p2.y, p3.x - p2.x); - Double angle = (beta - alpha); - - // Correction de l'angle pour le resituer entre 0 et 2PI - while (angle < 0.0 || angle > 2 * Math.PI) { - if (angle < 0.0) - angle += 2 * Math.PI; - else if (angle > 2 * Math.PI) - angle -= 2 * Math.PI; - } - return angle; - } - - public ArrayList findNonPairedBaseGroup(Integer get_nearestBase) { - // detection 3', 5', bulge - ArrayList list = new ArrayList(); - int indice = get_nearestBase; - boolean nonpairedUp = true, nonpairedDown = true; - while (indice < get_listeBases().size() && nonpairedUp) { - if (get_listeBases().get(indice).getElementStructure() == -1) { - list.add(indice); - indice++; - } else { - nonpairedUp = false; - } - } - indice = get_nearestBase - 1; - while (indice >= 0 && nonpairedDown) { - if (get_listeBases().get(indice).getElementStructure() == -1) { - list.add(indice); - indice--; - } else { - nonpairedDown = false; - } - } - return list; - } - - /* - * public boolean getDrawn() { return _drawn; } - */ - - public ArrayList getStructureAux() { - return _structureAux; - } - - /** - * Translates a base number into its corresponding index. Although both - * should be unique, base numbers are not necessarily contiguous, and - * indices should be preferred for any reasonably complex algorithmic - * treatment. - * - * @param num - * The base number - * @return The first index whose associated Base model has base number - * num, -1 of no such base model exists. - */ - - public int getIndexFromBaseNumber(int num) { - for (int i = 0; i < this._listeBases.size(); i++) { - if (_listeBases.get(i).getBaseNumber() == num) { - return i; - } - } - return -1; - } - - /** - * Adds a base pair to this RNA's structure. Tries to add it to the - * secondary structure first, eventually adding it to the 'tertiary' - * interactions if it clashes with the current secondary structure. - * - * @param baseNumber5 - * - Base number of the origin of this base pair - * @param baseNumber3 - * - Base number of the destination of this base pair - */ - - public void addBPToStructureUsingNumbers(int baseNumber5, int baseNumber3) { - int i = getIndexFromBaseNumber(baseNumber5); - int j = getIndexFromBaseNumber(baseNumber3); - addBP(i, j); - } - - /** - * Adds a base pair to this RNA's structure. Tries to add it to the - * secondary structure first, possibly adding it to the 'tertiary' - * interactions if it clashes with the current secondary structure. - * - * @param number5 - * - Base number of the origin of this base pair - * @param number3 - * - Base number of the destination of this base pair - */ - - public void addBPToStructureUsingNumbers(int number5, int number3, - ModeleBP msbp) { - addBP(getIndexFromBaseNumber(number5), getIndexFromBaseNumber(number3), - msbp); - } - - public void addBP(int index5, int index3) { - int i = index5; - int j = index3; - ModeleBase part5 = _listeBases.get(i); - ModeleBase part3 = _listeBases.get(j); - ModeleBP msbp = new ModeleBP(part5, part3); - addBP(i, j, msbp); - } - - public void addBP(int index5, int index3, ModeleBP msbp) { - int i = index5; - int j = index3; - - if (j < i) { - int k = j; - j = i; - i = k; - } - if (i != -1) { - for (int k = i; k <= j; k++) { - ModeleBase tmp = _listeBases.get(k); - int l = tmp.getElementStructure(); - if (l != -1) { - if ((l <= i) || (l >= j)) { - addBPAux(i, j, msbp); - return; - } - } - } - addBPnow(i, j, msbp); - } - } - - public void removeBP(ModeleBP ms) { - if (_structureAux.contains(ms)) { - _structureAux.remove(ms); - } else { - ModeleBase m5 = ms.getPartner5(); - ModeleBase m3 = ms.getPartner3(); - int i = m5.getIndex(); - int j = m3.getIndex(); - if ((m5.getElementStructure() == m3.getIndex()) - && (m3.getElementStructure() == m5.getIndex())) { - m5.removeElementStructure(); - m3.removeElementStructure(); - } - } - } - - /** - * Register base-pair, no question asked. More precisely, this function will - * not try to determine if the base-pairs crosses any other. - * - * @param i - * @param j - * @param msbp - */ - private void addBPNow(int i, int j) { - if (j < i) { - int k = j; - j = i; - i = k; - } - - ModeleBase part5 = _listeBases.get(i); - ModeleBase part3 = _listeBases.get(j); - ModeleBP msbp = new ModeleBP(part5, part3); - addBPnow(i, j, msbp); - } - - /** - * Register base-pair, no question asked. More precisely, this function will - * not try to determine if the base-pairs crosses any other. - * - * @param i - * @param j - * @param msbp - */ - private void addBPnow(int i, int j, ModeleBP msbp) { - if (j < i) { - int k = j; - j = i; - i = k; - } - ModeleBase part5 = _listeBases.get(i); - ModeleBase part3 = _listeBases.get(j); - msbp.setPartner5(part5); - msbp.setPartner3(part3); - part5.setElementStructure(j, msbp); - part3.setElementStructure(i, msbp); - } - - public void addBPAux(int i, int j) { - ModeleBase part5 = _listeBases.get(i); - ModeleBase part3 = _listeBases.get(j); - ModeleBP msbp = new ModeleBP(part5, part3); - addBPAux(i, j, msbp); - } - - public void addBPAux(int i, int j, ModeleBP msbp) { - if (j < i) { - int k = j; - j = i; - i = k; - } - ModeleBase part5 = _listeBases.get(i); - ModeleBase part3 = _listeBases.get(j); - msbp.setPartner5(part5); - msbp.setPartner3(part3); - _structureAux.add(msbp); - } - - public ArrayList getBPsAt(int i) { - ArrayList result = new ArrayList(); - if (_listeBases.get(i).getElementStructure() != -1) { - result.add(_listeBases.get(i).getStyleBP()); - } - for (int k = 0; k < _structureAux.size(); k++) { - ModeleBP bp = _structureAux.get(k); - if ((bp.getPartner5().getIndex() == i) - || (bp.getPartner3().getIndex() == i)) { - result.add(bp); - } - } - return result; - - } - - public ModeleBP getBPStyle(int i, int j) { - ModeleBP result = null; - if (i > j) { - int k = j; - j = i; - i = k; - } - if (_listeBases.get(i).getElementStructure() == j) { - result = _listeBases.get(i).getStyleBP(); - } - for (int k = 0; k < _structureAux.size(); k++) { - ModeleBP bp = _structureAux.get(k); - if ((bp.getPartner5().getIndex() == i) - && (bp.getPartner3().getIndex() == j)) { - result = bp; - } - } - return result; - } - - public ArrayList getSecStrBPs() { - ArrayList result = new ArrayList(); - for (int i = 0; i < this.getSize(); i++) { - ModeleBase mb = _listeBases.get(i); - int k = mb.getElementStructure(); - if ((k != -1) && (k > i)) { - result.add(mb.getStyleBP()); - } - } - return result; - } - - public ArrayList getAuxBPs() { - ArrayList result = new ArrayList(); - for (ModeleBP bp : _structureAux) { - result.add(bp); - } - return result; - } - - public ArrayList getAllBPs() { - ArrayList result = new ArrayList(); - result.addAll(getSecStrBPs()); - result.addAll(getAuxBPs()); - return result; - } - - public ArrayList getAuxBPs(int i) { - ArrayList result = new ArrayList(); - for (ModeleBP bp : _structureAux) { - if ((bp.getPartner5().getIndex() == i) - || (bp.getPartner3().getIndex() == i)) { - result.add(bp); - } - } - return result; - } - - public void setBaseInnerColor(Color c) { - for (int i = 0; i < _listeBases.size(); i++) { - ModeleBase mb = _listeBases.get(i); - mb.getStyleBase().setBaseInnerColor(c); - } - } - - public void setBaseNumbersColor(Color c) { - for (int i = 0; i < _listeBases.size(); i++) { - ModeleBase mb = _listeBases.get(i); - mb.getStyleBase().setBaseNumberColor(c); - } - } - - public void setBaseNameColor(Color c) { - for (int i = 0; i < _listeBases.size(); i++) { - ModeleBase mb = _listeBases.get(i); - mb.getStyleBase().setBaseNameColor(c); - } - } - - public void setBaseOutlineColor(Color c) { - for (int i = 0; i < _listeBases.size(); i++) { - ModeleBase mb = _listeBases.get(i); - mb.getStyleBase().setBaseOutlineColor(c); - } - } - - public String getName() { - return _name; - } - - public void setName(String n) { - _name = n; - } - - public ArrayList getAnnotations() { - return _listeAnnotations; - } - - public boolean removeAnnotation(TextAnnotation t) { - return _listeAnnotations.remove(t); - } - - public void addAnnotation(TextAnnotation t) { - _listeAnnotations.add(t); - } - - public void removeAnnotation(String filter) { - ArrayList condamne = new ArrayList(); - for (TextAnnotation t : _listeAnnotations) { - if (t.getTexte().contains(filter)) { - condamne.add(t); - } - } - for (TextAnnotation t : condamne) { - _listeAnnotations.remove(t); - } - } - - public void clearAnnotations() { - _listeAnnotations.clear(); - } - - private boolean _strandEndsAnnotated = false; - - public void autoAnnotateStrandEnds() { - if (!_strandEndsAnnotated) { - int tailleListBases = _listeBases.size(); - boolean endAnnotate = false; - addAnnotation(new TextAnnotation("5'", _listeBases.get(0))); - for (int i = 0; i < _listeBases.size() - 1; i++) { - int realposA = _listeBases.get(i).getBaseNumber(); - int realposB = _listeBases.get(i + 1).getBaseNumber(); - if (realposB - realposA != 1) { - addAnnotation(new TextAnnotation("3'", _listeBases.get(i))); - addAnnotation(new TextAnnotation("5'", - _listeBases.get(i + 1))); - if (i + 1 == _listeBases.size() - 1) { - endAnnotate = true; - } - } - } - if (!endAnnotate) { - addAnnotation(new TextAnnotation("3'", - _listeBases.get(tailleListBases - 1))); - } - _strandEndsAnnotated = true; - } else { - removeAnnotation("3'"); - removeAnnotation("5'"); - _strandEndsAnnotated = false; - } - } - - public void autoAnnotateHelices() { - Stack p = new Stack(); - p.push(0); - int nbH = 1; - while (!p.empty()) { - int i = p.pop(); - if (i < _listeBases.size()) { - ModeleBase mb = _listeBases.get(i); - int j = mb.getElementStructure(); - if (j == -1) { - p.push(i + 1); - } else { - if (j > i) { - ModeleBase mbp = _listeBases.get(j); - p.push(j + 1); - ArrayList h = new ArrayList(); - int k = 1; - while (mb.getElementStructure() == mbp.getIndex()) { - h.add(mb); - h.add(mbp); - mb = _listeBases.get(i + k); - mbp = _listeBases.get(j - k); - - k++; - } - try { - addAnnotation(new TextAnnotation("H" + nbH++, h, - TextAnnotation.AnchorType.HELIX)); - } catch (Exception e) { - e.printStackTrace(); - } - p.push(i + k); - } - } - } - } - } - - public void autoAnnotateTerminalLoops() { - Stack p = new Stack(); - p.push(0); - int nbT = 1; - while (!p.empty()) { - int i = p.pop(); - if (i < _listeBases.size()) { - ModeleBase mb = _listeBases.get(i); - int j = mb.getElementStructure(); - if (j == -1) { - int k = 1; - ArrayList t = new ArrayList(); - while ((i + k < getSize()) - && (mb.getElementStructure() == -1)) { - t.add(mb); - mb = _listeBases.get(i + k); - k++; - } - if (mb.getElementStructure() != -1) { - if (mb.getElementStructure() == i - 1) { - try { - t.add(_listeBases.get(i - 1)); - t.add(_listeBases.get(i + k - 1)); - addAnnotation(new TextAnnotation("T" + nbT++, - t, TextAnnotation.AnchorType.LOOP)); - } catch (Exception e) { - e.printStackTrace(); - } - } - p.push(i + k - 1); - } - - } else { - if (j > i) { - p.push(j + 1); - p.push(i + 1); - } - } - } - } - } - - public void autoAnnotateInteriorLoops() { - Stack p = new Stack(); - p.push(0); - int nbT = 1; - while (!p.empty()) { - int i = p.pop(); - if (i < _listeBases.size()) { - ModeleBase mb = _listeBases.get(i); - int j = mb.getElementStructure(); - if (j == -1) { - int k = i + 1; - ArrayList t = new ArrayList(); - boolean terminal = true; - while ((k < getSize()) - && ((mb.getElementStructure() >= i) || (mb - .getElementStructure() == -1))) { - t.add(mb); - mb = _listeBases.get(k); - if ((mb.getElementStructure() == -1) - || (mb.getElementStructure() < k)) - k++; - else { - p.push(k); - terminal = false; - k = mb.getElementStructure(); - } - } - if (mb.getElementStructure() != -1) { - if ((mb.getElementStructure() == i - 1) && !terminal) { - try { - t.add(_listeBases.get(i - 1)); - t.add(_listeBases.get(k - 1)); - addAnnotation(new TextAnnotation("I" + nbT++, - t, TextAnnotation.AnchorType.LOOP)); - } catch (Exception e) { - e.printStackTrace(); - } - p.push(k - 1); - } - } - } else { - if (j > i) { - p.push(i + 1); - } - } - } - } - } - - @SuppressWarnings("unchecked") - public TextAnnotation getAnnotation(TextAnnotation.AnchorType type, - ModeleBase base) { - TextAnnotation result = null; - for (TextAnnotation t : _listeAnnotations) { - if (t.getType() == type) { - switch (type) { - case BASE: - if (base == (ModeleBase) t.getAncrage()) - return t; - break; - case HELIX: - case LOOP: { - ArrayList mbl = (ArrayList) t - .getAncrage(); - if (mbl.contains(base)) - return t; - } - break; - } - } - } - return result; - } - - public void addChemProbAnnotation(ChemProbAnnotation cpa) { - //System.err.println(cpa.isOut()); - _chemProbAnnotations.add(cpa); - } - - public ArrayList getChemProbAnnotations() { - return _chemProbAnnotations; - } - - public void setColorMapValues(Double[] values, ModeleColorMap cm) { - setColorMapValues(values, cm, false); - } - - public void adaptColorMapToValues(ModeleColorMap cm) { - double min = Double.MAX_VALUE; - double max = Double.MIN_VALUE; - for (int i = 0; i < Math.min(_listeBases.size(), _listeBases.size()); i++) { - ModeleBase mb = _listeBases.get(i); - max = Math.max(max, mb.getValue()); - min = Math.min(min, mb.getValue()); - } - cm.rescale(min, max); - } - - - private ArrayList loadDotPlot(StreamTokenizer st) - { - ArrayList result = new ArrayList(); - try { - boolean inSeq = false; - String sequence = ""; - ArrayList accumulator = new ArrayList(); - int type = st.nextToken(); - Hashtable,Double> BP = new Hashtable,Double>(); - while (type != StreamTokenizer.TT_EOF) { - switch (type) { - case (StreamTokenizer.TT_NUMBER): - accumulator.add(st.nval); - break; - case (StreamTokenizer.TT_EOL): - break; - case (StreamTokenizer.TT_WORD): - if (st.sval.equals("/sequence")) - { - inSeq = true; - } - else if (st.sval.equals("ubox")) - { - int i = accumulator.get(accumulator.size()-3).intValue()-1; - int j = accumulator.get(accumulator.size()-2).intValue()-1; - double val = accumulator.get(accumulator.size()-1); - //System.err.println((char) type); - BP.put(new Couple(Math.min(i, j), Math.max(i, j)),val*val); - accumulator.clear(); - } - else if (inSeq) - { - sequence += st.sval; - } - break; - case ')': - inSeq = false; - break; - } - type = st.nextToken(); - } - for (int i = 0; i < getSize(); i++) { - int j = getBaseAt(i).getElementStructure(); - if (j != -1) { - Couple coor = new Couple( - Math.min(i, j), Math.max(i, j)); - if (BP.containsKey(coor)) { - result.add(BP.get(coor)); - } else { - result.add(0.); - } - } else { - double acc = 1.0; - for (int k = 0; k < getSize(); k++) { - Couple coor = new Couple( - Math.min(i, k), Math.max(i, k)); - if (BP.containsKey(coor)) { - acc -= BP.get(coor); - } - } - result.add(acc); - } - } - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return result; - } - - public void readValues(Reader r, ModeleColorMap cm) { - try { - StreamTokenizer st = new StreamTokenizer(r); - st.eolIsSignificant(true); - st.wordChars('/', '/'); - st.parseNumbers(); - ArrayList vals = new ArrayList(); - ArrayList curVals = new ArrayList(); - int type = st.nextToken(); - boolean isDotPlot = false; - if (type=='%') - { - vals = loadDotPlot(st); - isDotPlot = true; - } - else - { - while (type != StreamTokenizer.TT_EOF) { - switch (type) { - case (StreamTokenizer.TT_NUMBER): - curVals.add(st.nval); - break; - case (StreamTokenizer.TT_EOL): - if (curVals.size() > 0) { - vals.add(curVals.get(curVals.size()-1)); - curVals = new ArrayList(); - } - break; - } - type = st.nextToken(); - } - if (curVals.size() > 0) - vals.add(curVals.get(curVals.size()-1)); - } - - Double[] v = new Double[vals.size()]; - for (int i = 0; i < Math.min(vals.size(), getSize()); i++) { - v[i] = vals.get(i); - } - setColorMapValues(v, cm, true); - if (isDotPlot) - { - cm.setMinValue(0.0); - cm.setMaxValue(1.0); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void setColorMapValues(Double[] values, ModeleColorMap cm, - boolean rescaleColorMap) { - if (values.length > 0) { - for (int i = 0; i < Math.min(values.length, _listeBases.size()); i++) { - ModeleBase mb = _listeBases.get(i); - mb.setValue(values[i]); - } - if (rescaleColorMap) { - adaptColorMapToValues(cm); - } - } - } - - public Double[] getColorMapValues() { - Double[] values = new Double[_listeBases.size()]; - for (int i = 0; i < _listeBases.size(); i++) { - values[i] = _listeBases.get(i).getValue(); - } - return values; - } - - public void rescaleColorMap(ModeleColorMap cm) { - Double max = Double.MIN_VALUE; - Double min = Double.MAX_VALUE; - for (int i = 0; i < _listeBases.size(); i++) { - Double value = _listeBases.get(i).getValue(); - max = Math.max(max, value); - min = Math.min(min, value); - } - cm.rescale(min, max); - } - - public void addBase(ModeleBase mb) { - _listeBases.add(mb); - } - - public void setSequence(String s) { - setSequence(RNA.explodeSequence(s)); - } - - public void setSequence(List s) { - int i = 0; - int j = 0; - while ((i < s.size()) && (j < _listeBases.size())) { - ModeleBase mb = _listeBases.get(j); - if (mb instanceof ModeleBaseNucleotide) { - ((ModeleBaseNucleotide) mb).setBase(s.get(i)); - i++; - j++; - } else if (mb instanceof ModeleBasesComparison) { - ((ModeleBasesComparison) mb) - .setBase1(((s.get(i).length() > 0) ? s.get(i).charAt(0) - : ' ')); - ((ModeleBasesComparison) mb) - .setBase2(((s.get(i + 1).length() > 0) ? s.get(i + 1) - .charAt(0) : ' ')); - i += 2; - j++; - } else - j++; - } - for (i = _listeBases.size(); i < s.size(); i++) { - _listeBases.add(new ModeleBaseNucleotide(s.get(i), i)); - } - } - - public void eraseSequence() { - int j = 0; - while ((j < _listeBases.size())) { - ModeleBase mb = _listeBases.get(j); - if (mb instanceof ModeleBaseNucleotide) { - ((ModeleBaseNucleotide) mb).setBase(""); - j++; - } else if (mb instanceof ModeleBasesComparison) { - ((ModeleBasesComparison) mb).setBase1(' '); - ((ModeleBasesComparison) mb).setBase2(' '); - j++; - } else - j++; - } - } - - public RNA clone() { - try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - ObjectOutputStream oout = new ObjectOutputStream(out); - oout.writeObject(this); - - ObjectInputStream in = new ObjectInputStream( - new ByteArrayInputStream(out.toByteArray())); - return (RNA) in.readObject(); - } catch (Exception e) { - throw new RuntimeException("cannot clone class [" - + this.getClass().getName() + "] via serialization: " - + e.toString()); - } - } - - /** - * Returns the base at index index. Indices are contiguous in - * the sequence over an interval [0,this.getSize()-1], where - * n is the length of the sequence. - * - * @param index - * The index, 0 ≤ index < this.getSize(), of the - * base model - * @return The base model of index index - */ - public ModeleBase getBaseAt(int index) { - return this._listeBases.get(index); - } - - /** - * Returns the set of bases of indices in indices. Indices are - * contiguous in the sequence, and belong to an interval - * [0,n-1], where n is the length of the sequence. - * - * @param indices - * A Collection of indices i, - * 0 ≤ index < this.getSize(), where some base - * models are found. - * @return A list of base model of indices in indices - */ - public ArrayList getBasesAt( - Collection indices) { - ArrayList mbs = new ArrayList(); - for (int i : indices) { - mbs.add(getBaseAt(i)); - } - return mbs; - } - - public ArrayList getBasesBetween(int from, int to) { - ArrayList mbs = new ArrayList(); - int bck = Math.min(from, to); - to = Math.max(from, to); - from = bck; - for (int i = from; i <= to; i++) { - mbs.add(getBaseAt(i)); - } - return mbs; - } - - public void addHighlightRegion(HighlightRegionAnnotation n) { - _listeRegionHighlights.add(n); - } - - public void removeHighlightRegion(HighlightRegionAnnotation n) { - _listeRegionHighlights.remove(n); - } - - public void removeChemProbAnnotation(ChemProbAnnotation a) { - _chemProbAnnotations.remove(a); - } - - public void clearChemProbAnnotations() { - _chemProbAnnotations.clear(); - } - - public void addHighlightRegion(int from, int to, Color fill, Color outline, - double radius) { - _listeRegionHighlights.add(new HighlightRegionAnnotation( - getBasesBetween(from, to), fill, outline, radius)); - } - - public void addHighlightRegion(int from, int to) { - _listeRegionHighlights.add(new HighlightRegionAnnotation( - getBasesBetween(from, to))); - } - - public ArrayList getHighlightRegion() { - return _listeRegionHighlights; - } - - /** - * Rotates the RNA coordinates by a certain angle - * - * @param angleDegres - * Rotation angle, in degrees - */ - public void globalRotation(Double angleDegres) { - if (_listeBases.size() > 0) { - - // angle en radian - Double angle = angleDegres * Math.PI / 180; - - // initialisation du minimum et dumaximum - Double maxX = _listeBases.get(0).getCoords().x; - Double maxY = _listeBases.get(0).getCoords().y; - Double minX = _listeBases.get(0).getCoords().x; - Double minY = _listeBases.get(0).getCoords().y; - // mise a jour du minimum et du maximum - for (int i = 0; i < _listeBases.size(); i++) { - if (_listeBases.get(i).getCoords().getX() < minX) - minX = _listeBases.get(i).getCoords().getX(); - if (_listeBases.get(i).getCoords().getY() < minY) - minY = _listeBases.get(i).getCoords().getY(); - if (_listeBases.get(i).getCoords().getX() > maxX) - maxX = _listeBases.get(i).getCoords().getX(); - if (_listeBases.get(i).getCoords().getX() > maxY) - maxY = _listeBases.get(i).getCoords().getY(); - } - // creation du point central - Point2D.Double centre = new Point2D.Double((maxX - minX) / 2, - (maxY - minY) / 2); - Double x, y; - for (int i = 0; i < _listeBases.size(); i++) { - // application de la rotation au centre de chaque base - // x' = cos(theta)*(x-xc) - sin(theta)*(y-yc) + xc - x = Math.cos(angle) - * (_listeBases.get(i).getCenter().getX() - centre.x) - - Math.sin(angle) - * (_listeBases.get(i).getCenter().getY() - centre.y) - + centre.x; - // y' = sin(theta)*(x-xc) + cos(theta)*(y-yc) + yc - y = Math.sin(angle) - * (_listeBases.get(i).getCenter().getX() - centre.x) - + Math.cos(angle) - * (_listeBases.get(i).getCenter().getY() - centre.y) - + centre.y; - _listeBases.get(i).setCenter(new Point2D.Double(x, y)); - - // application de la rotation au coordonnees de chaque - // base - // x' = cos(theta)*(x-xc) - sin(theta)*(y-yc) + xc - x = Math.cos(angle) - * (_listeBases.get(i).getCoords().getX() - centre.x) - - Math.sin(angle) - * (_listeBases.get(i).getCoords().getY() - centre.y) - + centre.x; - // y' = sin(theta)*(x-xc) + cos(theta)*(y-yc) + yc - y = Math.sin(angle) - * (_listeBases.get(i).getCoords().getX() - centre.x) - + Math.cos(angle) - * (_listeBases.get(i).getCoords().getY() - centre.y) - + centre.y; - _listeBases.get(i).setCoords(new Point2D.Double(x, y)); - } - } - } - - private static double MIN_DISTANCE = 10.; - - - /** - * Flip an helix around its supporting base - */ - public void flipHelix(Point h) { - if (h.x!=-1 && h.y!=-1 && h.x!=h.y) - { - int hBeg=h.x; - int hEnd=h.y; - Point2D.Double A = getCoords(hBeg); - Point2D.Double B = getCoords(hEnd); - Point2D.Double AB = new Point2D.Double(B.x - A.x, B.y - A.y); - double normAB = Math.sqrt(AB.x * AB.x + AB.y * AB.y); - // Creating a coordinate system centered on A and having - // unit x-vector Ox. - Point2D.Double O = A; - Point2D.Double Ox = new Point2D.Double(AB.x / normAB, AB.y / normAB); - Hashtable old = new Hashtable(); - for (int i = hBeg + 1; i < hEnd; i++) { - Point2D.Double P = getCoords(i); - Point2D.Double nP = project(O, Ox, P); - old.put(i, nP); - setCoord(i, nP); - Point2D.Double Center = getCenter(i); - setCenter(i, project(O, Ox, Center)); - } - } - } - - public static Point2D.Double project(Point2D.Double O, Point2D.Double Ox, - Point2D.Double C) { - Point2D.Double OC = new Point2D.Double(C.x - O.x, C.y - O.y); - // Projection of OC on OI => OX - double normOX = (Ox.x * OC.x + Ox.y * OC.y); - Point2D.Double OX = new Point2D.Double((normOX * Ox.x), (normOX * Ox.y)); - // Portion of OC orthogonal to Ox => XC - Point2D.Double XC = new Point2D.Double(OC.x - OX.x, OC.y - OX.y); - // Reflexive image of C with respect to Ox => CP - Point2D.Double OCP = new Point2D.Double(OX.x - XC.x, OX.y - XC.y); - Point2D.Double CP = new Point2D.Double(O.x + OCP.x, O.y + OCP.y); - return CP; - } - - - public boolean testDirectionality(int i, int j, int k) { - - // Which direction are we heading toward? - Point2D.Double pi = getCoords(i); - Point2D.Double pj = getCoords(j); - Point2D.Double pk = getCoords(k); - return testDirectionality(pi, pj, pk); - } - - public static boolean testDirectionality(Point2D.Double pi, - Point2D.Double pj, Point2D.Double pk) { - - // Which direction are we heading toward? - double test = (pj.x - pi.x) * (pk.y - pj.y) - (pj.y - pi.y) - * (pk.x - pj.x); - return test < 0.0; - } - - public double getOrientation() { - double maxDist = Double.MIN_VALUE; - double angle = 0; - for (int i = 0; i < _listeBases.size(); i++) { - ModeleBase b1 = _listeBases.get(i); - for (int j = i + 1; j < _listeBases.size(); j++) { - ModeleBase b2 = _listeBases.get(j); - Point2D.Double p1 = b1._coords.toPoint2D(); - Point2D.Double p2 = b2._coords.toPoint2D(); - double dist = p1.distance(p2); - if (dist > maxDist) { - maxDist = dist; - angle = computeAngle(p1, p2); - } - } - } - return angle; - } - - public boolean hasVirtualLoops() { - boolean consecutiveBPs = false; - for (int i = 0; i < _listeBases.size(); i++) { - int j = _listeBases.get(i).getElementStructure(); - if (j == i + 1) { - consecutiveBPs = true; - } - - } - return ((_drawMode != DRAW_MODE_LINEAR) - && (_drawMode != DRAW_MODE_CIRCULAR) && (consecutiveBPs)); - } - - public String getHTMLDescription() { - String result = ""; - result += ""; - result += ""; - result += ""; - return result + "
Name:" + this._name + "
Length:" + this.getSize() - + " nts
Base-pairs:" - + this.getAllBPs().size() + "
"; - } - - public String getID() { - return _id; - } - - public void setID(String id) { - _id = id; - } - - public static ArrayList getGapPositions(String gapString) { - ArrayList result = new ArrayList(); - for (int i = 0; i < gapString.length(); i++) { - char c = gapString.charAt(i); - if (c == '.' || c == ':') { - result.add(i); - } - } - return result; - } - - public RNA restrictTo(String gapString) { - return restrictTo(getGapPositions(gapString)); - } - - public RNA restrictTo(ArrayList positions) { - RNA result = new RNA(); - String oldSeq = this.getSeq(); - String newSeq = ""; - HashSet removedPos = new HashSet(positions); - int[] matching = new int[oldSeq.length()]; - int j = 0; - for (int i = 0; i < oldSeq.length(); i++) { - matching[i] = j; - if (!removedPos.contains(i)) { - newSeq += oldSeq.charAt(i); - j++; - } - } - result.setRNA(newSeq); - for (ModeleBP m : getAllBPs()) { - if (removedPos.contains(m.getIndex5()) - || removedPos.contains(m.getIndex3())) { - int i5 = matching[m.getIndex5()]; - int i3 = matching[m.getIndex3()]; - ModeleBP msbp = new ModeleBP(result.getBaseAt(i5), - result.getBaseAt(i3), m.getEdgePartner5(), - m.getEdgePartner3(), m.getStericity()); - result.addBP(i5, i3, msbp); - } - } - return result; - } - - public void rescale(double d) { - for (ModeleBase mb : _listeBases) { - mb._coords.x *= d; - mb._coords.y *= d; - mb._center.x *= d; - mb._center.y *= d; - } - } - - /** - * Necessary for DrawRNATemplate (which is why the method is - * package-visible). - */ - ArrayList getListeBases() { - return _listeBases; - } -} diff --git a/src2/fr/orsay/lri/varna/models/rna/StructureTemp.java b/src2/fr/orsay/lri/varna/models/rna/StructureTemp.java deleted file mode 100644 index 40063ba..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/StructureTemp.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.orsay.lri.varna.models.rna; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Iterator; - -public class StructureTemp implements Serializable{ - /** - * - */ - private static final long serialVersionUID = -436852923461989105L; - private ArrayList _struct = new ArrayList(); - - public StructureTemp(){ - - } - - public void addStrand(ModeleStrand ms){ - this._struct.add(ms); - - } - - public int sizeStruct() { - return this._struct.size(); - } - - public ModeleStrand getStrand(int a) { - return this._struct.get(a); - } - - public ArrayList getListStrands() { - return _struct; - } - - public void clearListStrands() { - this._struct.clear(); - } - - public boolean isEmpty() { - return this._struct.isEmpty(); - } - -} diff --git a/src2/fr/orsay/lri/varna/models/rna/VARNAPoint.java b/src2/fr/orsay/lri/varna/models/rna/VARNAPoint.java deleted file mode 100644 index 8929642..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/VARNAPoint.java +++ /dev/null @@ -1,74 +0,0 @@ -package fr.orsay.lri.varna.models.rna; - -import java.awt.geom.Point2D; -import java.awt.geom.Point2D.Double; -import java.io.Serializable; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -public class VARNAPoint implements Serializable { - - private static final long serialVersionUID = 8815373295131046029L; - - public double x = 0.0; - public double y = 0.0; - - public void toXML(TransformerHandler hd) throws SAXException - { - toXML(hd,""); - } - - - public static String XML_ELEMENT_NAME = "p"; - public static String XML_VAR_ROLE_NAME = "r"; - public static String XML_VAR_X_NAME = "x"; - public static String XML_VAR_Y_NAME = "y"; - - public void toXML(TransformerHandler hd, String role) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - if (!role.equals("")) - { - atts.addAttribute("","",XML_VAR_ROLE_NAME,"CDATA",""+role); - } - atts.addAttribute("","",XML_VAR_X_NAME,"CDATA",""+x); - atts.addAttribute("","",XML_VAR_Y_NAME,"CDATA",""+y); - hd.startElement("","",XML_ELEMENT_NAME,atts); - hd.endElement("","",XML_ELEMENT_NAME); - } - - public VARNAPoint() - { this(0.0,0.0); } - - public VARNAPoint(double px, double py) - { - x = px; y = py; - } - public VARNAPoint(Point2D.Double p) - { - this(p.x,p.y); - } - - public double getX() - { - return x; - } - - public double getY() - { - return y; - } - - public Point2D.Double toPoint2D() - { - return new Point2D.Double(x,y); - } - - public String toString() - { - return "("+x+","+y+")" ; - } -} diff --git a/src2/fr/orsay/lri/varna/models/rna/VARNASecDraw.java b/src2/fr/orsay/lri/varna/models/rna/VARNASecDraw.java deleted file mode 100644 index 8a9e06e..0000000 --- a/src2/fr/orsay/lri/varna/models/rna/VARNASecDraw.java +++ /dev/null @@ -1,896 +0,0 @@ -package fr.orsay.lri.varna.models.rna; - -import java.awt.Rectangle; -import java.awt.Shape; -import java.awt.geom.AffineTransform; -import java.awt.geom.Area; -import java.awt.geom.GeneralPath; -import java.awt.geom.PathIterator; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.Random; -import java.util.Stack; -import java.util.Vector; - -import fr.orsay.lri.varna.VARNAPanel; - -public class VARNASecDraw { - public static VARNAPanel _vp = null; - - - public abstract class Portion - { - public abstract ArrayList getBaseList(); - public abstract int getNumBases(); - public abstract GeneralPath getOutline(RNA r); - - }; - - public class UnpairedPortion extends Portion - { - int _pos; - int _len; - public UnpairedPortion(int pos, int len) - { - _len = len; - _pos = pos; - } - @Override - public ArrayList getBaseList() { - // TODO Auto-generated method stub - return null; - } - public String toString() - { - return "U["+_pos+","+(_pos+_len-1)+"]"; - } - - public int getNumBases() { - return _len; - } - - - public GeneralPath getOutline(RNA r) { - - GeneralPath gp = new GeneralPath(); - ArrayList l = r.get_listeBases(); - Point2D.Double p0 = l.get(_pos).getCoords(); - gp.moveTo((float)p0.x, (float)p0.y); - for (int i=1;i<_len;i++) - { - Point2D.Double p = l.get(_pos+i).getCoords(); - gp.lineTo((float)p.x, (float)p.y); - } - return gp; - } - }; - - public class PairedPortion extends Portion - { - int _pos1; - int _pos2; - int _len; - RNATree _r; - - public PairedPortion(int pos1,int pos2, int len, RNATree r) - { - _pos1 = pos1; - _pos2 = pos2; - _len = len; - _r =r; - } - - @Override - public ArrayList getBaseList() { - // TODO Auto-generated method stub - return null; - } - - public String toString() - { - return "H["+_pos1+","+(_pos1+_len-1)+"]["+(_pos2-_len+1)+","+(_pos2)+"]\n"+_r.toString(); - } - - @Override - public int getNumBases() { - return 2*_len; - } - - public GeneralPath getLocalOutline(RNA r) { - GeneralPath gp = new GeneralPath(); - if (_len>0) - { - ArrayList l = r.get_listeBases(); - Point2D.Double p1 = l.get(_pos1).getCoords(); - Point2D.Double p2 = l.get(_pos1+_len-1).getCoords(); - Point2D.Double p3 = l.get(_pos2-_len+1).getCoords(); - Point2D.Double p4 = l.get(_pos2).getCoords(); - gp.moveTo((float)p1.x, (float)p1.y); - gp.lineTo((float)p2.x, (float)p2.y); - gp.lineTo((float)p3.x, (float)p3.y); - gp.lineTo((float)p4.x, (float)p4.y); - } - return gp; - } - - - public GeneralPath getOutline(RNA r) { - return getOutline(r,false); - } - - public GeneralPath getOutline(RNA r, boolean local) { - ArrayList l = r.get_listeBases(); - Point2D.Double p1 = l.get(_pos1).getCoords(); - Point2D.Double p2 = l.get(_pos1+_len-1).getCoords(); - Point2D.Double p3 = l.get(_pos2-_len+1).getCoords(); - Point2D.Double p4 = l.get(_pos2).getCoords(); - GeneralPath gp = new GeneralPath(); - gp.moveTo((float)p1.x, (float)p1.y); - gp.lineTo((float)p2.x, (float)p2.y); - if (!local) - gp.append(_r.getOutline(r), true); - gp.lineTo((float)p3.x, (float)p3.y); - gp.lineTo((float)p4.x, (float)p4.y); - - return gp; - - } - }; - public int _depth = 0; - - - public class RNATree - { - ArrayList _portions = new ArrayList(); - int _numPairedPortions=0; - public RNATree() - { - - } - - - public void addPortion(Portion p) - { - _portions.add(p); - if (p instanceof PairedPortion) - { - _numPairedPortions++; - } - } - - public int getNumPortions() - { - return _portions.size(); - } - - public Portion getPortion(int i) - { - return _portions.get(i); - } - - public String toString() - { - String result = ""; - _depth++; - for (int i=0;i<_portions.size();i++ ) - { - result += String.format("%1$#" + _depth + "s", ' '); - result += _portions.get(i).toString(); - if (i<_portions.size()-1) - result += "\n"; - } - _depth--; - return result; - } - - public GeneralPath getOutline(RNA r) { - GeneralPath result = new GeneralPath(); - for (int i=0;i<_portions.size();i++) - { - result.append(_portions.get(i).getOutline(r),true); - } - return result; - } - }; - - - private void buildTree(int i, int j, RNATree parent, RNA r) - { - //LinkedList s = new LinkedList(); - //s.add(new BuildTreeArgs(xi, xj, xparent,xr)); - //while(s.size()!=0) - //{ - - //BuildTreeArgs a = s.removeLast(); - if (i >= j) { - parent.addPortion(new UnpairedPortion(i,j-i+1)); - } - // BasePaired - if (r.get_listeBases().get(i).getElementStructure() == j) - { - int i1 = i; - int j1 = j; - boolean over = false; - while( (i+1=0)&& (i+1<=j-1) && !over) - { - if (r.get_listeBases().get(i).getElementStructure() != j) - { over = true; } - else - { i++;j--; } - } - int i2 = i; - int j2 = j; - RNATree t = new RNATree(); - if (i0) - { parent.addPortion(new UnpairedPortion(start,len)); } - buildTree(k, l, parent, r); - k = l + 1; - start = k; - len = 0; - } else { - len++; - k++; - } - } - if (len>0) - { - parent.addPortion(new UnpairedPortion(start,len)); - } - } - } - - /* - public void drawTree(double x0, double y0, RNATree t, double dir, RNA r, double straightness) - { - boolean collision = true; - double x=x0; - double y=y0; - double multRadius = 1.0; - double initCirc = r.BASE_PAIR_DISTANCE+r.LOOP_DISTANCE; - for (int i=0;i shapes = new ArrayList(); - for (int i=0;i0) - { - collision = false; - for (int i=0;(i=0) && !stop) - { - if (p[i]==prev-1) - { - prev = p[i]; - i--; - } - else - { stop = true; } - } - if (i<0) - throw new Exception("No more placement available"); - p[i]++; - i++; - while(i shapes = new ArrayList(); - int curH = 0; - for (int i=0;i0) - { - collision = false; - for (int i=0;(i _children = new ArrayList(); - ArrayList _indices = new ArrayList(); - PairedPortion _p; - RNA _r; - HelixEmbedding _parent; - - public HelixEmbedding(Point2D.Double support, PairedPortion p, RNA r, HelixEmbedding parent) - { - _support = support; - _clip = p.getLocalOutline(r); - _p = p; - _r = r; - _parent = parent; - } - - public void addHelixEmbedding(HelixEmbedding h, int index) - { - _children.add(h); - _indices.add(index); - } - - public GeneralPath getShape() - { - return _clip; - } - - - public int chooseNextMove() - { - int i = _parent._children.indexOf(this); - int min; - int max; - if (_parent._children.size() mbl = _r.get_listeBases(); - - if (_p._len>0) - { - PathIterator pi = _clip.getPathIterator(AffineTransform.getRotateInstance(0.0)); - ArrayList p = new ArrayList(); - while(!pi.isDone()) - { - double[] args = new double[6]; - int type= pi.currentSegment(args); - if ((type == PathIterator.SEG_MOVETO) || (type == PathIterator.SEG_LINETO)) - { - - Point2D.Double np = new Point2D.Double(args[0],args[1]); - p.add(np); - System.out.println(Arrays.toString(args)); - } - pi.next(); - } - if (p.size()<4) - { return; } - - Point2D.Double startLeft = p.get(0); - Point2D.Double endLeft = p.get(1); - Point2D.Double endRight = p.get(2); - Point2D.Double startRight = p.get(3); - - double d = startLeft.distance(endLeft); - double vx = endLeft.x-startLeft.x; - double vy = endLeft.y-startLeft.y; - double interval = 0.0; - if (_p._len>1) - { - vx/=d; - vy/=d; - interval = d/((double)_p._len-1); - System.out.println("DELTA: "+interval+" "+_r.LOOP_DISTANCE); - } - for (int n=0;n<_p._len;n++) - { - int i = _p._pos1 + n; - int j = _p._pos2 - n; - ModeleBase mbLeft = mbl.get(i); - mbLeft.setCoords(new Point2D.Double(startLeft.x+n*vx*interval, startLeft.y+n*vy*interval)); - ModeleBase mbRight = mbl.get(j); - mbRight.setCoords(new Point2D.Double(startRight.x+n*vx*interval, startRight.y+n*vy*interval)); - } - } - for (int i=0;i<_children.size();i++) - { - _children.get(i).reflectCoordinates(); - } - if (_children.size()>0) - { - Point2D.Double center = _children.get(0)._support; - for (int i=0;i<_p._r.getNumPortions();i++) - { - Portion p = _p._r.getPortion(i); - if (p instanceof UnpairedPortion) - { - UnpairedPortion up = (UnpairedPortion) p; - for (int j=0;j mbl, RNA r) - { - if ((_children.size()==0)&&(_p._r.getNumPortions()==1)) - { - Portion p = _p._r.getPortion(0); - if (p instanceof UnpairedPortion) - { - UnpairedPortion up = (UnpairedPortion) p; - double rad = determineRadius(1,up.getNumBases(),_r); - int a = _p._pos1+_p._len-1; - int b = _p._pos2-(_p._len-1); - ModeleBase mbLeft = mbl.get(a); - ModeleBase mbRight = mbl.get(b); - Point2D.Double pl = mbLeft.getCoords(); - Point2D.Double pr = mbRight.getCoords(); - Point2D.Double pm = new Point2D.Double((pl.x+pr.x)/2.0,(pl.y+pr.y)/2.0); - double vx = (pl.x-pr.x)/pl.distance(pr); - double vy = (pl.y-pr.y)/pl.distance(pr); - double vnx = -vy, vny = vx; - Point2D.Double pc = new Point2D.Double(pm.x+rad*vnx,pm.y+rad*vny); - double circ = r.LOOP_DISTANCE*(1.0+up.getNumBases())+r.BASE_PAIR_DISTANCE; - double incrLoop = Math.PI*2.0*r.LOOP_DISTANCE/circ; - double angle = Math.PI*2.0*r.BASE_PAIR_DISTANCE/(2.0*circ); - for (int j=0;j all) throws Exception - { - double x=x0; - double y=y0; - int numHelices = 0; - int numUBases = 0; - double totCirc = r.BASE_PAIR_DISTANCE+r.LOOP_DISTANCE; - for (int i=0;i all = new ArrayList(); - HelixEmbedding root = null; - try { - root = new HelixEmbedding(new Point2D.Double(0.0,0.0),new PairedPortion(0,0,0,t),r,null); - predrawTree(0,0,t,0.0,r,root,all); - int steps=1000; - double prevbadness = Double.MAX_VALUE; - while((steps>0)&&(prevbadness>0)) - { - - // Generating new structure - HelixEmbedding chosen = all.get(_rnd.nextInt(all.size())); - int delta = chosen.chooseNextMove(); - // Draw current - if (_vp!=null) - { - GeneralPath p = new GeneralPath(); - for (int i=0;i0) - { - chosen.cancelMove(delta); - } - else - { - prevbadness = badness; - } - - System.out.println(badness); - - steps--; - } - if (root!=null) - { root.reflectCoordinates(); } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return t; - }; - -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/models/templates/BatchBenchmark.java b/src2/fr/orsay/lri/varna/models/templates/BatchBenchmark.java deleted file mode 100644 index 06362ca..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/BatchBenchmark.java +++ /dev/null @@ -1,236 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.models.templates; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import fr.orsay.lri.varna.exceptions.ExceptionExportFailed; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; -import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm; -import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; -import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; -import fr.orsay.lri.varna.exceptions.ExceptionXmlLoading; -import fr.orsay.lri.varna.factories.RNAFactory; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.RNA; - - -public class BatchBenchmark { - private VARNAConfig conf = new VARNAConfig(); - - final boolean DEFAULT_STRAIGHT_BULGES = false; - - public static RNA loadRNA(File file) throws ExceptionFileFormatOrSyntax, ExceptionUnmatchedClosingParentheses, FileNotFoundException, ExceptionExportFailed, ExceptionPermissionDenied, ExceptionLoadingFailed { - Collection rnas = RNAFactory.loadSecStr(file.getPath()); - if (rnas.isEmpty()) { - throw new ExceptionFileFormatOrSyntax( - "No RNA could be parsed from that source."); - } - return rnas.iterator().next(); - } - - public void benchmarkRNA(File templatePath, File rnaPath, BufferedWriter outbuf) throws ExceptionXmlLoading, RNATemplateDrawingAlgorithmException, ExceptionFileFormatOrSyntax, ExceptionUnmatchedClosingParentheses, ExceptionExportFailed, ExceptionPermissionDenied, ExceptionLoadingFailed, ExceptionNAViewAlgorithm, IOException { - // load template - RNATemplate template = RNATemplate.fromXMLFile(templatePath); - - // load RNA - RNA rna = loadRNA(rnaPath); - - for (int algo=0; algo<=100; algo++) { - String algoname = ""; - - // draw RNA - switch (algo) { - //case 0: - // rna.drawRNALine(conf); - // algoname = "Linear"; - // break; - //case 1: - // rna.drawRNACircle(conf); - // algoname = "Circular"; - // break; - case 2: - rna.drawRNARadiate(conf); - algoname = "Radiate"; - break; - case 3: - rna.drawRNANAView(conf); - algoname = "NAView"; - break; - case 10: - algoname = "Template/noadj"; - rna.drawRNATemplate(template, conf, DrawRNATemplateMethod.NOADJUST, DrawRNATemplateCurveMethod.EXACTLY_AS_IN_TEMPLATE, DEFAULT_STRAIGHT_BULGES); - break; - case 11: - algoname = "Template/noadj/ellipses"; - rna.drawRNATemplate(template, conf, DrawRNATemplateMethod.NOADJUST, DrawRNATemplateCurveMethod.ALWAYS_REPLACE_BY_ELLIPSES, DEFAULT_STRAIGHT_BULGES); - break; - case 12: - algoname = "Template/noadj/smart"; - rna.drawRNATemplate(template, conf, DrawRNATemplateMethod.NOADJUST, DrawRNATemplateCurveMethod.SMART, DEFAULT_STRAIGHT_BULGES); - break; - /* - case 5: - algoname = "Template/maxfactor"; - rna.drawRNATemplate(template, conf, DrawRNATemplateMethod.MAXSCALINGFACTOR, DrawRNATemplateCurveMethod.EXACTLY_AS_IN_TEMPLATE, DEFAULT_STRAIGHT_BULGES); - break; - */ - case 6: - algoname = "Template/mininter"; - rna.drawRNATemplate(template, conf, DrawRNATemplateMethod.NOINTERSECT, DrawRNATemplateCurveMethod.EXACTLY_AS_IN_TEMPLATE, DEFAULT_STRAIGHT_BULGES); - break; - case 30: - algoname = "Template/translate"; - rna.drawRNATemplate(template, conf, DrawRNATemplateMethod.HELIXTRANSLATE, DrawRNATemplateCurveMethod.EXACTLY_AS_IN_TEMPLATE, DEFAULT_STRAIGHT_BULGES); - break; - case 31: - algoname = "Template/translate/ellipses"; - rna.drawRNATemplate(template, conf, DrawRNATemplateMethod.HELIXTRANSLATE, DrawRNATemplateCurveMethod.ALWAYS_REPLACE_BY_ELLIPSES, DEFAULT_STRAIGHT_BULGES); - break; - case 32: - algoname = "Template/translate/smart"; - rna.drawRNATemplate(template, conf, DrawRNATemplateMethod.HELIXTRANSLATE, DrawRNATemplateCurveMethod.SMART, DEFAULT_STRAIGHT_BULGES); - break; - default: - continue; - } - - // benchmark - Benchmark benchmark = new Benchmark(rna); - - // print results - outbuf.write( - removeExt(rnaPath.getName()) - + "\t" + algoname - + "\t" + benchmark.backboneCrossings - // averageUnpairedDistance % -> best is 100 - + "\t" + (benchmark.averageUnpairedDistance / benchmark.targetConsecutiveBaseDistance *100) - + "\t" + benchmark.tooNearConsecutiveBases - + "\t" + benchmark.tooFarConsecutiveBases - + "\n"); - } - - } - - public void runBenchmark(List templates, List rnas, File outfile) throws Exception { - if (templates.size() != rnas.size()) { - throw new Error("templates and rnas list size differ"); - } - - BufferedWriter outbuf = new BufferedWriter(new FileWriter(outfile)); - - outbuf.write("RNA\tAlgorithm\tBackbone crossings\tAverage unpaired distance %\tToo near\tToo far\n"); - - for (int i=0; i templates = new ArrayList(); - List rnas = new ArrayList(); - - for (String seq: seqlist) { - templates.add(new File(root, "RNase P E Coli.xml")); - rnas.add(new File(root, seq)); - } - - runBenchmark(templates, rnas, outfile); - } - - public static void readFASTA(File file, List seqnames, List sequences) throws IOException { - BufferedReader buf = new BufferedReader(new FileReader(file)); - String line = buf.readLine(); - while (line != null) { - if (line.length() != 0) { - if (line.charAt(0) == '>') { - String id = line.substring(1); // remove the > - seqnames.add(id); - sequences.add(""); - } else { - sequences.set(sequences.size()-1, sequences.get(sequences.size()-1) + line); - } - } - line = buf.readLine(); - } - buf.close(); - } - - - /** - * We assume given directory contains a alignemnt.fasta file, - * of which the first sequence is the consensus structure, - * and the other sequences are aligned nucleotides. - * The principle is to convert it to a set of secondary structure, - * using the following rule: - * - keep the same nucleotides as in original sequence - * - keep base pairs where both bases of the pair are non-gaps in our sequence - */ - public void benchmarkAllDir(File rootdir) throws Exception { - File seqdir = new File(rootdir, "sequences"); - File templateFile = new File(rootdir, "template.xml"); - File sequenceFiles[] = seqdir.listFiles(); - Arrays.sort(sequenceFiles); - - List templates = new ArrayList(); - List rnas = new ArrayList(); - for (File seq: sequenceFiles) { - if (!seq.getPath().endsWith(".dbn")) continue; - rnas.add(seq); - templates.add(templateFile); - } - - File outfile = new File(rootdir, "benchmark.txt"); - runBenchmark(templates, rnas, outfile); - - } - - - public static void main(String[] args) throws Exception { - File templatesDir = new File("templates"); - if (args.length < 1) { - System.out.println("Command-line argument required: RNA"); - System.out.println("Example: RNaseP_bact_a"); - System.exit(1); - } - //new BatchBenchmark().runExamples(); - for (String arg: args) { - new BatchBenchmark().benchmarkAllDir(new File(templatesDir, arg)); - } - } - - /** - * Return the given file path without the (last) extension. - */ - public static String removeExt(String path) { - return path.substring(0, path.lastIndexOf('.')); - } - - public static File removeExt(File path) { - return new File(removeExt(path.getPath())); - } -} diff --git a/src2/fr/orsay/lri/varna/models/templates/BatchBenchmarkPrepare.java b/src2/fr/orsay/lri/varna/models/templates/BatchBenchmarkPrepare.java deleted file mode 100644 index c3ab8ac..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/BatchBenchmarkPrepare.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.models.templates; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.util.ArrayList; -import java.util.List; - -import fr.orsay.lri.varna.factories.RNAFactory; - -public class BatchBenchmarkPrepare { - - /** - * We assume given directory contains a alignemnt.fasta file, - * of which the first sequence is the consensus structure, - * and the other sequences are aligned nucleotides. - * The principle is to convert it to a set of secondary structure, - * using the following rule: - * - keep the same nucleotides as in original sequence - * - keep base pairs where both bases of the pair are non-gaps in our sequence - */ - public void benchmarkAllDir(File rootdir) throws Exception { - File seqdir = new File(rootdir, "sequences"); - if (!seqdir.exists()) { - seqdir.mkdir(); - } - - File templateFile = new File(rootdir, "template.xml"); - - ArrayList seqnames = new ArrayList(); - ArrayList sequences = new ArrayList(); - BatchBenchmark.readFASTA(new File(rootdir, "alignment.fasta"), seqnames, sequences); - - BufferedWriter outbufASS = new BufferedWriter(new FileWriter(new File(rootdir, "all_secondary_structures.fasta"))); - - String consensusSecStr = sequences.get(0); - int[] consensusSecStrInt = RNAFactory.parseSecStr(consensusSecStr); - - List templates = new ArrayList(); - for (int i=1; i" + seqname + "\n"); - outbuf.write(nt + "\n"); - outbuf.write(ss + "\n"); - outbuf.close(); - - outbufASS.write(">" + seqname + "\n"); - outbufASS.write(ss + "\n"); - - templates.add(templateFile); - } - - outbufASS.close(); - - } - - public static void main(String[] args) throws Exception { - new BatchBenchmarkPrepare().benchmarkAllDir(new File(new File("templates"), "RNaseP_bact_a")); - } - -} diff --git a/src2/fr/orsay/lri/varna/models/templates/Benchmark.java b/src2/fr/orsay/lri/varna/models/templates/Benchmark.java deleted file mode 100644 index b3db1fd..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/Benchmark.java +++ /dev/null @@ -1,120 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -import java.awt.geom.Line2D; -import java.util.Arrays; - -import fr.orsay.lri.varna.models.geom.LinesIntersect; -import fr.orsay.lri.varna.models.rna.RNA; - -/** - * @author Raphael Champeimont - * - */ -public class Benchmark { - private RNA rna; - - // number of backbone crossings - public int backboneCrossings; - // average distance between unpaired consecutive bases - public double averageUnpairedDistance; - // median distance between consecutive bases - public double medianConsecutiveBaseDistance; - // Number of consecutive bases that are too near from each other - public int tooNearConsecutiveBases; - // Number of consecutive bases that are too far from each other - public int tooFarConsecutiveBases; - - - - // Parameters - public double targetConsecutiveBaseDistance = RNA.LOOP_DISTANCE; - // If consecutive bases are nearer that tooNearFactor * target distance, we call them too near. - public double tooNearFactor = 0.5; - // If consecutive bases are further that tooFarFactor * target distance, we call them too far. - public double tooFarFactor = 2; - - - - public Benchmark(RNA rna) { - this.rna = rna; - computeAll(); - } - - private void computeAll() { - // Compute number of backbone crossings - { - int n = rna.getSize(); - Line2D.Double[] lines = new Line2D.Double[n-1]; - for (int i=0; i tooFarFactor*targetConsecutiveBaseDistance) { - tooFarConsecutiveBases++; - } - } - } - } - - @SuppressWarnings("unused") - private int percent(int a, int b) { - return (int) Math.round((double) a / (double) b * 100.0); - } - - public void printAll() { - System.out.println("Benchmark:"); - System.out.println("\tBackbone crossings = " + backboneCrossings); - System.out.println("\tAverage unpaired distance = " + averageUnpairedDistance); - System.out.println("\tMedian of consecutive base distance = " + medianConsecutiveBaseDistance); - System.out.println("\tNumber of too near consecutive bases = " + tooNearConsecutiveBases); // + " ie. " + percent(tooNearConsecutiveBases, rna.getSize()-1) + " %"); - System.out.println("\tNumber of too far consecutive bases = " + tooFarConsecutiveBases); // + " ie. " + percent(tooFarConsecutiveBases, rna.getSize()-1) + " %"); - } -} - diff --git a/src2/fr/orsay/lri/varna/models/templates/DrawRNATemplateCurveMethod.java b/src2/fr/orsay/lri/varna/models/templates/DrawRNATemplateCurveMethod.java deleted file mode 100644 index b1796f7..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/DrawRNATemplateCurveMethod.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.models.templates; - -/** - * @author Raphael Champeimont - * How should we draw unpaired regions? - */ -public enum DrawRNATemplateCurveMethod { - // use what is in the template - EXACTLY_AS_IN_TEMPLATE("Bezier"), - // use ellipses, ignoring Bezier parameters from template (useful mostly for debugging ellipses) - ALWAYS_REPLACE_BY_ELLIPSES("Ellipses"), - // replace by ellipse where it is a good idea - SMART("Auto-Select"); - - String _msg; - - private DrawRNATemplateCurveMethod(String msg){ - _msg=msg; - } - - public String toString() - { - return _msg; - } - - public static DrawRNATemplateCurveMethod getDefault() { - return SMART; - } -} diff --git a/src2/fr/orsay/lri/varna/models/templates/DrawRNATemplateMethod.java b/src2/fr/orsay/lri/varna/models/templates/DrawRNATemplateMethod.java deleted file mode 100644 index 9fd5f67..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/DrawRNATemplateMethod.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.models.templates; - -/** - * What to do in case some helices are of a different length - * in the template and the actual helix. - * Possibles values are: - * 0 - No adjustment is done. - * A longer than expected helix might bump into an other helix. - * 1 - Scaling factors (actual length / template length) are calculated, - * the maximum scaling factor L is extracted, then all helix positions - * are multiplied by L. - * 2 - Same as 1, but L is computed as the minimum value such that there - * are no backbone intersections. - */ -public enum DrawRNATemplateMethod { - NOADJUST("No Adjust"), MAXSCALINGFACTOR("Max Scaling"), NOINTERSECT("Non-crossing"), HELIXTRANSLATE("Helix Translation"); - - String _msg; - - public static DrawRNATemplateMethod getDefault() { - return HELIXTRANSLATE; - } - - - public String toString() - { - return _msg; - } - - private DrawRNATemplateMethod(String msg) - { - _msg = msg; - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/models/templates/RNANodeValue2TemplateDistance.java b/src2/fr/orsay/lri/varna/models/templates/RNANodeValue2TemplateDistance.java deleted file mode 100644 index 51e8b46..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/RNANodeValue2TemplateDistance.java +++ /dev/null @@ -1,93 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -import fr.orsay.lri.varna.models.treealign.RNANodeValue; -import fr.orsay.lri.varna.models.treealign.RNANodeValue2; -import fr.orsay.lri.varna.models.treealign.TreeAlignLabelDistanceAsymmetric; - -/** - * Distance between an RNANodeValue2 and an RNANodeValueTemplate. - * - * @author Raphael Champeimont - * - */ -public class RNANodeValue2TemplateDistance implements TreeAlignLabelDistanceAsymmetric { - public double delete(RNANodeValue2 v) { - if (v == null) { - // deleting nothing costs nothing - return 0; - } else { - if (v.isSingleNode()) { - if (v.getNode().getRightBasePosition() < 0) { - // delete one base (that comes from a broken base pair) - return 1; - } else { - // delete a base pair - return 2; - } - } else { - // delete a sequence - return v.getNodes().size(); - } - } - } - - public double insert(RNANodeValueTemplate v) { - if (v == null) { - // inserting nothing costs nothing - return 0; - } else { - if (v instanceof RNANodeValueTemplateSequence) { - return ((RNANodeValueTemplateSequence) v).getSequence().getLength(); - } else if (v instanceof RNANodeValueTemplateBrokenBasePair) { - // insert one base - return 1; - } else { // this is a base pair - // delete the base pair - return 2; - } - } - } - - public double f(RNANodeValue2 v1, RNANodeValueTemplate v2) { - if (v1 == null) { - return insert(v2); - } else if (v2 == null) { - return delete(v1); - } else if (!v1.isSingleNode()) { // v1 is a sequence - if (v2 instanceof RNANodeValueTemplateSequence) { - // the cost is the difference between the sequence lengths - return Math.abs(v1.getNodes().size() - ((RNANodeValueTemplateSequence) v2).getSequence().getLength()); - } else { - // a sequence cannot be changed in something else - return Double.POSITIVE_INFINITY; - } - } else if (v1.getNode().getRightBasePosition() >= 0) { // v1 is a base pair - if (v2 instanceof RNANodeValueTemplateBasePair) { - // ok, a base pair can be mapped to a base pair - return 0; - } else { - // a base pair cannot be changed in something else - return Double.POSITIVE_INFINITY; - } - } else { // v1 is a broken base pair - if (v2 instanceof RNANodeValueTemplateBrokenBasePair) { - RNANodeValueTemplateBrokenBasePair brokenBasePair = ((RNANodeValueTemplateBrokenBasePair) v2); - boolean strand5onTemplateSide = brokenBasePair.getPositionInHelix() < brokenBasePair.getHelix().getLength(); - boolean strand3onTemplateSide = ! strand5onTemplateSide; - boolean strand5onRNASide = (v1.getNode().getOrigin() == RNANodeValue.Origin.BASE_FROM_HELIX_STRAND5); - boolean strand3onRNASide = (v1.getNode().getOrigin() == RNANodeValue.Origin.BASE_FROM_HELIX_STRAND3); - if ((strand5onTemplateSide && strand5onRNASide) - || (strand3onTemplateSide && strand3onRNASide)) { - // Ok they can be mapped together - return 0.0; - } else { - // A base on a 5' strand of an helix - // cannot be mapped to base on a 3' strand of an helix - return Double.POSITIVE_INFINITY; - } - } else { - return Double.POSITIVE_INFINITY; - } - } - } -} diff --git a/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplate.java b/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplate.java deleted file mode 100644 index 79374ba..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplate.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -import fr.orsay.lri.varna.models.treealign.GraphvizDrawableNodeValue; - - -/** - * An node from an RNA template is either a sequence of non-paired bases, - * a base pair originally belonging to an helix, - * or a single base originally belonging to an helix but which was broken - * in order to remove pseudoknots. - * - * @author Raphael Champeimont - */ -public abstract class RNANodeValueTemplate implements GraphvizDrawableNodeValue { - - public String toString() { - return toGraphvizNodeName(); - } - - public abstract String toGraphvizNodeName(); - - -} diff --git a/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateBasePair.java b/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateBasePair.java deleted file mode 100644 index 99c67b5..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateBasePair.java +++ /dev/null @@ -1,48 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateHelix; - - -/** - * See RNANodeValueTemplate. - * - * @author Raphael Champeimont - */ -public class RNANodeValueTemplateBasePair extends RNANodeValueTemplate { - - /** - * The original template element this node came from. - */ - private RNATemplateHelix helix; - - /** - * The position (in the 5' to 3' order) - * of this base pair in the original helix. - */ - private int positionInHelix; - - - - public String toGraphvizNodeName() { - return "H[" + positionInHelix + "]"; - } - - - - public RNATemplateHelix getHelix() { - return helix; - } - - public void setHelix(RNATemplateHelix helix) { - this.helix = helix; - } - - public int getPositionInHelix() { - return positionInHelix; - } - - public void setPositionInHelix(int positionInHelix) { - this.positionInHelix = positionInHelix; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateBrokenBasePair.java b/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateBrokenBasePair.java deleted file mode 100644 index efa1679..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateBrokenBasePair.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateHelix; - -/** - * See RNANodeValueTemplate. - * - * @author Raphael Champeimont - */ -public class RNANodeValueTemplateBrokenBasePair extends RNANodeValueTemplate { - - /** - * The original template element this node came from. - */ - private RNATemplateHelix helix; - - /** - * The position (in the 5' to 3' order) - * of this base in the original helix. - */ - private int positionInHelix; - - - - public String toGraphvizNodeName() { - return "BH[" + positionInHelix + "]"; - } - - - - public RNATemplateHelix getHelix() { - return helix; - } - - public void setHelix(RNATemplateHelix helix) { - this.helix = helix; - } - - public int getPositionInHelix() { - return positionInHelix; - } - - public void setPositionInHelix(int positionInHelix) { - this.positionInHelix = positionInHelix; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateSequence.java b/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateSequence.java deleted file mode 100644 index 0dfa53c..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/RNANodeValueTemplateSequence.java +++ /dev/null @@ -1,34 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateUnpairedSequence; - - -/** - * See RNANodeValueTemplate. - * - * @author Raphael Champeimont - */ -public class RNANodeValueTemplateSequence extends RNANodeValueTemplate { - - /** - * The sequence this node came from. - */ - private RNATemplateUnpairedSequence sequence; - - - - public String toGraphvizNodeName() { - return "S(len=" + sequence.getLength() + ")"; - } - - - - - public RNATemplateUnpairedSequence getSequence() { - return sequence; - } - - public void setSequence(RNATemplateUnpairedSequence sequence) { - this.sequence = sequence; - } -} diff --git a/src2/fr/orsay/lri/varna/models/templates/RNATemplate.java b/src2/fr/orsay/lri/varna/models/templates/RNATemplate.java deleted file mode 100644 index 5e2a3ce..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/RNATemplate.java +++ /dev/null @@ -1,1821 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -import java.awt.Point; -import java.awt.geom.Point2D; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; -import java.util.Stack; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.TransformerFactoryConfigurationError; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import fr.orsay.lri.varna.exceptions.ExceptionEdgeEndpointAlreadyConnected; -import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; -import fr.orsay.lri.varna.exceptions.ExceptionInvalidRNATemplate; -import fr.orsay.lri.varna.exceptions.ExceptionXMLGeneration; -import fr.orsay.lri.varna.exceptions.ExceptionXmlLoading; -import fr.orsay.lri.varna.models.rna.RNA; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement.EdgeEndPoint; -import fr.orsay.lri.varna.models.treealign.Tree; - - -/** - * A model for RNA templates. - * A template is a way to display an RNA secondary structure. - * - * @author Raphael Champeimont - */ -public class RNATemplate { - /** - * The list of template elements. - */ - private Collection elements = new ArrayList(); - - /** - * Tells whether the template contains elements. - */ - public boolean isEmpty() { - return elements.isEmpty(); - } - - /** - * The first endpoint (in sequence order) of the template. - * If there are multiple connected components, the first elements of one - * connected component will be returned. - * If the template contains no elements, null is returned. - * If there is a cycle, an arbitrary endpoint will be returned - * (as it then does not make sense to define the first endpoint). - * Time: O(n) - */ - public RNATemplateElement getFirst() { - return getFirstEndPoint().getElement(); - } - - /** - * The first endpoint edge endpoint (in sequence order) of the template. - * If there are multiple connected components, the first elements of one - * connected component will be returned. - * If the template contains no elements, null is returned. - * If there is a cycle, an arbitrary endpoint will be returned - * (as it then does not make sense to define the first endpoint). - * Time: O(n) - */ - public EdgeEndPoint getFirstEndPoint() { - if (elements.isEmpty()) { - return null; - } else { - Set knownEndPoints = new HashSet(); - EdgeEndPoint currentEndPoint = getAnyEndPoint(); - while (true) { - if (knownEndPoints.contains(currentEndPoint)) { - // There is a cycle in the template, so we stop there - // to avoid looping infinitely. - return currentEndPoint; - } - knownEndPoints.add(currentEndPoint); - EdgeEndPoint previousEndPoint = currentEndPoint.getPreviousEndPoint(); - if (previousEndPoint == null) { - return currentEndPoint; - } else { - currentEndPoint = previousEndPoint; - } - } - } - } - - /** - * Return an arbitrary element of the template, - * null if empty. - * Time: O(1) - */ - public RNATemplateElement getAny() { - if (elements.isEmpty()) { - return null; - } else { - return elements.iterator().next(); - } - } - - /** - * Return an arbitrary endpoint of the template, - * null if empty. - * Time: O(1) - */ - public EdgeEndPoint getAnyEndPoint() { - if (isEmpty()) { - return null; - } else { - return getAny().getIn1EndPoint(); - } - } - - /** - * Variable containing "this", used by the internal class - * to access this object. - */ - private final RNATemplate template = this; - - - /** - * To get an iterator of this class, use rnaIterator(). - * See rnaIterator() for documentation. - */ - private class RNAIterator implements Iterator { - private Iterator iter = vertexIterator(); - - public boolean hasNext() { - return iter.hasNext(); - } - - public RNATemplateElement next() { - if (! hasNext()) { - throw (new NoSuchElementException()); - } - - EdgeEndPoint currentEndPoint = iter.next(); - switch (currentEndPoint.getPosition()) { - // We skip "IN" endpoints, so that we don't return elements twice - case IN1: - case IN2: - // We get the corresponding "OUT" endpoint - currentEndPoint = iter.next(); - break; - } - - return currentEndPoint.getElement(); - } - - public void remove() { - throw (new UnsupportedOperationException()); - } - - } - - /** - * Iterates over the elements of the template, in the sequence order. - * Helixes will be given twice. - * Only one connected component will be iterated on. - * Note that if there is a cycle, the iterator may return a infinite - * number of elements. - */ - public Iterator rnaIterator() { - return new RNAIterator(); - } - - /** - * Iterates over all elements (each endpoint is given only once) - * in an arbitrary order. - */ - public Iterator classicIterator() { - return elements.iterator(); - } - - private class VertexIterator implements Iterator { - private EdgeEndPoint endpoint = getFirstEndPoint(); - - public boolean hasNext() { - return (endpoint != null); - } - - public EdgeEndPoint next() { - if (endpoint == null) { - throw (new NoSuchElementException()); - } - - EdgeEndPoint currentEndPoint = endpoint; - endpoint = currentEndPoint.getNextEndPoint(); - return currentEndPoint; - } - - public void remove() { - throw (new UnsupportedOperationException()); - } - } - - /** - * Iterates over the elements edge endpoints of the template, - * in the sequence order. - * Only one connected component will be iterated on. - * Note that if there is a cycle, the iterator may return a infinite - * number of elements. - */ - public Iterator vertexIterator() { - return new VertexIterator(); - } - - - - private class MakeEdgeList { - List list = new LinkedList(); - - private void addEdgeIfNecessary(EdgeEndPoint endPoint) { - if (endPoint.isConnected()) { - list.add(endPoint); - } - } - - public List make() { - for (RNATemplateElement element: elements) { - if (element instanceof RNATemplateHelix) { - RNATemplateHelix helix = (RNATemplateHelix) element; - addEdgeIfNecessary(helix.getIn1()); - addEdgeIfNecessary(helix.getIn2()); - } else if (element instanceof RNATemplateUnpairedSequence) { - RNATemplateUnpairedSequence sequence = (RNATemplateUnpairedSequence) element; - addEdgeIfNecessary(sequence.getIn()); - } - } - return list; - } - } - - /** - * Return over all edges in an arbitrary order. - * For each edge, the first (5' side) endpoint will be given. - */ - public List makeEdgeList() { - MakeEdgeList listMaker = new MakeEdgeList(); - return listMaker.make(); - } - - - - - - private class RemovePseudoKnots { - /** - * The elements of the template as an array, in the order of the - * RNA sequence. Note that helixes will appear twice, - * and non-paired sequences don't appear. - */ - private ArrayList helixesSeq; - - /** - * For any i, - * j = helixesStruct[i] is the index in helixesSeq - * where the same helix also appears. - * It means we have for all i: - * helixesSeq[helixesStruct[i]] == helixesSeq[i] - */ - private ArrayList helixesStruct; - - /** - * The same as helixesStruct, but without the pseudoknots, - * ie. helixesStructWithoutPseudoKnots[i] may be -1 - * even though helixesStruct[i] != -1 . - */ - private int[] helixesStructWithoutPseudoKnots; - - - private void initArrays() throws ExceptionInvalidRNATemplate { - helixesSeq = new ArrayList(); - helixesStruct = new ArrayList(); - Map knownHelixes = new Hashtable(); - Iterator iter = rnaIterator(); - while (iter.hasNext()) { - RNATemplateElement element = iter.next(); - if (element instanceof RNATemplateHelix) { - helixesSeq.add((RNATemplateHelix) element); - int index = helixesSeq.size() - 1; - if (knownHelixes.containsKey(element)) { - // This is the second time we meet this helix. - int otherOccurenceIndex = knownHelixes.get(element); - helixesStruct.add(otherOccurenceIndex); - if (helixesStruct.get(otherOccurenceIndex) != -1) { - throw (new ExceptionInvalidRNATemplate("We met an helix 3 times. Is there a cycle?")); - } - // Now we know the partner of the other part of - // the helix. - helixesStruct.set(otherOccurenceIndex, index); - } else { - // This is the first time we meet this helix. - // Remember its index - knownHelixes.put((RNATemplateHelix) element, index); - // For the moment we don't know where the other part - // of the helix is, but this will be found later. - helixesStruct.add(-1); - } - } - } - - } - - /** - * Tells whether there is a pseudoknot. - * Adapted from RNAMLParser.isSelfCrossing() - */ - private boolean isSelfCrossing() { - Stack intervals = new Stack(); - intervals.add(new Point(0, helixesStruct.size() - 1)); - while (!intervals.empty()) { - Point p = intervals.pop(); - if (p.x <= p.y) { - if (helixesStruct.get(p.x) == -1) { - intervals.push(new Point(p.x + 1, p.y)); - } else { - int i = p.x; - int j = p.y; - int k = helixesStruct.get(i); - if ((k <= i) || (k > j)) { - return true; - } else { - intervals.push(new Point(i + 1, k - 1)); - intervals.push(new Point(k + 1, j)); - } - } - } - } - return false; - } - - /** - * We compute helixesStructWithoutPseudoKnots - * from helixesStruct by replacing values by -1 - * for the helixes we cut (the bases are become non-paired). - * We try to cut as few base pairs as possible. - */ - private void removePseudoKnotsAux() { - if (!isSelfCrossing()) { - helixesStructWithoutPseudoKnots = new int[helixesStruct.size()]; - for (int i=0; i tab[i][j]) { - tab[i][j] = (short) tmp; - backtrack[i][j] = (short) k; - } - } - } - } - - // debug - //RNATemplateTests.printShortMatrix(tab); - - Stack intervals = new Stack(); - intervals.add(new Point(0, length - 1)); - while (!intervals.empty()) { - Point p = intervals.pop(); - if (p.x <= p.y) { - if (backtrack[p.x][p.y] == -1) { - result[p.x] = -1; - intervals.push(new Point(p.x + 1, p.y)); - } else { - int i = p.x; - int j = p.y; - int k = backtrack[i][j]; - result[i] = k; - result[k] = i; - intervals.push(new Point(i + 1, k - 1)); - intervals.push(new Point(k + 1, j)); - } - } - } - - helixesStructWithoutPseudoKnots = result; - } - } - - private Set makeSet() { - Set removedHelixes = new HashSet(); - - for (int i=0; i removePseudoKnots() throws ExceptionInvalidRNATemplate { - initArrays(); - - removePseudoKnotsAux(); - // debug - //printIntArrayList(helixesStruct); - //printIntArray(helixesStructWithoutPseudoKnots); - - return makeSet(); - } - } - - private class ConvertToTree { - private Set removedHelixes; - - public ConvertToTree(Set removedHelixes) { - this.removedHelixes = removedHelixes; - } - - private Iterator iter = template.rnaIterator(); - private Set knownHelixes = new HashSet(); - - public Tree convert() throws ExceptionInvalidRNATemplate { - Tree root = new Tree(); - // No value, this is a fake node because we need a root. - root.setValue(null); - makeChildren(root); - return root; - } - - private void makeChildren(Tree father) throws ExceptionInvalidRNATemplate { - List> children = father.getChildren(); - while (true) { - try { - RNATemplateElement element = iter.next(); - if (element instanceof RNATemplateHelix) { - RNATemplateHelix helix = (RNATemplateHelix) element; - if (removedHelixes.contains(helix)) { - // Helix was removed - - boolean firstPartOfHelix; - if (knownHelixes.contains(helix)) { - firstPartOfHelix = false; - } else { - knownHelixes.add(helix); - firstPartOfHelix = true; - } - - int helixLength = helix.getLength(); - // Maybe we could allow helixes of length 0? - // If we want to then this code can be changed in the future. - if (helixLength < 1) { - throw (new ExceptionInvalidRNATemplate("Helix length < 1")); - } - int firstPosition = firstPartOfHelix ? 0 : helixLength; - int afterLastPosition = firstPartOfHelix ? helixLength : 2*helixLength; - for (int i=firstPosition; i child = new Tree(); - child.setValue(value); - father.getChildren().add(child); - } - - } else { - // We have an non-removed helix - - if (knownHelixes.contains(helix)) { - if ((! (father.getValue() instanceof RNANodeValueTemplateBasePair)) - || ((RNANodeValueTemplateBasePair) father.getValue()).getHelix() != helix) { - // We have already met this helix, so unless it is our father, - // we have a pseudoknot (didn't we remove them???). - throw (new ExceptionInvalidRNATemplate("Unexpected helix. Looks like there still are pseudoknots even after we removed them so something is wrong about the template.")); - } else { - // As we have found the father, we have finished our work - // with the children. - return; - } - } else { - knownHelixes.add(helix); - - int helixLength = helix.getLength(); - // Maybe we could allow helixes of length 0? - // If we want to then this code can be changed in the future. - if (helixLength < 1) { - throw (new ExceptionInvalidRNATemplate("Helix length < 1")); - } - Tree lastChild = father; - for (int i=0; i child = new Tree(); - child.setValue(value); - lastChild.getChildren().add(child); - lastChild = child; - } - // Now we put what follows as children of lastChild - makeChildren(lastChild); - } - - - } - } else if (element instanceof RNATemplateUnpairedSequence) { - RNATemplateUnpairedSequence sequence = (RNATemplateUnpairedSequence) element; - int seqLength = sequence.getLength(); - - // Maybe we could allow sequences of length 0? - // If we want to then this code can be changed in the future. - if (seqLength < 1) { - throw (new ExceptionInvalidRNATemplate("Non-paired sequence length < 1")); - } - - RNANodeValueTemplateSequence value = new RNANodeValueTemplateSequence(); - value.setSequence(sequence); - Tree child = new Tree(); - child.setValue(value); - children.add(child); - } else { - throw (new ExceptionInvalidRNATemplate("We have an endpoint which is neither an helix nor a sequence. What is that?")); - } - - } catch (NoSuchElementException e) { - // We are at the end of elements so if everything is ok - // the father must be the root. - if (father.getValue() == null) { - return; // Work finished. - } else { - throw (new ExceptionInvalidRNATemplate("Unexpected end of template endpoint list.")); - } - } - } - } - - } - - /** - * Tells whether the connected component to which endPoint belongs to - * is cyclic. - */ - public boolean connectedComponentIsCyclic(EdgeEndPoint endPoint) { - Set knownEndPoints = new HashSet(); - EdgeEndPoint currentEndPoint = endPoint; - while (true) { - if (knownEndPoints.contains(currentEndPoint)) { - return true; - } - knownEndPoints.add(currentEndPoint); - EdgeEndPoint previousEndPoint = currentEndPoint.getPreviousEndPoint(); - if (previousEndPoint == null) { - return false; - } else { - currentEndPoint = previousEndPoint; - } - } - } - - /** - * Tells whether the template elements are all connected, ie. if the - * graph (edge endpoints being vertices) is connected. - */ - public boolean isConnected() { - if (isEmpty()) { - return true; - } - - // Count all vertices - int n = 0; - for (RNATemplateElement element: elements) { - if (element instanceof RNATemplateHelix) { - n += 4; - } else if (element instanceof RNATemplateUnpairedSequence) { - n += 2; - } - } - - // Now try reaching all vertices - Set knownEndPoints = new HashSet(); - EdgeEndPoint currentEndPoint = getFirstEndPoint(); - while (true) { - if (knownEndPoints.contains(currentEndPoint)) { - // We are back to our original endpoint, so stop - break; - } - knownEndPoints.add(currentEndPoint); - EdgeEndPoint nextEndPoint = currentEndPoint.getNextEndPoint(); - if (nextEndPoint == null) { - break; - } else { - currentEndPoint = nextEndPoint; - } - } - - // The graph is connected iff the number of reached vertices - // is equal to the total number of vertices. - return (knownEndPoints.size() == n); - - } - - /** - * Checks whether this template is a valid RNA template, ie. - * it is non-empty, it does not contain a cycle and all elements are in one - * connected component. - */ - public void checkIsValidTemplate() throws ExceptionInvalidRNATemplate { - if (isEmpty()) { - throw (new ExceptionInvalidRNATemplate("The template is empty.")); - } - - if (! isConnected()) { - throw (new ExceptionInvalidRNATemplate("The template is a non-connected graph.")); - } - - // Now we know the graph is connected. - - if (connectedComponentIsCyclic(getAnyEndPoint())) { - throw (new ExceptionInvalidRNATemplate("The template is cyclic.")); - } - } - - /** - * Make a tree of the template. For this, we will remove pseudoknots, - * taking care to remove as few base pair links as possible. - * Requires the template to be valid and will check the validity - * (will call checkIsValidTemplate()). - * Calling this method will automatically call computeIn1Is(). - */ - public Tree toTree() throws ExceptionInvalidRNATemplate { - // Compute the helix in1Is fields. - // We also rely on computeIn1Is() for checking the template validity. - computeIn1Is(); - - // Remove pseudoknots - RemovePseudoKnots pseudoKnotKiller = new RemovePseudoKnots(); - Set removedHelixes = pseudoKnotKiller.removePseudoKnots(); - - // Convert to tree - ConvertToTree converter = new ConvertToTree(removedHelixes); - return converter.convert(); - } - - - /** - * Generate an RNA sequence that exactly matches the template. - * Requires the template to be valid and will check the validity - * (will call checkIsValidTemplate()). - */ - public RNA toRNA() throws ExceptionInvalidRNATemplate { - // First, we check this is a valid template - checkIsValidTemplate(); - - ArrayList str = new ArrayList(); - Map> helixes = new HashMap>(); - Iterator iter = rnaIterator(); - while (iter.hasNext()) { - RNATemplateElement element = iter.next(); - if (element instanceof RNATemplateHelix) { - RNATemplateHelix helix = (RNATemplateHelix) element; - int n = helix.getLength(); - if (helixes.containsKey(helix)) { - int firstBase = str.size(); - ArrayList helixMembers = helixes.get(helix); - for (int i = 0; i < n; i++) { - int indexOfAssociatedBase = helixMembers.get(n-1-i); - str.set(indexOfAssociatedBase, firstBase + i); - str.add(indexOfAssociatedBase); - } - } else { - int firstBase = str.size(); - ArrayList helixMembers = new ArrayList(); - for (int i = 0; i < n; i++) { - // We don't known yet where the associated base is - str.add(-1); - helixMembers.add(firstBase + i); - } - helixes.put(helix, helixMembers); - } - } else if (element instanceof RNATemplateUnpairedSequence) { - RNATemplateUnpairedSequence sequence = (RNATemplateUnpairedSequence) element; - int n = sequence.getLength(); - for (int i=0; i elementNames = new HashMap(); - private Element connectionsXmlElement; - private Document document; - - private void addConnectionIfNecessary(EdgeEndPoint endPoint) { - if (endPoint != null && endPoint.isConnected()) { - RNATemplateElement e1 = endPoint.getElement(); - EdgeEndPointPosition p1 = endPoint.getPosition(); - RNATemplateElement e2 = endPoint.getOtherElement(); - EdgeEndPointPosition p2 = endPoint.getOtherEndPoint().getPosition(); - Element xmlElement = document.createElement("edge"); - { - Element fromXmlElement = document.createElement("from"); - fromXmlElement.setAttribute("endpoint", elementNames.get(e1)); - fromXmlElement.setAttribute("position", p1.toString()); - xmlElement.appendChild(fromXmlElement); - } - { - Element toXmlElement = document.createElement("to"); - toXmlElement.setAttribute("endpoint", elementNames.get(e2)); - toXmlElement.setAttribute("position", p2.toString()); - xmlElement.appendChild(toXmlElement); - } - connectionsXmlElement.appendChild(xmlElement); - } - } - - public Document toXMLDocument() throws ExceptionXMLGeneration, ExceptionInvalidRNATemplate { - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - document = builder.newDocument(); - Element root = document.createElement("RNATemplate"); - document.appendChild(root); - Element elementsXmlElement = document.createElement("elements"); - root.appendChild(elementsXmlElement); - connectionsXmlElement = document.createElement("edges"); - root.appendChild(connectionsXmlElement); - - // First pass, we create a mapping between java references and names (strings) - { - int nextHelix = 1; - int nextNonPairedSequence = 1; - for (RNATemplateElement templateElement: elements) { - if (templateElement instanceof RNATemplateHelix) { - RNATemplateHelix helix = (RNATemplateHelix) templateElement; - if (! elementNames.containsKey(helix)) { - elementNames.put(helix, "H ID " + nextHelix); - nextHelix++; - } - } else if (templateElement instanceof RNATemplateUnpairedSequence) { - RNATemplateUnpairedSequence sequence = (RNATemplateUnpairedSequence) templateElement; - if (! elementNames.containsKey(sequence)) { - elementNames.put(sequence, "S ID " + nextNonPairedSequence); - nextNonPairedSequence++; - } - } else { - throw (new ExceptionInvalidRNATemplate("We have an endpoint which is neither an helix nor a sequence. What is that?")); - } - } - } - - // Now we generate the XML document - for (RNATemplateElement templateElement: elements) { - String elementXmlName = elementNames.get(templateElement); - Element xmlElement; - if (templateElement instanceof RNATemplateHelix) { - RNATemplateHelix helix = (RNATemplateHelix) templateElement; - xmlElement = document.createElement("helix"); - xmlElement.setAttribute("id", elementXmlName); - xmlElement.setAttribute("length", Integer.toString(helix.getLength())); - xmlElement.setAttribute("flipped", Boolean.toString(helix.isFlipped())); - if (helix.hasCaption()) { - xmlElement.setAttribute("caption", helix.getCaption()); - } - { - Element startPositionXmlElement = document.createElement("startPosition"); - startPositionXmlElement.setAttribute("x", Double.toString(helix.getStartPosition().x)); - startPositionXmlElement.setAttribute("y", Double.toString(helix.getStartPosition().y)); - xmlElement.appendChild(startPositionXmlElement); - } - { - Element endPositionXmlElement = document.createElement("endPosition"); - endPositionXmlElement.setAttribute("x", Double.toString(helix.getEndPosition().x)); - endPositionXmlElement.setAttribute("y", Double.toString(helix.getEndPosition().y)); - xmlElement.appendChild(endPositionXmlElement); - } - addConnectionIfNecessary(helix.getOut1()); - addConnectionIfNecessary(helix.getOut2()); - } else if (templateElement instanceof RNATemplateUnpairedSequence) { - RNATemplateUnpairedSequence sequence = (RNATemplateUnpairedSequence) templateElement; - xmlElement = document.createElement("sequence"); - xmlElement.setAttribute("id", elementXmlName); - xmlElement.setAttribute("length", Integer.toString(sequence.getLength())); - { - Element vertex5XmlElement = document.createElement("vertex5"); - vertex5XmlElement.setAttribute("x", Double.toString(sequence.getVertex5().x)); - vertex5XmlElement.setAttribute("y", Double.toString(sequence.getVertex5().y)); - xmlElement.appendChild(vertex5XmlElement); - } - { - Element vertex3XmlElement = document.createElement("vertex3"); - vertex3XmlElement.setAttribute("x", Double.toString(sequence.getVertex3().x)); - vertex3XmlElement.setAttribute("y", Double.toString(sequence.getVertex3().y)); - xmlElement.appendChild(vertex3XmlElement); - } - { - Element inTangentVectorXmlElement = document.createElement("inTangentVector"); - inTangentVectorXmlElement.setAttribute("angle", Double.toString(sequence.getInTangentVectorAngle())); - inTangentVectorXmlElement.setAttribute("length", Double.toString(sequence.getInTangentVectorLength())); - xmlElement.appendChild(inTangentVectorXmlElement); - } - { - Element outTangentVectorXmlElement = document.createElement("outTangentVector"); - outTangentVectorXmlElement.setAttribute("angle", Double.toString(sequence.getOutTangentVectorAngle())); - outTangentVectorXmlElement.setAttribute("length", Double.toString(sequence.getOutTangentVectorLength())); - xmlElement.appendChild(outTangentVectorXmlElement); - } - addConnectionIfNecessary(sequence.getOut()); - } else { - throw (new ExceptionInvalidRNATemplate("We have an endpoint which is neither an helix nor a sequence. What is that?")); - } - elementsXmlElement.appendChild(xmlElement); - } - - return document; - } catch (ParserConfigurationException e) { - throw (new ExceptionXMLGeneration("ParserConfigurationException: " + e.getMessage())); - } - } - } - - - - public void toXMLFile(File file) throws ExceptionXMLGeneration, ExceptionInvalidRNATemplate { - try { - Document xmlDocument = toXMLDocument(); - Source source = new DOMSource(xmlDocument); - Result result = new StreamResult(file); - Transformer transformer; - transformer = TransformerFactory.newInstance().newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.transform(source, result); - } catch (TransformerConfigurationException e) { - throw (new ExceptionXMLGeneration("TransformerConfigurationException: " + e.getMessage())); - } catch (TransformerFactoryConfigurationError e) { - throw (new ExceptionXMLGeneration("TransformerFactoryConfigurationError: " + e.getMessage())); - } catch (TransformerException e) { - throw (new ExceptionXMLGeneration("TransformerException: " + e.getMessage())); - } - } - - - public Document toXMLDocument() throws ExceptionXMLGeneration, ExceptionInvalidRNATemplate { - ConvertToXml converter = new ConvertToXml(); - return converter.toXMLDocument(); - } - - - private class LoadFromXml { - private Document xmlDocument; - private Map elementNames = new HashMap(); - - public LoadFromXml(Document xmlDocument) { - this.xmlDocument = xmlDocument; - } - - private Point2D.Double pointFromXml(Element xmlPoint) { - Point2D.Double point = new Point2D.Double(); - point.x = Double.parseDouble(xmlPoint.getAttribute("x")); - point.y = Double.parseDouble(xmlPoint.getAttribute("y")); - return point; - } - - private double vectorLengthFromXml(Element xmlVector) { - return Double.parseDouble(xmlVector.getAttribute("length")); - } - - private double vectorAngleFromXml(Element xmlVector) { - return Double.parseDouble(xmlVector.getAttribute("angle")); - } - - /** - * Takes an element of the form: - * - * and returns the corresponding EdgeEndPoint object. - */ - private EdgeEndPoint endPointFromXml(Element xmlEdgeEndPoint) throws ExceptionXmlLoading { - String elementId = xmlEdgeEndPoint.getAttribute("endpoint"); - if (elementId == null || elementId == "") - throw (new ExceptionXmlLoading ("Missing endpoint attribute on " + xmlEdgeEndPoint)); - String positionOnElement = xmlEdgeEndPoint.getAttribute("position"); - if (positionOnElement == null || positionOnElement == "") - throw (new ExceptionXmlLoading ("Missing position attribute on " + xmlEdgeEndPoint)); - if (elementNames.containsKey(elementId)) { - RNATemplateElement templateElement = elementNames.get(elementId); - EdgeEndPointPosition relativePosition = EdgeEndPointPosition.valueOf(positionOnElement); - if (relativePosition == null) - throw (new ExceptionXmlLoading ("Could not compute relativePosition")); - return templateElement.getEndPointFromPosition(relativePosition); - } else { - throw (new ExceptionXmlLoading("Edge is connected on unkown element: " + elementId)); - } - } - - private String connectErrMsg(EdgeEndPoint v1, EdgeEndPoint v2, String reason) { - return "Error while connecting\n" - + v1.toString() + " to\n" - + v2.toString() + " because:\n" - + reason; - } - - private void connect(EdgeEndPoint v1, EdgeEndPoint v2) throws ExceptionXmlLoading { - if (v1 == null || v2 == null) { - throw (new ExceptionXmlLoading("Invalid edge: missing endpoint\n v1 = " + v1 + "\n v2 = " + v2)); - } - if (v2.isConnected()) { - throw (new ExceptionXmlLoading(connectErrMsg(v1, v2, "Second vertex is already connected to " + v2.getOtherElement().toString()))); - } - if (v1.isConnected()) { - throw (new ExceptionXmlLoading(connectErrMsg(v1, v2, "First vertex is already connected to " + v1.getOtherElement().toString()))); - } - - try { - v1.connectTo(v2); - } catch (ExceptionEdgeEndpointAlreadyConnected e) { - throw (new ExceptionXmlLoading("A vertex is on two edges at the same time: " + e.getMessage())); - } catch (ExceptionInvalidRNATemplate e) { - throw (new ExceptionXmlLoading("ExceptionInvalidRNATemplate: " + e.getMessage())); - } - } - - public void load() throws ExceptionXmlLoading { - // First part: we load all elements from the XML tree - Element xmlElements = (Element) xmlDocument.getElementsByTagName("elements").item(0); - { - NodeList xmlElementsChildren = xmlElements.getChildNodes(); - for (int i=0; i iter = vertexIterator(); - Set knownHelices = new HashSet(); - while (iter.hasNext()) { - EdgeEndPoint endPoint = iter.next(); - RNATemplateElement templateElement = endPoint.getElement(); - if (templateElement instanceof RNATemplateHelix) { - RNATemplateHelix helix = (RNATemplateHelix) templateElement; - if (! knownHelices.contains(helix)) { - // first time we meet this helix - switch (endPoint.getPosition()) { - case IN1: - case OUT1: - helix.setIn1Is(In1Is.IN1_IS_5PRIME); - break; - case IN2: - case OUT2: - helix.setIn1Is(In1Is.IN1_IS_3PRIME); - break; - } - knownHelices.add(helix); - } - } - } - } - - - - /** - * Remove the element from the template. - * The element is automatically disconnected from any other element. - * Returns true if and only if the element was present in the template, - * otherwise nothing was done. - */ - public boolean removeElement(RNATemplateElement element) throws ExceptionInvalidRNATemplate { - if (elements.contains(element)) { - element.disconnectFromAny(); - elements.remove(element); - return true; - } else { - return false; - } - } - - - /** - * Position of an endpoint on an endpoint. - * Not all values make sense for any endpoint. - * For an helix, all four make sense, but for a non-paired - * sequence, only IN1 and OUT1 make sense. - */ - public enum EdgeEndPointPosition { - IN1, IN2, OUT1, OUT2; - } - - - private static int NEXT_ID = 1; - - /** - * An endpoint of an RNA template, - * it can be an helix or a sequence of non-paired bases. - * - * You cannot create an object of this class directly, - * use RNATemplateHelix or RNATemplateUnpairedSequence instead. - * - * @author Raphael Champeimont - */ - public abstract class RNATemplateElement { - - public int _id = NEXT_ID++; - - public String getName() - {return "RNATemplate"+_id; } - - - /** - * This variable is just there so that "this" can be accessed by a name - * from the internal class EdgeEndPoint. - */ - private final RNATemplateElement element = this; - - /** - * When the endpoint is created, it is added to the list of elements - * in this template. To remove it, call RNATemplate.removeElement(). - */ - public RNATemplateElement() { - elements.add(this); - } - - /** - * Disconnect this endpoint from any other elements it may be connected to. - */ - public abstract void disconnectFromAny(); - - /** - * Get the the IN endpoint in the case of a sequence - * and the IN1 endpoint in the case of an helix. - */ - public abstract EdgeEndPoint getIn1EndPoint(); - - /** - * Returns the template to which this endpoint belongs. - */ - public RNATemplate getParentTemplate() { - return template; - } - - /** - * Provided endpoint is an endpoint of this endpoint, get the next - * endpoint, either on this same endpoint, or or the connected endpoint. - * Note that you should use the getNextEndPoint() method of the endpoint - * itself directly. - */ - protected abstract EdgeEndPoint getNextEndPoint(EdgeEndPoint endpoint); - - /** - * Provided endpoint is an endpoint of this endpoint, get the previous - * endpoint, either on this same endpoint, or or the connected endpoint. - * Note that you should use the getPreviousEndPoint() method of the endpoint - * itself directly. - */ - protected abstract EdgeEndPoint getPreviousEndPoint(EdgeEndPoint endpoint); - - - /** - * An edge endpoint is where an edge can connect. - */ - public class EdgeEndPoint { - private EdgeEndPoint() { - } - - /** - * Get the next endpoint. If this endpoint is an "in" endpoint, - * returns the corresponding "out" endpoint. If this endpoint - * is an "out" endpoint, return the connected endpoint if there is - * one, otherwise return null. - */ - public EdgeEndPoint getNextEndPoint() { - return element.getNextEndPoint(this); - } - - - /** - * Same as getNextEndPoint(), but with the previous endpoint. - */ - public EdgeEndPoint getPreviousEndPoint() { - return element.getPreviousEndPoint(this); - } - - - /** - * Get the position on the endpoint where this endpoint is. - */ - public EdgeEndPointPosition getPosition() { - return element.getPositionFromEndPoint(this); - } - - - private EdgeEndPoint otherEndPoint; - - /** - * Returns the endpoint on which this edge endpoint is. - */ - public RNATemplateElement getElement() { - return element; - } - - /** - * Returns the other endpoint of the edge. - * Will be null if there is no edge connecter to this endpoint. - */ - public EdgeEndPoint getOtherEndPoint() { - return otherEndPoint; - } - /** - * Returns the endpoint at the other endpoint of the edge. - * Will be null if there is no edge connecter to this endpoint. - */ - public RNATemplateElement getOtherElement() { - return (otherEndPoint != null) ? otherEndPoint.getElement() : null; - } - - /** - * Disconnect this endpoint from the other, ie. delete the edge - * between them. Note that this will modify both endpoints, and that - * x.disconnect() is equivalent to x.getOtherEndPoint().disconnect(). - * If this endpoint is not connected, does nothing. - */ - public void disconnect() { - if (otherEndPoint != null) { - otherEndPoint.otherEndPoint = null; - otherEndPoint = null; - } - } - - /** - * Tells whether this endpoint is connected with an edge to - * an other endpoint. - */ - public boolean isConnected() { - return (otherEndPoint != null); - } - - - /** - * Create an edge between two edge endpoints. - * This is a symmetric operation and it will modify both endpoints. - * It means x.connectTo(y) is equivalent to y.connectTo(x). - * The edge endpoint must be free (ie. not yet connected). - * Also, elements connected together must belong to the same template. - */ - public void connectTo(EdgeEndPoint otherEndPoint) throws ExceptionEdgeEndpointAlreadyConnected, ExceptionInvalidRNATemplate { - if (this.otherEndPoint != null || otherEndPoint.otherEndPoint != null) { - throw (new ExceptionEdgeEndpointAlreadyConnected()); - } - if (template != otherEndPoint.getElement().getParentTemplate()) { - throw (new ExceptionInvalidRNATemplate("Elements from different templates cannot be connected with each other.")); - } - this.otherEndPoint = otherEndPoint; - otherEndPoint.otherEndPoint = this; - } - - - public String toString() { - return "Edge endpoint on element " + element.toString() + " at position " + getPosition().toString(); - } - } - - - /** - * Get the EdgeEndPoint object corresponding to the the given - * position on this endpoint. - */ - public abstract EdgeEndPoint getEndPointFromPosition(EdgeEndPointPosition position); - - - /** - * The inverse of getEndPointFromPosition. - */ - public abstract EdgeEndPointPosition getPositionFromEndPoint(EdgeEndPoint endPoint); - - - /** - * Connect the endpoint at position positionHere of this endpoint - * to the otherEndPoint. - */ - public void connectTo( - EdgeEndPointPosition positionHere, - EdgeEndPoint otherEndPoint) - throws ExceptionEdgeEndpointAlreadyConnected, ExceptionInvalidRNATemplate { - EdgeEndPoint endPointHere = getEndPointFromPosition(positionHere); - endPointHere.connectTo(otherEndPoint); - } - - /** - * Connect the endpoint at position positionHere of this endpoint - * to the endpoint of otherElement at position positionOnOtherElement. - * @throws ExceptionInvalidRNATemplate - * @throws ExceptionEdgeEndpointAlreadyConnected, ExceptionEdgeEndpointAlreadyConnected - */ - public void connectTo( - EdgeEndPointPosition positionHere, - RNATemplateElement otherElement, - EdgeEndPointPosition positionOnOtherElement) - throws ExceptionEdgeEndpointAlreadyConnected, ExceptionEdgeEndpointAlreadyConnected, ExceptionInvalidRNATemplate { - EdgeEndPoint otherEndPoint = otherElement.getEndPointFromPosition(positionOnOtherElement); - connectTo(positionHere, otherEndPoint); - } - - - } - - - /** - * An helix in an RNA template. - * - * @author Raphael Champeimont - */ - public class RNATemplateHelix extends RNATemplateElement { - /** - * Number of base pairs in the helix. - */ - private int length; - - /** - * Position of the helix start point, - * ie. the middle in the line [x,y] where (x,y) - * x is the base at the IN1 edge endpoint and - * y is the base at the OUT2 edge endpoint. - */ - private Point2D.Double startPosition; - - /** - * Position of the helix end point, - * ie. the middle in the line [x,y] where (x,y) - * x is the base at the OUT1 edge endpoint and - * y is the base at the IN2 edge endpoint. - */ - private Point2D.Double endPosition; - - - /** - * Tells whether the helix is flipped. - */ - private boolean flipped = false; - - public boolean isFlipped() { - return flipped; - } - - public void setFlipped(boolean flipped) { - this.flipped = flipped; - } - - /** - * For an helix, tells us whether IN1/OUT1 is the 5' strand - * (the first strand we meet if we follow the RNA sequence) - * or the 3' strand (the second we meet if we follow the RNA sequence). - * This information cannot be known locally, we need the complete - * template to compute it, see RNATemplate.computeIn1Is(). - */ - private In1Is in1Is = null; - - public In1Is getIn1Is() { - return in1Is; - } - - public void setIn1Is(In1Is in1Is) { - this.in1Is = in1Is; - } - - - - /** - * A string displayed on the helix. - */ - private String caption = null; - - public String getCaption() { - return caption; - } - - public void setCaption(String caption) { - this.caption = caption; - } - - public boolean hasCaption() { - return caption != null; - } - - - - - /** - * If we go through all bases of the RNA from first to last, - * we will pass twice through this helix. On time, we arrive - * from in1, and leave by out2, and the other time we arrive from - * in2 and leave by out2. - * Whether we go through in1/out1 or in2/out2 the first time - * is written in the in1Is field. - */ - private final EdgeEndPoint in1, out1, in2, out2; - private String _name; - - public RNATemplateHelix(String name) { - in1 = new EdgeEndPoint(); - out1 = new EdgeEndPoint(); - in2 = new EdgeEndPoint(); - out2 = new EdgeEndPoint(); - _name = name; - } - - - - - - public String toString() { - return "Helix @" + Integer.toHexString(hashCode()) + " len=" + length + " caption=" + caption; - } - - public String getName() - {return ""+_name; } - - - - public int getLength() { - return length; - } - - public void setLength(int length) { - this.length = length; - } - - public Point2D.Double getStartPosition() { - return startPosition; - } - - public void setStartPosition(Point2D.Double startPosition) { - this.startPosition = startPosition; - } - - public Point2D.Double getEndPosition() { - return endPosition; - } - - public void setEndPosition(Point2D.Double endPosition) { - this.endPosition = endPosition; - } - - public EdgeEndPoint getIn1() { - return in1; - } - - public EdgeEndPoint getOut1() { - return out1; - } - - public EdgeEndPoint getIn2() { - return in2; - } - - public EdgeEndPoint getOut2() { - return out2; - } - - public void disconnectFromAny() { - getIn1().disconnect(); - getIn2().disconnect(); - getOut1().disconnect(); - getOut2().disconnect(); - } - - - protected EdgeEndPoint getNextEndPoint(EdgeEndPoint endpoint) { - if (endpoint == in1) { - return out1; - } else if (endpoint == in2) { - return out2; - } else { - return endpoint.getOtherEndPoint(); - } - } - - - protected EdgeEndPoint getPreviousEndPoint(EdgeEndPoint endpoint) { - if (endpoint == out1) { - return in1; - } else if (endpoint == out2) { - return in2; - } else { - return endpoint.getOtherEndPoint(); - } - } - - - public EdgeEndPoint getIn1EndPoint() { - return in1; - } - - public EdgeEndPoint getEndPointFromPosition( - EdgeEndPointPosition position) { - switch (position) { - case IN1: - return getIn1(); - case IN2: - return getIn2(); - case OUT1: - return getOut1(); - case OUT2: - return getOut2(); - default: - return null; - } - } - - public EdgeEndPointPosition getPositionFromEndPoint( - EdgeEndPoint endPoint) { - if (endPoint == in1) { - return EdgeEndPointPosition.IN1; - } else if (endPoint == in2) { - return EdgeEndPointPosition.IN2; - } else if (endPoint == out1) { - return EdgeEndPointPosition.OUT1; - } else if (endPoint == out2) { - return EdgeEndPointPosition.OUT2; - } else { - return null; - } - } - - - } - - - - /** - * A sequence of non-paired bases in an RNA template. - * - * @author Raphael Champeimont - */ - public class RNATemplateUnpairedSequence extends RNATemplateElement { - /** - * Number of (non-paired) bases. - */ - private int length; - - private static final double defaultTangentVectorAngle = Math.PI / 2; - private static final double defaultTangentVectorLength = 100; - - /** - * The sequence is drawn along a cubic Bezier curve. - * The curve can be defined by 2 vectors, one for the start of the line - * and the other for the end. They are the tangents to the line at - * the beginning and the end of the line. - * Each vector can be defined by its length and its absolute angle. - * The angles are given in radians. - */ - private double inTangentVectorAngle = defaultTangentVectorAngle, - inTangentVectorLength = defaultTangentVectorLength, - outTangentVectorAngle = defaultTangentVectorAngle, - outTangentVectorLength = defaultTangentVectorLength; - - - - - /** - * Position of the begginning (at the "in" endpoint) of the line. - * It is only useful when the sequence is not yet connected to an helix. - * (Otherwise we can deduce it from this helix position). - */ - private Point2D.Double vertex5; - - /** - * Position of the end (at the "out" endpoint) of the line. - * It is only useful when the sequence is not yet connected to an helix. - * (Otherwise we can deduce it from this helix position). - */ - private Point2D.Double vertex3; - - - public Point2D.Double getVertex5() { - return vertex5; - } - - public void setVertex5(Point2D.Double vertex5) { - this.vertex5 = vertex5; - } - - public Point2D.Double getVertex3() { - return vertex3; - } - - public void setVertex3(Point2D.Double vertex3) { - this.vertex3 = vertex3; - } - - - - - /** - * The helixes connected on both sides. - * They must be helixes because only helixes have absolute positions, - * and the positions of the starting and ending points of the sequence - * are those stored in the helixes. - */ - private final EdgeEndPoint in, out; - - private String _name; - - public RNATemplateUnpairedSequence(String name) { - in = new EdgeEndPoint(); - out = new EdgeEndPoint(); - _name = name; - } - - - public String toString() { - return "Sequence @" + Integer.toHexString(hashCode()) + " len=" + length; - } - - public String getName() - {return ""+_name; } - - - - public int getLength() { - return length; - } - - public void setLength(int length) { - this.length = length; - } - - public double getInTangentVectorAngle() { - return inTangentVectorAngle; - } - - public void setInTangentVectorAngle(double inTangentVectorAngle) { - this.inTangentVectorAngle = inTangentVectorAngle; - } - - public double getInTangentVectorLength() { - return inTangentVectorLength; - } - - public void setInTangentVectorLength(double inTangentVectorLength) { - this.inTangentVectorLength = inTangentVectorLength; - } - - public double getOutTangentVectorAngle() { - return outTangentVectorAngle; - } - - public void setOutTangentVectorAngle(double outTangentVectorAngle) { - this.outTangentVectorAngle = outTangentVectorAngle; - } - - public double getOutTangentVectorLength() { - return outTangentVectorLength; - } - - public void setOutTangentVectorLength(double outTangentVectorLength) { - this.outTangentVectorLength = outTangentVectorLength; - } - - public EdgeEndPoint getIn() { - return in; - } - - public EdgeEndPoint getOut() { - return out; - } - - public void disconnectFromAny() { - getIn().disconnect(); - getOut().disconnect(); - } - - - protected EdgeEndPoint getNextEndPoint(EdgeEndPoint endpoint) { - if (endpoint == in) { - return out; - } else { - return endpoint.getOtherEndPoint(); - } - } - - protected EdgeEndPoint getPreviousEndPoint(EdgeEndPoint endpoint) { - if (endpoint == out) { - return in; - } else { - return endpoint.getOtherEndPoint(); - } - } - - public EdgeEndPoint getIn1EndPoint() { - return in; - } - - - public EdgeEndPoint getEndPointFromPosition( - EdgeEndPointPosition position) { - switch (position) { - case IN1: - return getIn(); - case OUT1: - return getOut(); - default: - return null; - } - } - - - public EdgeEndPointPosition getPositionFromEndPoint( - EdgeEndPoint endPoint) { - if (endPoint == in) { - return EdgeEndPointPosition.IN1; - } else if (endPoint == out) { - return EdgeEndPointPosition.OUT1; - } else { - return null; - } - } - - - } - - -} diff --git a/src2/fr/orsay/lri/varna/models/templates/RNATemplateAlign.java b/src2/fr/orsay/lri/varna/models/templates/RNATemplateAlign.java deleted file mode 100644 index 358e280..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/RNATemplateAlign.java +++ /dev/null @@ -1,418 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import fr.orsay.lri.varna.exceptions.ExceptionInvalidRNATemplate; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.RNA; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateHelix; -import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateUnpairedSequence; -import fr.orsay.lri.varna.models.treealign.AlignedNode; -import fr.orsay.lri.varna.models.treealign.RNANodeValue; -import fr.orsay.lri.varna.models.treealign.RNANodeValue2; -import fr.orsay.lri.varna.models.treealign.RNATree2; -import fr.orsay.lri.varna.models.treealign.RNATree2Exception; -import fr.orsay.lri.varna.models.treealign.Tree; -import fr.orsay.lri.varna.models.treealign.TreeAlign; -import fr.orsay.lri.varna.models.treealign.TreeAlignException; -import fr.orsay.lri.varna.models.treealign.TreeAlignResult; - -/** - * This class is about the alignment between a tree of RNANodeValue2 - * and a tree of RNANodeValueTemplate. - * - * @author Raphael Champeimont - */ -public class RNATemplateAlign { - - // We check this node can be part of a non-broken helix. - private static boolean canBePartOfAnHelix(RNANodeValue2 leftNodeValue) { - return (leftNodeValue != null) && leftNodeValue.isSingleNode() && leftNodeValue.getNode().getRightBasePosition() > 0; - } - - private static boolean canBePartOfASequence(RNANodeValue2 leftNodeValue) { - return (leftNodeValue != null) && !leftNodeValue.isSingleNode(); - } - - private static boolean canBePartOfABrokenHelix(RNANodeValue2 leftNodeValue) { - return (leftNodeValue != null) && leftNodeValue.isSingleNode() && leftNodeValue.getNode().getRightBasePosition() < 0; - } - - - /** - * This method takes an alignment between a tree of RNANodeValue2 - * of RNANodeValue and a tree of RNANodeValue2 of RNANodeValueTemplate, - * and the original RNA object that was used to create the first tree - * in the alignment. - * It returns the corresponding RNATemplateMapping. - */ - public static RNATemplateMapping makeTemplateMapping(TreeAlignResult alignResult, RNA rna) throws RNATemplateMappingException { - RNATemplateMapping mapping = new RNATemplateMapping(); - Tree> alignment = alignResult.getAlignment(); - mapping.setDistance(alignResult.getDistance()); - - // Map sequences and helices together, without managing pseudoknots - { - // We will go through the tree using a DFS - // The reason why this algorithm is not trivial is that we may have - // a longer helix on the RNA side than on the template side, in which - // case some nodes on the RNA side are going to be alone while we - // would want them to be part of the helix. - RNATemplateHelix currentHelix = null; - LinkedList>> remainingNodes = new LinkedList>>(); - List nodesInSameHelix = new LinkedList(); - remainingNodes.add(alignment); - while (!remainingNodes.isEmpty()) { - Tree> node = remainingNodes.getLast(); - remainingNodes.removeLast(); - - Tree leftNode = node.getValue().getLeftNode(); - Tree rightNode = node.getValue().getRightNode(); - - // Do we have something on RNA side? - if (leftNode != null && leftNode.getValue() != null) { - RNANodeValue2 leftNodeValue = leftNode.getValue(); - - // Do we have something on template side? - if (rightNode != null && rightNode.getValue() != null) { - RNANodeValueTemplate rightNodeValue = rightNode.getValue(); - - if (rightNodeValue instanceof RNANodeValueTemplateBasePair - && canBePartOfAnHelix(leftNodeValue)) { - RNATemplateHelix helix = ((RNANodeValueTemplateBasePair) rightNodeValue).getHelix(); - currentHelix = helix; - int i = leftNodeValue.getNode().getLeftBasePosition(); - int j = leftNodeValue.getNode().getRightBasePosition(); - mapping.addCouple(i, helix); - mapping.addCouple(j, helix); - - // Maybe we have marked nodes as part of the same helix - // when we didn't know yet which helix it was. - if (nodesInSameHelix.size() > 0) { - for (RNANodeValue2 v: nodesInSameHelix) { - int k = v.getNode().getLeftBasePosition(); - int l = v.getNode().getRightBasePosition(); - // We want to check nodesInSameHelix is a parent helix and not a sibling. - boolean validExtension = (k < i) && (j < l); - if (validExtension) { - mapping.addCouple(v.getNode().getLeftBasePosition(), helix); - mapping.addCouple(v.getNode().getRightBasePosition(), helix); - } - } - } - nodesInSameHelix.clear(); - - } else if (rightNodeValue instanceof RNANodeValueTemplateSequence - && canBePartOfASequence(leftNodeValue)) { - currentHelix = null; - nodesInSameHelix.clear(); - RNATemplateUnpairedSequence sequence = ((RNANodeValueTemplateSequence) rightNodeValue).getSequence(); - for (RNANodeValue nodeValue: leftNode.getValue().getNodes()) { - mapping.addCouple(nodeValue.getLeftBasePosition(), sequence); - } - } else { - // Pseudoknot in template - currentHelix = null; - nodesInSameHelix.clear(); - } - - } else { - // We have nothing on template side - - if (canBePartOfAnHelix(leftNodeValue)) { - if (currentHelix != null) { - // We may be in this case when the RNA - // contains a longer helix than in the template - int i = leftNodeValue.getNode().getLeftBasePosition(); - int j = leftNodeValue.getNode().getRightBasePosition(); - int k = Integer.MAX_VALUE; - int l = Integer.MIN_VALUE; - for (int b: mapping.getAncestor(currentHelix)) { - k = Math.min(k, b); - l = Math.max(l, b); - } - // We want to check currentHelix is a parent helix and not a sibling. - boolean validExtension = (k < i) && (j < l); - if (validExtension) { - mapping.addCouple(i, currentHelix); - mapping.addCouple(j, currentHelix); - } - } else { - // Maybe this left node is part of an helix - // which is smaller in the template - nodesInSameHelix.add(leftNodeValue); - } - } - } - } - - - // If this node has children, add them in the stack - List>> children = node.getChildren(); - int n = children.size(); - if (n > 0) { - int helixChildren = 0; - // For each subtree, we want the sequences (in RNA side) to be treated first - // and then the helix nodes, because finding an aligned sequence tells - // us we cannot grow a current helix - ArrayList>> addToStack1 = new ArrayList>>(); - ArrayList>> addToStack2 = new ArrayList>>(); - for (int i=0; i> child = children.get(i); - Tree RNAchild = child.getValue().getLeftNode(); - if (RNAchild != null - && RNAchild.getValue() != null - && (canBePartOfAnHelix(RNAchild.getValue()) || canBePartOfABrokenHelix(RNAchild.getValue()) )) { - helixChildren++; - addToStack2.add(child); - } else { - addToStack1.add(child); - } - } - // We add the children in their reverse order so they - // are given in the original order by the iterator - for (int i=addToStack2.size()-1; i>=0; i--) { - remainingNodes.add(addToStack2.get(i)); - } - for (int i=addToStack1.size()-1; i>=0; i--) { - remainingNodes.add(addToStack1.get(i)); - } - if (helixChildren >= 2) { - // We cannot "grow" the current helix, because we have a multiloop - // in the RNA. - currentHelix = null; - //nodesInSameHelix.clear(); - } - } - } - } - - - // Now recover pseudoknots (broken helices) - { - // First create a temporary mapping with broken helices - LinkedList>> remainingNodes = new LinkedList>>(); - remainingNodes.add(alignment); - RNATemplateMapping tempPKMapping = new RNATemplateMapping(); - while (!remainingNodes.isEmpty()) { - Tree> node = remainingNodes.getLast(); - remainingNodes.removeLast(); - List>> children = node.getChildren(); - int n = children.size(); - if (n > 0) { - for (int i=n-1; i>=0; i--) { - // We add the children in their reverse order so they - // are given in the original order by the iterator - remainingNodes.add(children.get(i)); - } - List nodesInSameHelix = new LinkedList(); - RNATemplateHelix currentHelix = null; - for (Tree> child: node.getChildren()) { - Tree leftNode = child.getValue().getLeftNode(); - Tree rightNode = child.getValue().getRightNode(); - - if (leftNode != null && leftNode.getValue() != null) { - RNANodeValue2 leftNodeValue = leftNode.getValue(); - // We have a real left (RNA side) node - - if (rightNode != null && rightNode.getValue() != null) { - // We have a real right (template side) node - RNANodeValueTemplate rightNodeValue = rightNode.getValue(); - - if (rightNodeValue instanceof RNANodeValueTemplateBrokenBasePair - && canBePartOfABrokenHelix(leftNodeValue)) { - RNATemplateHelix helix = ((RNANodeValueTemplateBrokenBasePair) rightNodeValue).getHelix(); - currentHelix = helix; - tempPKMapping.addCouple(leftNodeValue.getNode().getLeftBasePosition(), helix); - - // Maybe we have marked nodes as part of the same helix - // when we didn't know yet which helix it was. - for (RNANodeValue2 v: nodesInSameHelix) { - tempPKMapping.addCouple(v.getNode().getLeftBasePosition(), helix); - } - nodesInSameHelix.clear(); - } else { - currentHelix = null; - nodesInSameHelix.clear(); - } - } else { - // We have no right (template side) node - if (canBePartOfABrokenHelix(leftNodeValue)) { - if (currentHelix != null) { - // We may be in this case if the RNA sequence - // contains a longer helix than in the template - tempPKMapping.addCouple(leftNodeValue.getNode().getLeftBasePosition(), currentHelix); - } else { - // Maybe this left node is part of an helix - // which is smaller in the template - nodesInSameHelix.add(leftNodeValue); - } - } else { - currentHelix = null; - nodesInSameHelix.clear(); - } - } - } else { - currentHelix = null; - nodesInSameHelix.clear(); - } - } - } - } - - - // As parts of broken helices were aligned independently, - // we need to check for consistency, ie. keep only bases for - // which the associated base is also aligned with the same helix. - for (RNATemplateElement element: tempPKMapping.getTargetElemsAsSet()) { - RNATemplateHelix helix = (RNATemplateHelix) element; - HashSet basesInHelix = new HashSet(tempPKMapping.getAncestor(helix)); - for (int baseIndex: basesInHelix) { - System.out.println("PK: " + helix + " aligned with " + baseIndex); - boolean baseOK = false; - // Search for an associated base aligned with the same helix - ArrayList auxBasePairs = rna.getAuxBPs(baseIndex); - for (ModeleBP auxBasePair: auxBasePairs) { - int partner5 = ((ModeleBaseNucleotide) auxBasePair.getPartner5()).getIndex(); - int partner3 = ((ModeleBaseNucleotide) auxBasePair.getPartner3()).getIndex(); - if (baseIndex == partner5) { - if (basesInHelix.contains(partner3)) { - baseOK = true; - break; - } - } else if (baseIndex == partner3) { - if (basesInHelix.contains(partner5)) { - baseOK = true; - break; - } - } - } - if (baseOK) { - // Add it to the real mapping - mapping.addCouple(baseIndex, helix); - } - } - } - } - - - return mapping; - } - - - - public static void printMapping(RNATemplateMapping mapping, RNATemplate template, String sequence) { - Iterator iter = template.rnaIterator(); - while (iter.hasNext()) { - RNATemplateElement element = iter.next(); - System.out.println(element.toString()); - ArrayList A = mapping.getAncestor(element); - if (A != null) { - RNATemplateAlign.printIntArrayList(A); - for (int n=A.size(), i=0; i alignRNAWithTemplate(RNA rna, RNATemplate template) throws RNATemplateDrawingAlgorithmException { - try { - Tree rnaAsTree = RNATree2.RNATree2FromRNA(rna); - Tree templateAsTree = template.toTree(); - TreeAlign treeAlign = new TreeAlign(new RNANodeValue2TemplateDistance()); - TreeAlignResult result = treeAlign.align(rnaAsTree, templateAsTree); - return result; - } catch (RNATree2Exception e) { - throw (new RNATemplateDrawingAlgorithmException("RNATree2Exception: " + e.getMessage())); - } catch (ExceptionInvalidRNATemplate e) { - throw (new RNATemplateDrawingAlgorithmException("ExceptionInvalidRNATemplate: " + e.getMessage())); - } catch (TreeAlignException e) { - throw (new RNATemplateDrawingAlgorithmException("TreeAlignException: " + e.getMessage())); - } - } - - /** - * Map an RNA with an RNATemplate using tree alignment. - */ - public static RNATemplateMapping mapRNAWithTemplate(RNA rna, RNATemplate template) throws RNATemplateDrawingAlgorithmException { - try { - TreeAlignResult alignResult = RNATemplateAlign.alignRNAWithTemplate(rna, template); - RNATemplateMapping mapping = RNATemplateAlign.makeTemplateMapping(alignResult, rna); - return mapping; - } catch (RNATemplateMappingException e) { - e.printStackTrace(); - throw (new RNATemplateDrawingAlgorithmException("RNATemplateMappingException: " + e.getMessage())); - } - } - - - - /** - * Print an integer array. - */ - public static void printIntArray(int[] A) { - for (int i=0; i A) { - for (int i=0; i l) { - if (l != null) { - int n = l.size(); - int[] result = new int[n]; - for (int i=0; i map = new HashMap(); - private Map> invmap = new HashMap>(); - - /** - * Alignment distance. - */ - private double distance; - - - public double getDistance() { - return distance; - } - - public void setDistance(double distance) { - this.distance = distance; - } - - /** - * Tell this mapping object that this base index and this element are - * mapped with each other. This will throw RNATemplateMappingException - * and do nothing if the base index is already in the mapping. - */ - public void addCouple(int baseIndex, RNATemplateElement templateElement) throws RNATemplateMappingException { - if (map.containsKey(baseIndex)) { - throw (new RNATemplateMappingException("Base index already in mapping: " + baseIndex)); - } - if (baseIndex < 0) { - throw (new RNATemplateMappingException("Invalid base index: " + baseIndex)); - } - map.put(baseIndex, templateElement); - if (!invmap.containsKey(templateElement)) { - invmap.put(templateElement, new ArrayList()); - } - invmap.get(templateElement).add(baseIndex); - } - - - public String showCompact(RNA r) - { - HashMap > ranges = new HashMap >(); - for(int i:map.keySet()) - { - RNATemplateElement t = map.get(i); - String k = t.getName(); - if (t instanceof RNATemplate.RNATemplateHelix) - { - k += " (" + ((RNATemplateHelix) t).getCaption() + ")"; - ModeleBase mb = r.getBaseAt(i); - if (mb.getElementStructure()>i) - k = k+":5'"; - else - k = k+":3'"; - } - if (!ranges.containsKey(k)) - { ranges.put(k, new Couple(Integer.MAX_VALUE,Integer.MIN_VALUE)); } - Couple c = ranges.get(k); - c.first = Math.min(c.first, i); - c.second = Math.max(c.second, i); - } - String result = ""; - for(String k:ranges.keySet()) - { - Couple c = ranges.get(k); - RNATemplateElement t = map.get(c.first); - String type = ((t instanceof RNATemplate.RNATemplateHelix)?"strand":"loop"); - if (t instanceof RNATemplate.RNATemplateHelix) - { - if (k.endsWith("5'")) - { - Couple c3 = ranges.get(k.replace("5'", "3'")); - result += "dummyID\t1\t"+k.replace(":5'", "")+"\t"+type+"\t"+c.first+"-"+c.second+":"+c3.first+"-"+c3.second+"\n"; - } - } - else if (t instanceof RNATemplate.RNATemplateUnpairedSequence) - { - result += "dummyID\t1\t"+k+"\t"+type+"\t"+c.first+"-"+c.second+"\n"; - } - } - result += "alignment distance = " + distance; - return result; - } - - - /** - * If the given base index is in the mapping, return the - * corresponding template element, otherwise return null. - */ - public RNATemplateElement getPartner(int baseIndex) { - if (map.containsKey(baseIndex)) { - return map.get(baseIndex); - } else { - return null; - } - } - - - - /** - * If the given template element is in the mapping, return an ArrayList - * containing the corresponding base indexes, otherwise return null. - * Note that you should not modify the returned ArrayList because - * no copy is made, so if you modify it this mapping object will - * contain inconsistent data. - */ - public ArrayList getAncestor(RNATemplateElement templateElement) { - if (invmap.containsKey(templateElement)) { - return invmap.get(templateElement); - } else { - return null; - } - } - - - - /** - * Return a set containing all the base indexes in the mapping. - * You should not modify the returned set. - */ - public Set getSourceElemsAsSet() { - return map.keySet(); - } - - - - /** - * Return a set containing all the template elements in the mapping. - * You should not modify the return set. - */ - public Set getTargetElemsAsSet() { - return invmap.keySet(); - } - - - -} diff --git a/src2/fr/orsay/lri/varna/models/templates/RNATemplateMappingException.java b/src2/fr/orsay/lri/varna/models/templates/RNATemplateMappingException.java deleted file mode 100644 index 3b689f1..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/RNATemplateMappingException.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.orsay.lri.varna.models.templates; - -/** - * This exception is thrown when we discover that a template is invalid - * (it contains impossible connections between elements). - * - * @author Raphael Champeimont - */ -public class RNATemplateMappingException extends Exception { - - private static final long serialVersionUID = -201638492590138354L; - - public RNATemplateMappingException(String message) { - super(message); - } - - public RNATemplateMappingException() { - } -} diff --git a/src2/fr/orsay/lri/varna/models/templates/TODO.txt b/src2/fr/orsay/lri/varna/models/templates/TODO.txt deleted file mode 100644 index 1057527..0000000 --- a/src2/fr/orsay/lri/varna/models/templates/TODO.txt +++ /dev/null @@ -1,7 +0,0 @@ -TODO for the template-based RNA drawing algorithm: -- Calculer le tableau centers[] entièrement dans l'algo de tracé. -- RNATemplateAlign.multiPassMap() is currently just an alias - for singlePassMap(), but it should me multi-pass. -- Decalage des helices en absence de PK -- Ellipses pour non-appariees -- couts affine \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/models/treealign/AlignedNode.java b/src2/fr/orsay/lri/varna/models/treealign/AlignedNode.java deleted file mode 100644 index 9f42890..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/AlignedNode.java +++ /dev/null @@ -1,48 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - - -/** - * The type of node values in an alignment. - * Contains a reference to both original nodes. - * This class implements GraphvizDrawableNodeValue but it will only work - * if the original nodes implement it. - * @author Raphael Champeimont - * @param The type of values in the original first tree. - * @param The type of values in the original second tree. - */ -public class AlignedNode implements GraphvizDrawableNodeValue { - private Tree leftNode; - private Tree rightNode; - - public Tree getLeftNode() { - return leftNode; - } - - public void setLeftNode(Tree leftNode) { - this.leftNode = leftNode; - } - - public Tree getRightNode() { - return rightNode; - } - - public void setRightNode(Tree rightNode) { - this.rightNode = rightNode; - } - - private String maybeNodeToGraphvizNodeName(Tree tree) { - return (tree != null && tree.getValue() != null) ? tree.getValue().toGraphvizNodeName() : "_"; - } - - /** - * This method will work only if the left and right node - * already implement GraphvizDrawableNodeValue. - */ - @SuppressWarnings("unchecked") - public String toGraphvizNodeName() { - return "(" + maybeNodeToGraphvizNodeName((Tree) leftNode) - + "," + maybeNodeToGraphvizNodeName((Tree) rightNode) + ")"; - } - - -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/ExampleDistance2.java b/src2/fr/orsay/lri/varna/models/treealign/ExampleDistance2.java deleted file mode 100644 index f58bcbb..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/ExampleDistance2.java +++ /dev/null @@ -1,39 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - - -/** - * This distance is such that a substitution costs nothing. - * - * @author Raphael Champeimont - * - */ -public class ExampleDistance2 implements TreeAlignLabelDistanceSymmetric { - public double f(RNANodeValue2 v1, RNANodeValue2 v2) { - if (v1 == null) { - if (v2 == null) { - return 0; - } else if (!v2.isSingleNode()) { // v2 is a list of bases - return v2.getNodes().size(); - } else { // v2 is a single node - return 2; - } - } else if (!v1.isSingleNode()) { // v1 is a list of bases - if (v2 == null) { - return v1.getNodes().size(); - } else if (!v2.isSingleNode()) { // v2 is a list of bases - return Math.abs(v2.getNodes().size() - v1.getNodes().size()); - } else { // v2 is a single node - return 2 + v1.getNodes().size(); - } - } else { // v1 is a single node - // all the same as when v1 == null - if (v2 == null) { - return 2; - } else if (!v2.isSingleNode()) { // v2 is a list of bases - return 2 + v2.getNodes().size(); - } else { // v2 is a single node - return 0; - } - } - } -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/ExampleDistance3.java b/src2/fr/orsay/lri/varna/models/treealign/ExampleDistance3.java deleted file mode 100644 index cba2a8a..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/ExampleDistance3.java +++ /dev/null @@ -1,194 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; -import java.util.ArrayList; - - - -/** - * - * - * @author Raphael Champeimont - */ -public class ExampleDistance3 implements TreeAlignLabelDistanceSymmetric { - public double f(RNANodeValue2 v1, RNANodeValue2 v2) { - if (v1 == null) { - if (v2 == null) { - return 0; - } else if (!v2.isSingleNode()) { // v2 is a list of bases - // We insert all bases, with a cost of 1 for each base. - return v2.getNodes().size(); - } else { // v2 is a single node - return 2; - } - } else if (!v1.isSingleNode()) { // v1 is a list of bases - if (v2 == null) { - return v1.getNodes().size(); - } else if (!v2.isSingleNode()) { // v2 is a list of bases - // We compute the sequence distance - return alignSequenceNodes(v1, v2).getDistance(); - } else { // v2 is a single node - return 2 + v1.getNodes().size(); - } - } else { // v1 is a single node - // all the same as when v1 == null - if (v2 == null) { - return 2; - } else if (!v2.isSingleNode()) { // v2 is a list of bases - return 2 + v2.getNodes().size(); - } else { // v2 is a single node - String l1 = v1.getNode().getLeftNucleotide(); - String r1 = v1.getNode().getRightNucleotide(); - String l2 = v2.getNode().getLeftNucleotide(); - String r2 = v2.getNode().getRightNucleotide(); - // We have cost(subst((x,y) to (x',y'))) = 1 - // when x != x' and y != y'. - // It means it is less than substituting 2 non-paired bases - return (!l1.equals(l2) ? 0.5 : 0) - + (!r1.equals(r2) ? 0.5 : 0); - } - } - } - - - public class SequenceAlignResult { - private double distance; - private int[][] alignment; - - public double getDistance() { - return distance; - } - public void setDistance(double distance) { - this.distance = distance; - } - - /** The result array is a matrix of height 2 - * and width at most length(sequence A) + length(sequence B). - * with result[0] is the alignment for A - * and result[1] the alignment for B. - * The alignment consists int the indexes of the original - * bases positions, with -1 when there is no match. - */ - public int[][] getAlignment() { - return alignment; - } - public void setAlignment(int[][] alignment) { - this.alignment = alignment; - } - - } - - /** - * Align two sequences contained in nodes. - * Both nodes have to be non-single nodes, otherwise an - * RNANodeValue2WrongTypeException exception will be thrown. - */ - public SequenceAlignResult alignSequenceNodes(RNANodeValue2 v1, RNANodeValue2 v2) { - char[] A = v1.computeSequence(); - char[] B = v2.computeSequence(); - return alignSequences(A, B); - } - - /** - * Align sequences using the Needleman-Wunsch algorithm. - * Time: O(A.length * B.length) - * Space: O(A.length * B.length) - * Space used by the returned object: O(A.length + B.length) - */ - public SequenceAlignResult alignSequences(char[] A, char[] B) { - SequenceAlignResult result = new SequenceAlignResult(); - - final int la = A.length; - final int lb = B.length; - double[][] F = new double[la+1][lb+1]; - int[][] decisions = new int[la+1][lb+1]; - final double d = 1; // insertion/deletion cost - final double substCost = 1; // substitution cost - for (int i=0; i<=la; i++) - F[i][0] = d*i; - for (int j=0; j<=lb; j++) - F[0][j] = d*j; - for (int i=1; i<=la; i++) - for (int j=1; j<=lb; j++) - { - double min; - int decision; - double match = F[i-1][j-1] + (A[i-1] == B[j-1] ? 0 : substCost); - double delete = F[i-1][j] + d; - if (match < delete) { - decision = 1; - min = match; - } else { - decision = 2; - min = delete; - } - double insert = F[i][j-1] + d; - if (insert < min) { - decision = 3; - min = insert; - } - F[i][j] = min; - decisions[i][j] = decision; - } - - result.setDistance(F[la][lb]); - - int[][] alignment = computeAlignment(F, decisions, A, B); - result.setAlignment(alignment); - - return result; - } - - private int[][] computeAlignment(double[][] F, int[][] decisions, char[] A, char[] B) { - // At worst the alignment will be of length (A.length + B.length) - ArrayList AlignmentA = new ArrayList(A.length + B.length); - ArrayList AlignmentB = new ArrayList(A.length + B.length); - int i = A.length; - int j = B.length; - while (i > 0 && j > 0) - { - int decision = decisions[i][j]; - switch (decision) { - case 1: - AlignmentA.add(i-1); - AlignmentB.add(j-1); - i = i - 1; - j = j - 1; - break; - case 2: - AlignmentA.add(i-1); - AlignmentB.add(-1); - i = i - 1; - break; - case 3: - AlignmentA.add(-1); - AlignmentB.add(j-1); - j = j - 1; - break; - default: - throw (new Error("Bug in ExampleDistance3: decision = " + decision)); - } - } - while (i > 0) - { - AlignmentA.add(i-1); - AlignmentB.add(-1); - i = i - 1; - } - while (j > 0) - { - AlignmentA.add(-1); - AlignmentB.add(j-1); - j = j - 1; - } - - // Convert the ArrayLists to the right format: - // We need to reverse the list and change the numbering of - int l = AlignmentA.size(); - int[][] result = new int[2][l]; - for (i=0; i nodes; - - public RNANodeValue2(boolean singleNode) { - this.singleNode = singleNode; - if (singleNode) { - node = new RNANodeValue(); - } else { - nodes = new ArrayList(); - } - } - - /** - * In case of a single node, return it. - * Will throw RNANodeValue2WrongTypeException if singleNode = false. - */ - public RNANodeValue getNode() { - if (singleNode) { - return node; - } else { - throw (new RNANodeValue2WrongTypeException()); - } - } - - public void setNode(RNANodeValue node) { - if (singleNode) { - this.node = node; - } else { - throw (new RNANodeValue2WrongTypeException()); - } - } - - /** - * In case of multiple nodes, return them. - * Will throw RNANodeValue2WrongTypeException if singleNode = true. - */ - public List getNodes() { - if (!singleNode) { - return nodes; - } else { - throw (new RNANodeValue2WrongTypeException()); - } - } - /** - * In case of multiple nodes, return the sequence of nucleotides. - */ - public char[] computeSequence() { - if (!singleNode) { - final int n = nodes.size(); - char[] sequence = new char[n]; - for (int i=0; i nodes) { - if (!singleNode) { - this.nodes = nodes; - } else { - throw (new RNANodeValue2WrongTypeException()); - } - } - - public boolean isSingleNode() { - return singleNode; - } - - public String toString() { - if (singleNode) { - return node.toString(); - } else { - String s = ""; - for (RNANodeValue node: nodes) { - if (s != "") { - s += " "; - } - s += node.toString(); - } - return s; - } - } - - public String toGraphvizNodeName() { - if (singleNode) { - return node.toGraphvizNodeName(); - } else { - String s = ""; - for (RNANodeValue node: nodes) { - if (s != "") { - s += " "; - } - s += node.toGraphvizNodeName(); - } - return s; - } - } - -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/RNANodeValue2WrongTypeException.java b/src2/fr/orsay/lri/varna/models/treealign/RNANodeValue2WrongTypeException.java deleted file mode 100644 index 8dd2505..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/RNANodeValue2WrongTypeException.java +++ /dev/null @@ -1,11 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - -/** - * @author Raphael Champeimont - * - */ -public class RNANodeValue2WrongTypeException extends NullPointerException { - - private static final long serialVersionUID = -2709057098523675088L; - -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/RNATree.java b/src2/fr/orsay/lri/varna/models/treealign/RNATree.java deleted file mode 100644 index 8a72fbf..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/RNATree.java +++ /dev/null @@ -1,158 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - -import java.util.ArrayList; -import java.util.List; - -import fr.orsay.lri.varna.exceptions.MappingException; -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.RNA; - - - -/** - * This class contains all functions that are specific to trees - * (class Tree) of RNA. - * - * @author Raphael Champeimont - * - */ -public class RNATree { - /** - * Convert an RNA object into a RNA tree. - * The root node will have a null value because it is a fake - * node added to have a tree (otherwise we would have a forest). - */ - public static Tree RNATreeFromRNA(RNA rna) { - ConvertToTree converter = new ConvertToTree(rna); - return converter.toTreeAux(0); - } - - private static class ConvertToTree { - private RNA rna; - - private int i = 0; - - /** Starts at the current position i in the sequence and converts the sequence - * to a tree. - * @return the created tree - */ - public Tree toTreeAux(int depth) { - Tree tree = new Tree(); - List> children = tree.getChildren(); - // No value because it is a fake root - tree.setValue(null); - - int length = rna.getSize(); - while (i < length) { - ModeleBase base = rna.getBaseAt(i); - int indexOfAssociatedBase = base.getElementStructure(); - if (indexOfAssociatedBase >= 0) { - if (indexOfAssociatedBase > i) { - // left parenthesis, we must analyze the children - RNANodeValue childValue = new RNANodeValue(); - childValue.setLeftBasePosition(i); - childValue.setRightBasePosition(indexOfAssociatedBase); - childValue.setOrigin(RNANodeValue.Origin.BASE_PAIR_FROM_HELIX); - - if (base instanceof ModeleBaseNucleotide) { - childValue.setLeftNucleotide(((ModeleBaseNucleotide) base).getBase()); - childValue.setRightNucleotide(((ModeleBaseNucleotide) rna.getBaseAt(indexOfAssociatedBase)).getBase()); - } - i++; - Tree child = toTreeAux(depth+1); - child.setValue(childValue); - children.add(child); - } else { - // right parenthesis, we have finished analyzing the children - i++; - break; - } - } else { - // we have a non-paired base - Tree child = new Tree(); - RNANodeValue childValue = new RNANodeValue(); - childValue.setLeftBasePosition(i); - if (base instanceof ModeleBaseNucleotide) { - childValue.setLeftNucleotide(((ModeleBaseNucleotide) base).getBase()); - } - - // Even in this case (getElementStructure() < 0) - // this base may still come from an helix which may have - // been broken to remove a pseudoknot. - childValue.setOrigin(RNANodeValue.Origin.BASE_FROM_UNPAIRED_REGION); - ArrayList auxBasePairs = rna.getAuxBPs(i); - for (ModeleBP auxBasePair: auxBasePairs) { - if (auxBasePair.isCanonical()) { - int partner5 = ((ModeleBaseNucleotide) auxBasePair.getPartner5()).getIndex(); - int partner3 = ((ModeleBaseNucleotide) auxBasePair.getPartner3()).getIndex(); - if (i == partner5) { - childValue.setOrigin(RNANodeValue.Origin.BASE_FROM_HELIX_STRAND5); - } else if (i == partner3) { - childValue.setOrigin(RNANodeValue.Origin.BASE_FROM_HELIX_STRAND3); - } else { - System.err.println("Warning: Base index is " + i + " but neither endpoint matches it (edge endpoints are " + partner5 + " and " + partner3 + ")."); - } - - } - } - - child.setValue(childValue); - children.add(child); - i++; - } - } - - return tree; - } - - public ConvertToTree(RNA rna) { - this.rna = rna; - } - } - - - /** - * Convert an RNA tree alignment into a Mapping. - */ - public static Mapping mappingFromAlignment(Tree> alignment) throws MappingException { - ConvertToMapping converter = new ConvertToMapping(); - return converter.convert(alignment); - } - - private static class ConvertToMapping { - private Mapping m; - - public Mapping convert(Tree> tree) throws MappingException { - m = new Mapping(); - convertSubTree(tree); - return m; - } - - private void convertSubTree(Tree> tree) throws MappingException { - AlignedNode alignedNode = tree.getValue(); - Tree leftNode = alignedNode.getLeftNode(); - Tree rightNode = alignedNode.getRightNode(); - if (leftNode != null && rightNode != null) { - RNANodeValue v1 = leftNode.getValue(); - RNANodeValue v2 = rightNode.getValue(); - int l1 = v1.getLeftBasePosition(); - int r1 = v1.getRightBasePosition(); - int l2 = v2.getLeftBasePosition(); - int r2 = v2.getRightBasePosition(); - if (l1 >= 0 && l2 >= 0) { - m.addCouple(l1, l2); - } - if (r1 >= 0 && r2 >= 0) { - m.addCouple(r1, r2); - } - } - for (Tree> child: tree.getChildren()) { - convertSubTree(child); - } - } - } - -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/RNATree2.java b/src2/fr/orsay/lri/varna/models/treealign/RNATree2.java deleted file mode 100644 index 753819b..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/RNATree2.java +++ /dev/null @@ -1,172 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import fr.orsay.lri.varna.exceptions.MappingException; -import fr.orsay.lri.varna.models.rna.Mapping; -import fr.orsay.lri.varna.models.rna.RNA; - - -/** - * This class contains all functions that are specific to trees - * (class Tree) of RNA, with RNANodeValue2. - * - * @author Raphael Champeimont - * - */ -public class RNATree2 { - /** - * Convert an RNA object into a RNA tree with RNANodeValue2. - * @throws RNATree2Exception - */ - public static Tree RNATree2FromRNA(RNA rna) throws RNATree2Exception { - Tree fullTree = RNATree.RNATreeFromRNA(rna); - return RNATree2FromRNATree(fullTree); - } - - /** - * Convert from RNANodeValue model to RNANodeValue2 model, - * ie. compact consecutive non-paired bases. - */ - public static Tree RNATree2FromRNATree(Tree originalTree) throws RNATree2Exception { - Tree newTree = new Tree(); - // Root in original tree is fake, so make a fake root - newTree.setValue(null); - newTree.replaceChildrenListBy(RNAForest2FromRNAForest(originalTree.getChildren())); - return newTree; - } - - private static void RNAForest2FromRNAForestCommitNonPaired(List> forest, List consecutiveNonPairedBases) { - // add the group of non-paired bases if there is one - if (consecutiveNonPairedBases.size() > 0) { - RNANodeValue2 groupOfConsecutiveBases = new RNANodeValue2(false); - groupOfConsecutiveBases.getNodes().addAll(consecutiveNonPairedBases); - Tree groupOfConsecutiveBasesNode = new Tree(); - groupOfConsecutiveBasesNode.setValue(groupOfConsecutiveBases); - forest.add(groupOfConsecutiveBasesNode); - consecutiveNonPairedBases.clear(); - } - } - - private static List> RNAForest2FromRNAForest(List> originalForest) throws RNATree2Exception { - List> forest = new ArrayList>(); - List consecutiveNonPairedBases = new LinkedList(); - for (Tree originalTree: originalForest) { - if (originalTree.getValue().getRightBasePosition() == -1) { - // non-paired base - if (originalTree.getChildren().size() > 0) { - throw (new RNATree2Exception("Non-paired base cannot have children.")); - } - - switch (originalTree.getValue().getOrigin()) { - case BASE_FROM_HELIX_STRAND5: - case BASE_FROM_HELIX_STRAND3: - // This base is part of a broken base pair - - // if we have gathered some non-paired bases, add a node with - // the group of them - RNAForest2FromRNAForestCommitNonPaired(forest, consecutiveNonPairedBases); - - // now add the node - RNANodeValue2 pairedBase = new RNANodeValue2(true); - pairedBase.setNode(originalTree.getValue()); - Tree pairedBaseNode = new Tree(); - pairedBaseNode.setValue(pairedBase); - forest.add(pairedBaseNode); - break; - case BASE_FROM_UNPAIRED_REGION: - consecutiveNonPairedBases.add(originalTree.getValue()); - break; - case BASE_PAIR_FROM_HELIX: - throw (new RNATree2Exception("Origin is BASE_PAIR_FROM_HELIX but this is not a pair.")); - } - } else { - // paired bases - - // if we have gathered some non-paired bases, add a node with - // the group of them - RNAForest2FromRNAForestCommitNonPaired(forest, consecutiveNonPairedBases); - - // now add the node - RNANodeValue2 pairedBase = new RNANodeValue2(true); - pairedBase.setNode(originalTree.getValue()); - Tree pairedBaseNode = new Tree(); - pairedBaseNode.setValue(pairedBase); - pairedBaseNode.replaceChildrenListBy(RNAForest2FromRNAForest(originalTree.getChildren())); - forest.add(pairedBaseNode); - } - } - - // if there we have some non-paired bases, add them grouped - RNAForest2FromRNAForestCommitNonPaired(forest, consecutiveNonPairedBases); - - return forest; - } - - - /** - * Convert an RNA tree (with RNANodeValue2) alignment into a Mapping. - */ - public static Mapping mappingFromAlignment(Tree> alignment) throws MappingException { - ConvertToMapping converter = new ConvertToMapping(); - return converter.convert(alignment); - } - - private static class ConvertToMapping { - private Mapping m; - ExampleDistance3 sequenceAligner = new ExampleDistance3(); - - public Mapping convert(Tree> tree) throws MappingException { - m = new Mapping(); - convertSubTree(tree); - return m; - } - - private void convertSubTree(Tree> tree) throws MappingException { - AlignedNode alignedNode = tree.getValue(); - Tree leftNode = alignedNode.getLeftNode(); - Tree rightNode = alignedNode.getRightNode(); - if (leftNode != null && rightNode != null) { - RNANodeValue2 v1 = leftNode.getValue(); - RNANodeValue2 v2 = rightNode.getValue(); - if (v1.isSingleNode() && v2.isSingleNode()) { - // we have aligned (x,y) with (x',y') - // so we map x with x' and y with y' - RNANodeValue vsn1 = v1.getNode(); - RNANodeValue vsn2 = v2.getNode(); - int l1 = vsn1.getLeftBasePosition(); - int r1 = vsn1.getRightBasePosition(); - int l2 = vsn2.getLeftBasePosition(); - int r2 = vsn2.getRightBasePosition(); - if (l1 >= 0 && l2 >= 0) { - m.addCouple(l1, l2); - } - if (r1 >= 0 && r2 >= 0) { - m.addCouple(r1, r2); - } - } else if (!v1.isSingleNode() && !v2.isSingleNode()) { - // We have aligned x1 x2 ... xn with y1 y2 ... ym. - // So we will now (re-)compute this sequence alignment. - int[][] sequenceAlignment = sequenceAligner.alignSequenceNodes(v1, v2).getAlignment(); - int l = sequenceAlignment[0].length; - for (int i=0; i> child: tree.getChildren()) { - convertSubTree(child); - } - } - } -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/RNATree2Exception.java b/src2/fr/orsay/lri/varna/models/treealign/RNATree2Exception.java deleted file mode 100644 index 81ccce9..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/RNATree2Exception.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - -/** - * @author Raphael Champeimont - * - */ -public class RNATree2Exception extends Exception { - - private static final long serialVersionUID = 2034802149835891010L; - - public RNATree2Exception(String message) { - super(message); - } - -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/Tree.java b/src2/fr/orsay/lri/varna/models/treealign/Tree.java deleted file mode 100644 index ff00e71..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/Tree.java +++ /dev/null @@ -1,157 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; -import java.util.*; - - -/** - * An object of this class is a rooted tree, where children are ordered. - * The tree is iterable, and the default iterator is DFS - * (depth-first search), with the fathers given before the children. - * - * @param The type of values on nodes. - * @author Raphael Champeimont - */ -public class Tree implements Iterable> { - private List> children; - private T value; - private Tree tree = this; - - public T getValue() { - return value; - } - - public void setValue(T value) { - this.value = value; - } - - /** - * Returns the list of children. - * The return list has a O(1) access time to any of its elements - * (ie. it is like an array and unlike a linked list) - */ - public List> getChildren() { - return children; - } - - /** - * This method replaces the list of children of a tree with the list given - * as argument. Be careful, because it means the list will be kept as a - * reference (it will not be copied) so if you later modify the list - * you passed as an argument here, it will modify the list of children. - * Note that the List object you give must have a 0(1) access time to - * elements (because someone calling getChildren() can expect that property). - * This method may be useful if you have already built a list of children - * and you don't want to use this.getChildren.addAll() to avoid a O(n) copy. - * In that case you would simply call the constructor that takes no argument - * to create an empty tree and then call replaceChildrenListBy(children) - * where children is the list of children you have built. - * @param children the new list of children - */ - public void replaceChildrenListBy(List> children) { - this.children = children; - } - - /** - * Creates a tree, with the given set of children. - * The given set is any collection that implements Iterable. - * The set is iterated on and its elements are copied (as references). - */ - public Tree(Iterable> children) { - this(); - for (Tree child: children) { - this.children.add(child); - } - } - - /** - * Creates a tree, with an empty list of children. - */ - public Tree() { - children = new ArrayList>(); - } - - /** - * Returns the number of children of the root node. - */ - public int rootDegree() { - return children.size(); - } - - - /** - * Count the nodes in the tree. - * Time: O(n) - * @return the number of nodes in the tree - */ - public int countNodes() { - int count = 1; - for (Tree child: children) { - count += child.countNodes(); - } - return count; - } - - /** - * Compute the tree degree, ie. the max over nodes of the node degree. - * Time: O(n) - * @return the maximum node degree - */ - public int computeDegree() { - int max = children.size(); - for (Tree child: children) { - int maxCandidate = child.computeDegree(); - if (maxCandidate > max) { - max = maxCandidate; - } - } - return max; - } - - /** - * Returns a string unique to this node. - */ - public String toGraphvizNodeId() { - return super.toString(); - } - - - public Iterator> iterator() { - return (new DFSPrefixIterator()); - } - - /** - * An iterator that returns the nodes in prefix (fathers before - * children) DFS (go deep first) order. - */ - public class DFSPrefixIterator implements Iterator> { - private LinkedList> remainingNodes = new LinkedList>(); - - public boolean hasNext() { - return !remainingNodes.isEmpty(); - } - - public Tree next() { - if (remainingNodes.isEmpty()) { - throw (new NoSuchElementException()); - } - Tree currentNode = remainingNodes.getLast(); - remainingNodes.removeLast(); - List> children = currentNode.getChildren(); - int n = children.size(); - // The children access is in O(1) so this loop is O(n) - for (int i=n-1; i>=0; i--) { - // We add the children is their reverse order so they - // are given in the original order by the iterator - remainingNodes.add(children.get(i)); - } - return currentNode; - } - - public DFSPrefixIterator() { - remainingNodes.add(tree); - } - - public void remove() { - throw (new UnsupportedOperationException()); - } - } -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/TreeAlign.java b/src2/fr/orsay/lri/varna/models/treealign/TreeAlign.java deleted file mode 100644 index ebf89d6..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/TreeAlign.java +++ /dev/null @@ -1,775 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - -import java.util.*; - - -/** - * Tree alignment algorithm. - * This class implements the tree alignment algorithm - * for ordered trees explained in article: - * T. Jiang, L. Wang, K. Zhang, - * Alignment of trees - an alternative to tree edit, - * Theoret. Comput. Sci. 143 (1995). - * Other references: - * - Claire Herrbach, Alain Denise and Serge Dulucq. - * Average complexity of the Jiang-Wang-Zhang pairwise tree alignment - * algorithm and of a RNA secondary structure alignment algorithm. - * Theoretical Computer Science 411 (2010) 2423-2432. - * - * Our implementation supposes that the trees will never have more - * than 32000 nodes and that the total distance will never require more - * significant digits that a float (single precision) has. - * - * @author Raphael Champeimont - * @param The type of values on nodes in the first tree. - * @param The type of values on nodes in the second tree. - */ -public class TreeAlign { - - private class TreeData { - /** - * The tree. - */ - public Tree tree; - - /** - * The tree size (number of nodes). - */ - public int size = -1; - - /** - * The number of children of a node is called the node degree. - * This variable is the maximum node degree in the tree. - */ - public int degree = -1; - - /** - * The number of children of a node is called the node degree. - * degree[i] is the degree of node i, with i being an index in nodes. - */ - public int[] degrees; - - /** - * The trees as an array of its nodes (subtrees rooted at each node - * in fact), in postorder. - */ - public Tree[] nodes; - - /** - * children[i] is the array of children (as indexes in nodes) - * of i (an index in nodes) - */ - public int[][] children; - - /** - * Values of nodes. - */ - public ValueType[] values; - } - - - /** - * The distance function between labels. - */ - private TreeAlignLabelDistanceAsymmetric labelDist; - - - /** - * Create a TreeAlignSymmetric object, which can align trees. - * The distance function will be called only once on every pair - * of nodes. The result is then kept in a matrix, so you need not manage - * yourself a cache of f(value1, value2). - * Note that it is permitted to have null values on nodes, - * so comparing a node with a non-null value with a node with a null - * value will give the same cost as to insert the first node. - * This can be useful if you tree has "fake" nodes. - * @param labelDist The label distance. - */ - public TreeAlign(TreeAlignLabelDistanceAsymmetric labelDist) { - this.labelDist = labelDist; - } - - - - private class ConvertTreeToArray { - private int nextNodeIndex = 0; - private TreeData treeData; - - public ConvertTreeToArray(TreeData treeData) { - this.treeData = treeData; - } - - private void convertTreeToArrayAux( - Tree subtree, - int[] siblingIndexes, - int siblingNumber) throws TreeAlignException { - // We want it in postorder, so first we put the children - List> children = subtree.getChildren(); - int numberOfChildren = children.size(); - int[] childrenIndexes = new int[numberOfChildren]; - int myIndex = -1; - { - int i = 0; - for (Tree child: children) { - convertTreeToArrayAux(child, childrenIndexes, i); - i++; - } - } - // Compute the maximum degree - if (numberOfChildren > treeData.degree) { - treeData.degree = numberOfChildren; - } - // Now we add the node (root of the given subtree). - myIndex = nextNodeIndex; - nextNodeIndex++; - treeData.nodes[myIndex] = subtree; - // Record how many children I have - treeData.degrees[myIndex] = numberOfChildren; - // Store my value in an array - ValueType v = subtree.getValue(); - treeData.values[myIndex] = v; - // Tell the caller my index - siblingIndexes[siblingNumber] = myIndex; - // Record my children indexes - treeData.children[myIndex] = childrenIndexes; - } - - /** - * Reads: treeData.tree - * Computes: treeData.nodes, treeData.degree, treeData.degrees - * treeData.fathers, treeData.children, treeData.size, - * treeData.values - * Converts a tree to an array of nodes, in postorder. - * We also compute the maximum node degree in the tree. - * @throws TreeAlignException - */ - @SuppressWarnings("unchecked") - public void convert() throws TreeAlignException { - treeData.degree = 0; - treeData.size = treeData.tree.countNodes(); - // we didn't write new Tree[treeData.size] because - // java does not support generics with arrays - treeData.nodes = new Tree[treeData.size]; - treeData.children = new int[treeData.size][]; - treeData.degrees = new int[treeData.size]; - treeData.values = (ValueType[]) new Object[treeData.size]; - int rootIndex[] = new int[1]; - convertTreeToArrayAux(treeData.tree, rootIndex, 0); - } - } - - - /** - * For arrays that take at least O(|T1|*|T2|) we take care - * not to use too big data types. - */ - private class Aligner { - /** - * The first tree. - */ - private TreeData treeData1; - - /** - * The second tree. - */ - private TreeData treeData2; - - /** - * DF1[i][j_t] is DFL for (i,j,s,t) with s=0. - * See description of DFL in Aligner.computeAlignmentP1(). - * DF1 and DF2 are the "big" arrays, ie. those that may the space - * complexity what it is. - */ - private float[][][][] DF1; - - /** - * DF2[j][i_s] is DFL for (i,j,s,t) with t=0. - * See description of DFL in Aligner.computeAlignmentP1(). - */ - private float[][][][] DF2; - - /** - * This arrays have the same shape as respectively DF1. - * They are used to remember which term in the minimum won, so that - * we can compute the alignment. - * Decision1 is a case number (< 10) - * and Decision2 is a child index, hence the types. - */ - private byte[][][][] DF1Decisions1; - private short[][][][] DF1Decisions2; - - /** - * This arrays have the same shape as respectively DF2. - * They are used to remember which term in the minimum won, so that - * we can compute the alignment. - */ - private byte[][][][] DF2Decisions1; - private short[][][][] DF2Decisions2; - - /** - * Distances between subtrees. - * DT[i][j] is the distance between the subtree rooted at i in the first tree - * and the subtree rooted at j in the second tree. - */ - private float[][] DT; - - /** - * This array has the same shape as DT, but is used to remember which - * case gave the minimum, so that we can later compute the alignment. - */ - private byte[][] DTDecisions1; - private short[][] DTDecisions2; - - /** - * Distances between labels. - * DL[i][j] is the distance labelDist.f(value(T1[i]), value(T2[i])). - * By convention, we say that value(T1[|T1|]) = null - * and value(T2[|T2|]) = null - */ - private float[][] DL; - - /** - * DET1[i] is the distance between the empty tree and T1[i] - * (the subtree rooted at node i in the first tree). - */ - private float[] DET1; - - /** - * Same as DET1, but for second tree. - */ - private float[] DET2; - - /** - * DEF1[i] is the distance between the empty forest and F1[i] - * (the forest of children of node i in the first tree). - */ - private float[] DEF1; - - /** - * Same as DEF1, but for second tree. - */ - private float[] DEF2; - - - /** - * @param i node in T1 - * @param s number of first child of i to consider - * @param m_i degree of i - * @param j node in T2 - * @param t number of first child of j to consider - * @param n_j degree of j - * @param DFx which array to fill (DF1 or DF2) - */ - private void computeAlignmentP1(int i, int s, int m_i, int j, int t, int n_j, int DFx) { - /** - * DFL[pr][qr] is D(F1[i_s, i_p], F2[j_t, j_q]) - * where p=s+pr-1 and q=t+qr-1 (ie. pr=p-s+1 and qr=q-t+1) - * By convention, F1[i_s, i_{s-1}] and F2[j_t, j_{t-1}] are the - * empty forests. - * Said differently, DFL[pr][qr] is the distance between the forest - * of the pr first children of i, starting with child s - * (first child is s = 0), and the forest of the qr first children - * of j, starting with child t (first child is t = 0). - * This array is allocated for a fixed value of (i,j,s,t). - */ - float[][] DFL; - - /** - * Same shape as DFL, but to remember which term gave the min, - * so that we can later compute the alignment. - */ - byte[][] DFLDecisions1; - short[][] DFLDecisions2; - - DFL = new float[m_i-s+2][n_j-t+2]; - DFL[0][0] = 0; // D(empty forest, empty forest) = 0 - - DFLDecisions1 = new byte[m_i-s+2][n_j-t+2]; - DFLDecisions2 = new short[m_i-s+2][n_j-t+2]; - - // Compute indexes of i_s and j_t because we will need them - int i_s = m_i != 0 ? treeData1.children[i][s] : -1; - int j_t = n_j != 0 ? treeData2.children[j][t] : -1; - - for (int p=s; p(treeData1)).convert(); - (new ConvertTreeToArray(treeData2)).convert(); - - // Allocate necessary arrays - DT = new float[treeData1.size][treeData2.size]; - DTDecisions1 = new byte[treeData1.size][treeData2.size]; - DTDecisions2 = new short[treeData1.size][treeData2.size]; - DL = new float[treeData1.size+1][treeData2.size+1]; - DET1 = new float[treeData1.size]; - DET2 = new float[treeData2.size]; - DEF1 = new float[treeData1.size]; - DEF2 = new float[treeData2.size]; - DF1 = new float[treeData1.size][treeData2.size][][]; - DF1Decisions1 = new byte[treeData1.size][treeData2.size][][]; - DF1Decisions2 = new short[treeData1.size][treeData2.size][][]; - DF2 = new float[treeData2.size][treeData1.size][][]; - DF2Decisions1 = new byte[treeData2.size][treeData1.size][][]; - DF2Decisions2 = new short[treeData2.size][treeData1.size][][]; - - DL[treeData1.size][treeData2.size] = (float) labelDist.f(null, null); - - for (int i=0; i T1, Tree T2) { - treeData1 = new TreeData(); - treeData1.tree = T1; - treeData2 = new TreeData(); - treeData2.tree = T2; - } - - /** Align F1[i_s,i_p] with F2[j_t,j_q]. - * If p = s-1, by convention it means F1[i_s,i_p] = empty forest. - * Idem for q=t-1. - */ - private List>> computeForestAlignment(int i, int s, int p, int j, int t, int q) { - if (p == s-1) { // left forest is the empty forest - List>> result = new ArrayList>>(); - for (int k=t; k<=q; k++) { - result.add(treeInserted(treeData2.children[j][k])); - } - return result; - } else { - if (q == t-1) { // right forest is the empty forest - List>> result = new ArrayList>>(); - for (int k=s; k<=p; k++) { - result.add(treeDeleted(treeData1.children[i][k])); - } - return result; - } else { // both forests are non-empty - int decision1, k; - if (s == 0) { - decision1 = - DF1Decisions1 [i] [treeData2.children[j][t]] [p-s+1] [q-t+1]; - k = - DF1Decisions2 [i] [treeData2.children[j][t]] [p-s+1] [q-t+1]; - } else if (t == 0) { - decision1 = - DF2Decisions1 [j] [treeData1.children[i][s]] [p-s+1] [q-t+1]; - k = - DF2Decisions2 [j] [treeData1.children[i][s]] [p-s+1] [q-t+1]; - } else { - throw (new Error("TreeAlignSymmetric bug: both s and t are non-zero")); - } - switch (decision1) { - case 1: - { - List>> result; - result = computeForestAlignment(i, s, p-1, j, t, q); - result.add(treeDeleted(treeData1.children[i][p])); - return result; - } - case 2: - { - List>> result; - result = computeForestAlignment(i, s, p, j, t, q-1); - result.add(treeInserted(treeData2.children[j][q])); - return result; - } - case 3: - { - List>> result; - result = computeForestAlignment(i, s, p-1, j, t, q-1); - result.add(computeTreeAlignment(treeData1.children[i][p], treeData2.children[j][q])); - return result; - } - case 4: - { - List>> result; - result = computeForestAlignment(i, s, k-1, j, t, q-1); - - int j_q = treeData2.children[j][q]; - Tree> insertedNode = new Tree>(); - AlignedNode insertedNodeValue = new AlignedNode(); - insertedNodeValue.setLeftNode(null); - insertedNodeValue.setRightNode((Tree) treeData2.nodes[j_q]); - insertedNode.setValue(insertedNodeValue); - - insertedNode.replaceChildrenListBy(computeForestAlignment(i, k, p, j_q, 0, treeData2.degrees[j_q]-1)); - - result.add(insertedNode); - - return result; - } - case 5: - { - List>> result; - result = computeForestAlignment(i, s, p-1, j, t, k-1); - - int i_p = treeData1.children[i][p]; - Tree> deletedNode = new Tree>(); - AlignedNode deletedNodeValue = new AlignedNode(); - deletedNodeValue.setLeftNode((Tree) treeData1.nodes[i_p]); - deletedNodeValue.setRightNode(null); - deletedNode.setValue(deletedNodeValue); - - deletedNode.replaceChildrenListBy(computeForestAlignment(i_p, 0, treeData1.degrees[i_p]-1, j, k, q)); - - result.add(deletedNode); - - return result; - } - default: - throw (new Error("TreeAlign: decision1 = " + decision1)); - } - } - } - } - - /** - * Align T1[i] with the empty tree. - * @return the alignment - */ - private Tree> treeDeleted(int i) { - Tree> root = new Tree>(); - AlignedNode alignedNode = new AlignedNode(); - alignedNode.setLeftNode(treeData1.nodes[i]); - alignedNode.setRightNode(null); - root.setValue(alignedNode); - for (int r = 0; r> treeInserted(int j) { - Tree> root = new Tree>(); - AlignedNode alignedNode = new AlignedNode(); - alignedNode.setLeftNode(null); - alignedNode.setRightNode(treeData2.nodes[j]); - root.setValue(alignedNode); - for (int r = 0; r> computeTreeAlignment(int i, int j) { - switch (DTDecisions1[i][j]) { - case 1: - { - Tree> root = new Tree>(); - - // Compute the value of the node - AlignedNode alignedNode = new AlignedNode(); - alignedNode.setLeftNode(null); - alignedNode.setRightNode(treeData2.nodes[j]); - root.setValue(alignedNode); - - // Compute the children - for (int r = 0; r> root = new Tree>(); - - // Compute the value of the node - AlignedNode alignedNode = new AlignedNode(); - alignedNode.setLeftNode(treeData1.nodes[i]); - alignedNode.setRightNode(null); - root.setValue(alignedNode); - - // Compute the children - for (int r = 0; r> root = new Tree>(); - - // Compute the value of the node - AlignedNode alignedNode = new AlignedNode(); - alignedNode.setLeftNode(treeData1.nodes[i]); - alignedNode.setRightNode(treeData2.nodes[j]); - root.setValue(alignedNode); - - // Compute the children - List>> children = - computeForestAlignment(i, 0, treeData1.degrees[i]-1, j, 0, treeData2.degrees[j]-1); - root.replaceChildrenListBy(children); - - return root; - } - default: - throw (new Error("TreeAlign: DTDecisions1[i][j] = " + DTDecisions1[i][j])); - } - } - - public Tree> computeAlignment() { - return computeTreeAlignment(treeData1.size-1, treeData2.size-1); - } - - } - - - /** - * Align T1 with T2, computing both the distance and the alignment. - * Time: O(|T1|*|T2|*(deg(T1)+deg(T2))^2) - * Space: O(|T1|*|T2|*(deg(T1)+deg(T2))) - * Average (over possible trees) time: O(|T1|*|T2|) - * @param T1 The first tree. - * @param T2 The second tree. - * @return The distance and the alignment. - * @throws TreeAlignException - */ - public TreeAlignResult align(Tree T1, Tree T2) throws TreeAlignException { - TreeAlignResult result = new TreeAlignResult(); - Aligner aligner = new Aligner(T1, T2); - result.setDistance(aligner.align()); - result.setAlignment(aligner.computeAlignment()); - return result; - } - - - /** - * Takes a alignment, and compute the distance between the two - * original trees. If you have called align(), the result object already - * contains the distance D and the alignment A. If you call - * distanceFromAlignment on the alignment A it will compute the distance D. - */ - public float distanceFromAlignment(Tree> alignment) { - Tree originalT1Node; - Tree originalT2Node; - originalT1Node = alignment.getValue().getLeftNode(); - originalT2Node = alignment.getValue().getRightNode(); - float d = (float) labelDist.f( - originalT1Node != null ? originalT1Node.getValue() : null, - originalT2Node != null ? originalT2Node.getValue() : null); - for (Tree> child: alignment.getChildren()) { - d += distanceFromAlignment(child); - } - return d; - } - - -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/TreeAlignException.java b/src2/fr/orsay/lri/varna/models/treealign/TreeAlignException.java deleted file mode 100644 index 0ad966d..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/TreeAlignException.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - -/** - * @author Raphael Champeimont - * - */ -public class TreeAlignException extends Exception { - - private static final long serialVersionUID = 7782935062930780231L; - - public TreeAlignException(String message) { - super(message); - } -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/TreeAlignLabelDistanceAsymmetric.java b/src2/fr/orsay/lri/varna/models/treealign/TreeAlignLabelDistanceAsymmetric.java deleted file mode 100644 index 91aff2f..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/TreeAlignLabelDistanceAsymmetric.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - -public interface TreeAlignLabelDistanceAsymmetric { - /** - * Returns the substitution cost between v1 and v2. - * We use the convention that a null reference is a blank, - * ie. f(x, null) is the cost of deleting x - * and f(null, x) is the cost of inserting x. - * We won't use f(null, null). - * We suppose f is such that: - * f(x,x) = 0 - * 0 <= f(x,y) < +infinity - * You may also want to have the triangle inequality, - * although the alignment algorithm does not require it: - * f(x,z) <= f(x,y) + f(y,z) - */ - public double f(ValueType1 x, ValueType2 y); -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/TreeAlignLabelDistanceSymmetric.java b/src2/fr/orsay/lri/varna/models/treealign/TreeAlignLabelDistanceSymmetric.java deleted file mode 100644 index b702bc0..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/TreeAlignLabelDistanceSymmetric.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - -/** - * Same as TreeAlignLabelDistanceAsymmetric, but elements on both - * trees are of the same type, and the function is symmetric, ie. - * f(x,y) = f(y,x) . - * - * @param - */ -public interface TreeAlignLabelDistanceSymmetric extends TreeAlignLabelDistanceAsymmetric { - -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/TreeAlignResult.java b/src2/fr/orsay/lri/varna/models/treealign/TreeAlignResult.java deleted file mode 100644 index f8ff988..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/TreeAlignResult.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; - - -/** - * The result of aligning a tree T1 with a tree T2. - * On the resulting tree, each node has a value - * of type AlignedNode. - * @author Raphael Champeimont - */ -public class TreeAlignResult { - private Tree> alignment; - private double distance; - - public Tree> getAlignment() { - return alignment; - } - public void setAlignment(Tree> alignment) { - this.alignment = alignment; - } - public double getDistance() { - return distance; - } - public void setDistance(double distance) { - this.distance = distance; - } - -} diff --git a/src2/fr/orsay/lri/varna/models/treealign/TreeGraphviz.java b/src2/fr/orsay/lri/varna/models/treealign/TreeGraphviz.java deleted file mode 100644 index be22782..0000000 --- a/src2/fr/orsay/lri/varna/models/treealign/TreeGraphviz.java +++ /dev/null @@ -1,114 +0,0 @@ -package fr.orsay.lri.varna.models.treealign; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; - - - -/** - * This class translates a Tree to a graphviz file. - * @author Raphael Champeimont - * - * @param the type of values in the tree - */ -public class TreeGraphviz { - - /** - * Generates a PostScript file using graphviz. - * The dot command must be available. - */ - public static void treeToGraphvizPostscript(Tree tree, String filename, String title) throws IOException { - // generate graphviz source - String graphvizSource = treeToGraphviz(tree, title); - - // open output file - BufferedWriter fbw; - fbw = new BufferedWriter(new FileWriter(filename)); - - // execute graphviz - Process proc = Runtime.getRuntime().exec("dot -Tps"); - BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); - BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream())); - BufferedReader bre = new BufferedReader(new InputStreamReader(proc.getErrorStream())); - bw.write(graphvizSource); - bw.close(); - { - String line = null; - while ((line = br.readLine()) != null) { - fbw.write(line + "\n"); - } - } - { - String line = null; - while ((line = bre.readLine()) != null) { - System.err.println(line); - } - } - - // wait for graphviz to end - try { - proc.waitFor(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - // close file - fbw.close(); - } - - /** - * Like treeToGraphvizPostscript(Tree,String,String) but with the title - * equal to the filename. - */ - public static void treeToGraphvizPostscript(Tree tree, String filename) throws IOException { - treeToGraphvizPostscript(tree, filename, filename); - } - - /** - * Creates a graphviz source file from a Tree. - * @param title the title of the graph - */ - public static void treeToGraphvizFile(Tree tree, String filename, String title) throws IOException { - BufferedWriter bw; - bw = new BufferedWriter(new FileWriter(filename)); - bw.write(treeToGraphviz(tree, filename)); - bw.close(); - } - - /** - * Like treeToGraphvizFile(Tree,String,String) but with the title - * equal to the filename. - */ - public static void treeToGraphvizFile(Tree tree, String filename) throws IOException { - treeToGraphvizFile(tree, filename, filename); - } - - /** - * Creates a graphviz source from a Tree. - * @param title the title of the graph - */ - public static String treeToGraphviz(Tree tree, String title) { - return "digraph \"" + title + "\" {\n" + subtreeToGraphviz(tree) + "}\n"; - } - - private static String subtreeToGraphviz(Tree tree) { - String s = ""; - String myId = tree.toGraphvizNodeId(); - - s += - "\"" - + myId - + "\" [label=\"" - + ((tree.getValue() != null) ? tree.getValue().toGraphvizNodeName() : "null") - + "\"]\n"; - for (Tree child: tree.getChildren()) { - s += "\"" + myId + "\" -> \"" + child.toGraphvizNodeId() + "\"\n"; - s += subtreeToGraphviz(child); - } - - return s; - } -} diff --git a/src2/fr/orsay/lri/varna/utils/RNAMLParser.java b/src2/fr/orsay/lri/varna/utils/RNAMLParser.java deleted file mode 100644 index d5f6746..0000000 --- a/src2/fr/orsay/lri/varna/utils/RNAMLParser.java +++ /dev/null @@ -1,651 +0,0 @@ -/* - 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.utils; - -import java.awt.Point; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Hashtable; -import java.util.List; -import java.util.Stack; -import java.util.Vector; - -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBP.Edge; -import fr.orsay.lri.varna.models.rna.ModeleBP.Stericity; - -public class RNAMLParser extends DefaultHandler { - public class HelixTemp { - public int pos5, pos3, length; - public String name; - - public HelixTemp(int pos5, int pos3, int length, String name) { - this.pos3 = pos3; - this.pos5 = pos5; - this.length = length; - this.name = name; - } - - public String toString() { - return ("[" + name + "," + pos5 + "," + pos3 + "," + length + "]"); - } - - } - - public class BPTemp { - public int pos5, pos3; - public String edge5, edge3, orientation; - - public BPTemp(int pos5, int pos3, String edge5, String edge3, - String orientation) { - if (edge3 == null) { - edge3 = "+"; - } - if (edge5 == null) { - edge5 = "+"; - } - if (orientation == null) { - orientation = "c"; - } - this.pos5 = pos5; - this.pos3 = pos3; - this.edge5 = edge5; - this.edge3 = edge3; - this.orientation = orientation; - } - - public ModeleBP createBPStyle(ModeleBase mb5, ModeleBase mb3) { - ModeleBP.Edge e5, e3; - @SuppressWarnings("unused") - boolean isCanonical = false; - if (edge5.equals("W")) { - e5 = ModeleBP.Edge.WC; - } else if (edge5.equals("H")) { - e5 = ModeleBP.Edge.HOOGSTEEN; - } else if (edge5.equals("S")) { - e5 = ModeleBP.Edge.SUGAR; - } else { - e5 = ModeleBP.Edge.WC; - } - - if (edge3.equals("W")) { - e3 = ModeleBP.Edge.WC; - } else if (edge3.equals("H")) { - e3 = ModeleBP.Edge.HOOGSTEEN; - } else if (edge3.equals("S")) { - e3 = ModeleBP.Edge.SUGAR; - } else { - e3 = ModeleBP.Edge.WC; - } - - if ((edge5.equals("+") && edge3.equals("+")) - || (edge5.equals("-") && edge3.equals("-"))) { - e3 = ModeleBP.Edge.WC; - e5 = ModeleBP.Edge.WC; - } - - ModeleBP.Stericity ster; - - if (orientation.equals("c")) { - ster = ModeleBP.Stericity.CIS; - } else if (orientation.equals("t")) { - ster = ModeleBP.Stericity.TRANS; - } else { - ster = ModeleBP.Stericity.CIS; - } - - return (new ModeleBP(mb5, mb3, e5, e3, ster)); - } - - public String toString() { - return ("[" + pos5 + "," + pos3 + "," + edge5 + "," + edge3 + "," - + orientation + "]"); - } - } - - public class RNATmp { - public ArrayList _sequence = new ArrayList(); - public Vector _sequenceIDs = new Vector(); - public Vector _structure = new Vector(); - public Vector _helices = new Vector(); - - public ArrayList getSequence() { - return _sequence; - } - - public Vector getStructure() { - return _structure; - } - }; - - private Hashtable _molecules = new Hashtable(); - - private boolean _inSequenceIDs, _inLength, _inSequence, _inHelix, - _inStrAnnotation, _inBP, _inBP5, _inBP3, _inEdge5, _inEdge3, - _inPosition, _inBondOrientation, _inMolecule; - private StringBuffer _buffer; - private String _currentModel = ""; - private int _id5, _id3, _length; - String _edge5, _edge3, _orientation, _helixID; - - public RNAMLParser() { - super(); - _inSequenceIDs = false; - _inSequence = false; - _inStrAnnotation = false; - _inBP = false; - _inBP5 = false; - _inBP3 = false; - _inPosition = false; - _inEdge5 = false; - _inEdge3 = false; - _inBondOrientation = false; - _inHelix = false; - _inMolecule = false; - } - - public InputSource createSourceFromURL(String path) { - URL url = null; - try { - url = new URL(path); - URLConnection connexion = url.openConnection(); - connexion.setUseCaches(false); - InputStream r = connexion.getInputStream(); - InputStreamReader inr = new InputStreamReader(r); - return new InputSource(inr); - } catch (Exception e) { - e.printStackTrace(); - } - return new InputSource(new StringReader("")); - } - - public InputSource resolveEntity(String publicId, String systemId) { - // System.out.println("[crade]"); - if (systemId.endsWith("rnaml.dtd")) - { - String resourceName = "/rnaml.dtd"; - URL url = ClassLoader.getSystemResource(resourceName); - if (url!=null) - { - try { - InputStream stream = url.openStream(); - if (stream != null) - { - return new InputSource(stream ); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return new InputSource(new StringReader("")); - } - - public void startElement(String uri, String localName, String qName, - Attributes attributes) throws SAXException { - if (qName.equals("numbering-table")) { - _inSequenceIDs = true; - _buffer = new StringBuffer(); - } else if (qName.equals("helix")) { - _inHelix = true; - _buffer = new StringBuffer(); - _helixID = attributes.getValue("id"); - } else if (qName.equals("seq-data")) { - _inSequence = true; - _buffer = new StringBuffer(); - } else if (qName.equals("length")) { - _inLength = true; - _buffer = new StringBuffer(); - } else if (qName.equals("str-annotation")) { - _inStrAnnotation = true; - } else if (qName.equals("base-pair")) { - _inBP = true; - } else if (qName.equals("base-id-5p")) { - if (_inBP || _inHelix) { - _inBP5 = true; - } - } else if (qName.equals("base-id-3p")) { - if (_inBP || _inHelix) { - _inBP3 = true; - } - } else if (qName.equals("edge-5p")) { - _inEdge5 = true; - _buffer = new StringBuffer(); - } else if (qName.equals("edge-3p")) { - _inEdge3 = true; - _buffer = new StringBuffer(); - } else if (qName.equals("position")) { - _inPosition = true; - _buffer = new StringBuffer(); - } else if (qName.equals("bond-orientation")) { - _inBondOrientation = true; - _buffer = new StringBuffer(); - } else if (qName.equals("molecule")) { - _inMolecule = true; - String id = (attributes.getValue("id")); - // System.err.println("Molecule#"+id); - _molecules.put(id, new RNATmp()); - _currentModel = id; - } else { - // We don't care too much about the rest ... - } - } - - public void endElement(String uri, String localName, String qName) - throws SAXException { - if (qName.equals("numbering-table")) { - _inSequenceIDs = false; - String content = _buffer.toString(); - content = content.trim(); - String[] tokens = content.split("\\s+"); - Vector results = new Vector(); - for (int i = 0; i < tokens.length; i++) { - try { - results.add(new Integer(Integer.parseInt(tokens[i]))); - } catch (NumberFormatException e) { - e.printStackTrace(); - } - } - _molecules.get(_currentModel)._sequenceIDs = results; - _buffer = null; - } else if (qName.equals("seq-data")) { - _inSequence = false; - String content = _buffer.toString(); - content = content.trim(); - String[] tokens = content.split("\\s+"); - ArrayList results = new ArrayList(); - for (int i = 0; i < tokens.length; i++) { - for (int j = 0; j < tokens[i].length(); j++) - results.add("" + tokens[i].charAt(j)); - } - // System.err.println(" Seq: "+results); - _molecules.get(_currentModel)._sequence = results; - _buffer = null; - } else if (qName.equals("bond-orientation")) { - _inBondOrientation = false; - String content = _buffer.toString(); - content = content.trim(); - _orientation = content; - _buffer = null; - } else if (qName.equals("str-annotation")) { - _inStrAnnotation = false; - } else if (qName.equals("base-pair")) { - if (_inMolecule) { - _inBP = false; - BPTemp bp = new BPTemp(_id5, _id3, _edge5, _edge3, _orientation); - _molecules.get(_currentModel)._structure.add(bp); - // System.err.println(" "+bp); - } - } else if (qName.equals("helix")) { - _inHelix = false; - if (_inMolecule) { - HelixTemp h = new HelixTemp(_id5, _id3, _length, _helixID); - _molecules.get(_currentModel)._helices.add(h); - } - } else if (qName.equals("base-id-5p")) { - _inBP5 = false; - } else if (qName.equals("base-id-3p")) { - _inBP3 = false; - } else if (qName.equals("length")) { - _inLength = false; - String content = _buffer.toString(); - content = content.trim(); - _length = Integer.parseInt(content); - _buffer = null; - } else if (qName.equals("position")) { - String content = _buffer.toString(); - content = content.trim(); - int pos = Integer.parseInt(content); - if (_inBP5) { - _id5 = pos; - } - if (_inBP3) { - _id3 = pos; - } - _buffer = null; - } else if (qName.equals("edge-5p")) { - _inEdge5 = false; - String content = _buffer.toString(); - content = content.trim(); - _edge5 = content; - _buffer = null; - } else if (qName.equals("edge-3p")) { - _inEdge3 = false; - String content = _buffer.toString(); - content = content.trim(); - _edge3 = content; - _buffer = null; - } else if (qName.equals("molecule")) { - _inMolecule = false; - } else { - // We don't care too much about the rest ... - } - } - - public void characters(char[] ch, int start, int length) - throws SAXException { - String lecture = new String(ch, start, length); - if (_buffer != null) - _buffer.append(lecture); - } - - public void startDocument() throws SAXException { - } - - public void endDocument() throws SAXException { - postProcess(); - } - - // Discarding stacking interactions... - private void discardStacking() { - Vector result = new Vector(); - for (int i = 0; i < _molecules.get(_currentModel)._structure.size(); i++) { - BPTemp bp = _molecules.get(_currentModel)._structure.get(i); - if (bp.orientation.equals("c") || bp.orientation.equals("t")) { - result.add(bp); - } - } - _molecules.get(_currentModel)._structure = result; - } - - public static boolean isSelfCrossing(int[] str) { - Stack intervals = new Stack(); - intervals.add(new Point(0, str.length - 1)); - while (!intervals.empty()) { - Point p = intervals.pop(); - if (p.x <= p.y) { - if (str[p.x] == -1) { - intervals.push(new Point(p.x + 1, p.y)); - } else { - int i = p.x; - int j = p.y; - int k = str[i]; - if ((k <= i) || (k > j)) { - return true; - } else { - intervals.push(new Point(i + 1, k - 1)); - intervals.push(new Point(k + 1, j)); - } - } - } - } - return false; - } - - @SuppressWarnings("unused") - private void debugPrintArray(Object[] str) { - StringBuffer s = new StringBuffer("["); - for (int i = 0; i < str.length; i++) { - if (i != 0) { - s.append(","); - } - s.append(str[i]); - - } - s.append("]"); - System.out.println(s.toString()); - } - - /** - * Computes and returns a maximal planar subset of the current structure. - * - * @param str - * A sequence of base-pairing positions - * @return A sequence of non-crossing base-pairing positions - */ - - public static int[] planarize(int[] str) { - if (!isSelfCrossing(str)) { - return str; - } - - int length = str.length; - - int[] result = new int[length]; - for (int i = 0; i < result.length; i++) { - result[i] = -1; - } - - short[][] tab = new short[length][length]; - short[][] backtrack = new short[length][length]; - int theta = 3; - - for (int i = 0; i < result.length; i++) { - for (int j = i; j < Math.min(i + theta, result.length); j++) { - tab[i][j] = 0; - backtrack[i][j] = -1; - } - } - for (int n = theta; n < length; n++) { - for (int i = 0; i < length - n; i++) { - int j = i + n; - tab[i][j] = tab[i + 1][j]; - backtrack[i][j] = -1; - int k = str[i]; - if ((k != -1) && (k <= j) && (i < k)) { - int tmp = 1; - if (i + 1 <= k - 1) { - tmp += tab[i + 1][k - 1]; - } - if (k + 1 <= j) { - tmp += tab[k + 1][j]; - } - if (tmp > tab[i][j]) { - tab[i][j] = (short) tmp; - backtrack[i][j] = (short) k; - } - } - } - } - Stack intervals = new Stack(); - intervals.add(new Point(0, length - 1)); - while (!intervals.empty()) { - Point p = intervals.pop(); - if (p.x <= p.y) { - if (backtrack[p.x][p.y] == -1) { - result[p.x] = -1; - intervals.push(new Point(p.x + 1, p.y)); - } else { - int i = p.x; - int j = p.y; - int k = backtrack[p.x][p.y]; - result[i] = k; - result[k] = i; - intervals.push(new Point(i + 1, k - 1)); - intervals.push(new Point(k + 1, j)); - } - } - } - return result; - } - - public static void planarize(ArrayList input, - ArrayList planar, ArrayList others, int length) { - // System.err.println("Planarize: Length:"+length); - Hashtable> index2BPs = new Hashtable>(); - for (ModeleBP msbp : input) { - int i = msbp.getPartner5().getIndex(); - if (!index2BPs.containsKey(i)) { - index2BPs.put(i, new ArrayList()); - } - index2BPs.get(i).add(msbp); - } - // System.err.println(index2BPs); - - short[][] tab = new short[length][length]; - short[][] backtrack = new short[length][length]; - int theta = 3; - - for (int i = 0; i < length; i++) { - for (int j = i; j < Math.min(i + theta, length); j++) { - tab[i][j] = 0; - backtrack[i][j] = -1; - } - } - for (int n = theta; n < length; n++) { - for (int i = 0; i < length - n; i++) { - int j = i + n; - tab[i][j] = tab[i + 1][j]; - backtrack[i][j] = -1; - if (index2BPs.containsKey(i)) { - ArrayList vi = index2BPs.get(i); - // System.err.print("."); - for (int numBP = 0; numBP < vi.size(); numBP++) { - ModeleBP mb = vi.get(numBP); - int k = mb.getPartner3().getIndex(); - if ((k != -1) && (k <= j) && (i < k)) { - int tmp = 1; - if (i + 1 <= k - 1) { - tmp += tab[i + 1][k - 1]; - } - if (k + 1 <= j) { - tmp += tab[k + 1][j]; - } - if (tmp > tab[i][j]) { - tab[i][j] = (short) tmp; - backtrack[i][j] = (short) numBP; - } - } - } - } - } - } - // System.err.println("DP table: "+tab[0][length-1]); - - // Backtracking - Stack intervals = new Stack(); - intervals.add(new Point(0, length - 1)); - while (!intervals.empty()) { - Point p = intervals.pop(); - if (p.x <= p.y) { - if (backtrack[p.x][p.y] == -1) { - intervals.push(new Point(p.x + 1, p.y)); - } else { - int i = p.x; - int j = p.y; - int nb = backtrack[p.x][p.y]; - ModeleBP mb = index2BPs.get(i).get(nb); - int k = mb.getPartner3().getIndex(); - planar.add(mb); - intervals.push(new Point(i + 1, k - 1)); - intervals.push(new Point(k + 1, j)); - } - } - } - - // Remaining base pairs - for (int i : index2BPs.keySet()) { - ArrayList vi = index2BPs.get(i); - for (ModeleBP mb : vi) { - if (!planar.contains(mb)) { - others.add(mb); - } - } - } - } - - private void postProcess() { - for (RNATmp r : _molecules.values()) { - // First, check if base numbers were specified - if (r._sequenceIDs.size() == 0) { - Vector results = new Vector(); - for (int i = 0; i < r._sequence.size(); i++) { - results.add(new Integer(i + 1)); - } - r._sequenceIDs = results; - } - // System.err.println("IDs: "+_sequenceIDs); - // System.err.println("Before remapping: "+_structure); - - // Then, build inverse mapping ID => index - Hashtable ID2Index = new Hashtable(); - for (int i = 0; i < r._sequenceIDs.size(); i++) { - ID2Index.put(r._sequenceIDs.get(i), i); - } - - // Translate BP coordinates into indices - for (BPTemp bp : r._structure) { - bp.pos3 = bp.pos3 - 1; - bp.pos5 = bp.pos5 - 1; - } - // System.err.println("After remapping: "+_structure); - - discardStacking(); - // System.err.println(" Discard stacking (length="+r._sequence.size()+") => "+r._structure); - - // Eliminate redundancy - Hashtable> index2BPs = new Hashtable>(); - for (BPTemp msbp : r._structure) { - int i = msbp.pos5; - if (!index2BPs.containsKey(i)) { - index2BPs.put(i, new Hashtable()); - } - if (!index2BPs.get(i).contains(msbp.pos3)) { - index2BPs.get(i).put(msbp.pos3,msbp); - } - } - - // Adding helices... - for (int i = 0; i < r._helices.size(); i++) { - HelixTemp h = r._helices.get(i); - for (int j = 0; j < h.length; j++) { - // System.err.println("Looking for residues: "+(h.pos5+j-1)+" and "+(h.pos3-j-1)); - int a = (h.pos5 + j - 1); - int b = (h.pos3 - j - 1); - BPTemp bp = new BPTemp(a, (b), "+", "+", "c"); - if (!index2BPs.containsKey(a)) { - index2BPs.put(a, new Hashtable()); - } - if (!index2BPs.get(a).contains(b)) { - index2BPs.get(a).put(b,bp); - } - } - } - - Vector newStructure = new Vector(); - for (int i : index2BPs.keySet()) { - for (int j : index2BPs.get(i).keySet()) { - BPTemp bp = index2BPs.get(i).get(j); - newStructure.add(bp); - } - } - r._structure = newStructure; - - // System.err.println("After Helices => "+_structure); - - - // System.err.println("After Postprocess => "+_structure); - } - } - - public ArrayList getMolecules() { - return new ArrayList(_molecules.values()); - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/utils/TranslateFormatRNaseP.java b/src2/fr/orsay/lri/varna/utils/TranslateFormatRNaseP.java deleted file mode 100644 index 7c999e5..0000000 --- a/src2/fr/orsay/lri/varna/utils/TranslateFormatRNaseP.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * File written by Raphael Champeimont - * UMR 7238 Genomique des Microorganismes - */ -package fr.orsay.lri.varna.utils; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class TranslateFormatRNaseP { - public static void main(String[] args) throws Exception { - File templatesDir = new File(new File(System.getProperty("user.dir")), "templates"); - File infile = new File(new File(templatesDir, "RNaseP_bact_a"), "a_bacterial_rnas.gb"); - File outfile = new File(new File(templatesDir, "RNaseP_bact_a"), "alignment.fasta"); - - BufferedReader inbuf = new BufferedReader(new FileReader(infile)); - String line = inbuf.readLine(); - String seqname; - List seqnames = new ArrayList(); - List sequences = new ArrayList(); - while (line != null) { - if (line.length() != 0) { - if (line.startsWith("LOCUS")) { - String parts[] = line.split("\\s+"); - seqname = parts[1]; - seqnames.add(seqname); - sequences.add(""); - } - if (line.startsWith(" ")) { - String parts[] = line.split("\\s+"); - for (int i=2; i" + seqnames.get(i) + "\n"); - outbuf.write(sequences.get(i) + "\n"); - } - outbuf.close(); - } -} diff --git a/src2/fr/orsay/lri/varna/utils/VARNASessionParser.java b/src2/fr/orsay/lri/varna/utils/VARNASessionParser.java deleted file mode 100644 index 7eb510a..0000000 --- a/src2/fr/orsay/lri/varna/utils/VARNASessionParser.java +++ /dev/null @@ -1,481 +0,0 @@ -/* - 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.utils; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Point; -import java.awt.geom.Point2D; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.net.URL; -import java.net.URLConnection; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Hashtable; -import java.util.List; -import java.util.Stack; -import java.util.TreeSet; -import java.util.Vector; - -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation.ChemProbAnnotationType; -import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; -import fr.orsay.lri.varna.models.annotations.TextAnnotation.AnchorType; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.ModeleBP.Edge; -import fr.orsay.lri.varna.models.rna.ModeleBP.Stericity; -import fr.orsay.lri.varna.models.rna.ModeleBPStyle; -import fr.orsay.lri.varna.models.rna.ModeleBackbone; -import fr.orsay.lri.varna.models.rna.ModeleBackboneElement; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; -import fr.orsay.lri.varna.models.rna.ModeleBasesComparison; -import fr.orsay.lri.varna.models.rna.ModelBaseStyle; -import fr.orsay.lri.varna.models.rna.RNA; -import fr.orsay.lri.varna.models.rna.VARNAPoint; - -public class VARNASessionParser extends DefaultHandler { - - StringBuffer _buffer = null; - ModeleBaseNucleotide mbn = null; - ModeleBasesComparison mbc = null; - ModeleBP mbp = null; - ModeleBPStyle mbps = null; - ModelBaseStyle msb = null; - TextAnnotation ta = null; - ModeleBackbone backbone = null; - HighlightRegionAnnotation hra = null; - RNA rna = null; - Font f = null; - VARNAConfig config = null; - - public VARNASessionParser() { - super(); - } - - public InputSource createSourceFromURL(String path) - { - URL url = null; - try { - url = new URL(path); - URLConnection connexion = url.openConnection(); - connexion.setUseCaches(false); - InputStream r = connexion.getInputStream(); - InputStreamReader inr = new InputStreamReader(r); - return new InputSource(inr); - } - catch(Exception e) - { - e.printStackTrace(); - } - return new InputSource(new StringReader("")); - } - - public InputSource resolveEntity(String publicId, String systemId) { - return new InputSource(new StringReader("")); - } - - - private TreeSet _context = new TreeSet(); - - private void addToContext(String s) - { - _context.add(s); - } - - private void removeFromContext(String s) - { - _context.remove(s); - } - - private boolean contextContains(String s) - { - return _context.contains(s); - } - - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if (qName.equals(VARNAPanel.XML_ELEMENT_NAME)) { - } - else if (qName.equals(VARNAConfig.XML_ELEMENT_NAME)){ - config = new VARNAConfig(); - config.loadFromXMLAttributes(attributes); - } - else if (qName.equals(RNA.XML_ELEMENT_NAME)){ - rna = new RNA(); - int mode = Integer.parseInt(attributes.getValue(RNA.XML_VAR_DRAWN_MODE_NAME)); - rna.setDrawMode(mode); - } - else if (qName.equals(ModeleBackbone.XML_ELEMENT_NAME)){ - backbone = new ModeleBackbone(); - rna.setBackbone(backbone); - } - else if (qName.equals(ModeleBackboneElement.XML_ELEMENT_NAME)){ - if (backbone!=null){ - int index = Integer.parseInt(attributes.getValue(ModeleBackboneElement.XML_VAR_INDEX_NAME)); - ModeleBackboneElement.BackboneType type = ModeleBackboneElement.BackboneType.getType( - (attributes.getValue(ModeleBackboneElement.XML_VAR_TYPE_NAME))); - Color c = null; - if (type == ModeleBackboneElement.BackboneType.CUSTOM_COLOR) - { - c = Color.decode(attributes.getValue(TextAnnotation.XML_VAR_COLOR_NAME)); - backbone.addElement(new ModeleBackboneElement(index, c)); - } - else - { - backbone.addElement(new ModeleBackboneElement(index, type)); - } - } - } - else if (qName.equals(ModeleBackbone.XML_ELEMENT_NAME)){ - backbone = new ModeleBackbone(); - } - else if (qName.equals(ModeleBaseNucleotide.XML_ELEMENT_NAME)){ - if (rna!=null){ - mbn = new ModeleBaseNucleotide(rna.getSize()); - if (mbn.getIndex()!=Integer.parseInt(attributes.getValue(ModeleBase.XML_VAR_INDEX_NAME))) - throw new SAXException("Index mismatch for Base"); - mbn.setBaseNumber(Integer.parseInt(attributes.getValue(ModeleBase.XML_VAR_NUMBER_NAME))); - mbn.setLabel(attributes.getValue(ModeleBase.XML_VAR_LABEL_NAME)); - mbn.setColorie(Boolean.parseBoolean(attributes.getValue(ModeleBase.XML_VAR_CUSTOM_DRAWN_NAME))); - mbn.setValue(Double.parseDouble(attributes.getValue(ModeleBase.XML_VAR_VALUE_NAME))); - rna.addBase(mbn); - } - } - else if (qName.equals(XMLUtils.XML_FONT_ELEMENT_NAME)){ - f = XMLUtils.getFont(qName,attributes); - if (contextContains(TextAnnotation.XML_ELEMENT_NAME)) - { - ta.setFont(f); - f=null; - } - else if (contextContains(VARNAConfig.XML_ELEMENT_NAME)) - { - String role = attributes.getValue(XMLUtils.XML_ROLE_NAME); - if (role.equals(VARNAConfig.XML_VAR_TITLE_FONT)) - { - config._titleFont = XMLUtils.getFont(qName, attributes); - } - else if (role.equals(VARNAConfig.XML_VAR_NUMBERS_FONT)) - { - config._numbersFont = XMLUtils.getFont(qName, attributes); - } - else if (role.equals(VARNAConfig.XML_VAR_FONT_BASES)) - { - config._fontBasesGeneral = XMLUtils.getFont(qName, attributes); - } - } - } - else if (qName.equals(ModeleBaseNucleotide.XML_VAR_CONTENT_NAME)){ - _buffer = new StringBuffer(); - } - else if (qName.equals(ModeleBasesComparison.XML_VAR_FIRST_CONTENT_NAME)){ - _buffer = new StringBuffer(); - } - else if (qName.equals(ModeleBasesComparison.XML_VAR_SECOND_CONTENT_NAME)){ - _buffer = new StringBuffer(); - } - else if (qName.equals(ModeleBasesComparison.XML_ELEMENT_NAME)){ - if (rna!=null){ - mbc = new ModeleBasesComparison(rna.getSize()); - if (mbc.getIndex()!=Integer.parseInt(attributes.getValue(ModeleBase.XML_VAR_INDEX_NAME))) - throw new SAXException("Index mismatch for Base"); - mbc.setBaseNumber(Integer.parseInt(attributes.getValue(ModeleBase.XML_VAR_NUMBER_NAME))); - mbc.setLabel(attributes.getValue(ModeleBase.XML_VAR_LABEL_NAME)); - mbc.set_appartenance(Integer.parseInt(attributes.getValue(ModeleBasesComparison.XML_VAR_MEMBERSHIP_NAME))); - mbc.setColorie(Boolean.parseBoolean(attributes.getValue(ModeleBase.XML_VAR_CUSTOM_DRAWN_NAME))); - mbc.setValue(Double.parseDouble(attributes.getValue(ModeleBase.XML_VAR_VALUE_NAME))); - rna.addBase(mbc); - } - } - else if (qName.equals(RNA.XML_VAR_NAME_NAME)) - { - if (rna!=null){ - _buffer = new StringBuffer(); - } - } - else if (qName.equals(ModeleBP.XML_ELEMENT_NAME)) - { - Edge e5 = Edge.valueOf(attributes.getValue(ModeleBP.XML_VAR_EDGE5_NAME)); - Edge e3 = Edge.valueOf(attributes.getValue(ModeleBP.XML_VAR_EDGE3_NAME)); - Stericity s = Stericity.valueOf(attributes.getValue(ModeleBP.XML_VAR_STERICITY_NAME)); - int i5 = Integer.parseInt(attributes.getValue(ModeleBP.XML_VAR_PARTNER5_NAME)); - int i3 = Integer.parseInt(attributes.getValue(ModeleBP.XML_VAR_PARTNER3_NAME)); - boolean inSecStr = Boolean.parseBoolean(attributes.getValue(ModeleBP.XML_VAR_SEC_STR_NAME)); - mbp = new ModeleBP(rna.getBaseAt(i5),rna.getBaseAt(i3),e5,e3,s); - if (inSecStr) - rna.addBP(i5,i3,mbp); - else - rna.addBPAux(i5,i3,mbp); - } - else if (qName.equals(ChemProbAnnotation.XML_ELEMENT_NAME)) - { - int i5 = Integer.parseInt(attributes.getValue(ChemProbAnnotation.XML_VAR_INDEX5_NAME)); - int i3 = Integer.parseInt(attributes.getValue(ChemProbAnnotation.XML_VAR_INDEX3_NAME)); - ChemProbAnnotation cpa = new ChemProbAnnotation(rna.getBaseAt(i5),rna.getBaseAt(i3)); - cpa.setColor(Color.decode(attributes.getValue(ChemProbAnnotation.XML_VAR_COLOR_NAME))); - cpa.setIntensity(Double.parseDouble(attributes.getValue(ChemProbAnnotation.XML_VAR_INTENSITY_NAME))); - cpa.setType(ChemProbAnnotationType.valueOf(attributes.getValue(ChemProbAnnotation.XML_VAR_TYPE_NAME))); - cpa.setOut(Boolean.parseBoolean(attributes.getValue(ChemProbAnnotation.XML_VAR_OUTWARD_NAME))); - rna.addChemProbAnnotation(cpa); - } - else if (qName.equals(TextAnnotation.XML_VAR_TEXT_NAME)){ - _buffer = new StringBuffer(); - } - else if (qName.equals(VARNAConfig.XML_VAR_TITLE)){ - _buffer = new StringBuffer(); - } - else if (qName.equals(VARNAConfig.XML_VAR_CM_CAPTION)){ - _buffer = new StringBuffer(); - } - else if (qName.equals(TextAnnotation.XML_ELEMENT_NAME)) - { - AnchorType t = AnchorType.valueOf(attributes.getValue(TextAnnotation.XML_VAR_TYPE_NAME)); - ta = new TextAnnotation(""); - ta.setColor(Color.decode(attributes.getValue(TextAnnotation.XML_VAR_COLOR_NAME))); - ta.setAngleInDegres(Double.parseDouble(attributes.getValue(TextAnnotation.XML_VAR_ANGLE_NAME))); - ta.setType(t); - } - else if (qName.equals(HighlightRegionAnnotation.XML_ELEMENT_NAME)) - { - hra = new HighlightRegionAnnotation(); - rna.addHighlightRegion(hra); - hra.setOutlineColor(Color.decode(attributes.getValue(HighlightRegionAnnotation.XML_VAR_OUTLINE_NAME))); - hra.setFillColor(Color.decode(attributes.getValue(HighlightRegionAnnotation.XML_VAR_FILL_NAME))); - hra.setRadius(Double.parseDouble(attributes.getValue(HighlightRegionAnnotation.XML_VAR_RADIUS_NAME))); - } - else if (qName.equals(XMLUtils.XML_BASELIST_ELEMENT_NAME)) - { - _buffer = new StringBuffer(); - } - else if (qName.equals(VARNAPoint.XML_ELEMENT_NAME)) - { - Point2D.Double vp = new Point2D.Double(); - vp.x = Double.parseDouble(attributes.getValue(VARNAPoint.XML_VAR_X_NAME)); - vp.y = Double.parseDouble(attributes.getValue(VARNAPoint.XML_VAR_Y_NAME)); - String role = attributes.getValue(VARNAPoint.XML_VAR_ROLE_NAME); - if (contextContains(ModeleBaseNucleotide.XML_ELEMENT_NAME)) - { - if (role != null) - { - if (role.equals(ModeleBase.XML_VAR_POSITION_NAME)) - { - if (mbn!=null) - { mbn.setCoords(vp); } - else throw new SAXException("No Base model for this position Point"); - } - else if (role.equals(ModeleBase.XML_VAR_CENTER_NAME)) - { - if (mbn!=null) - { mbn.setCenter(vp); } - else throw new SAXException("No Base model for this center Point"); - } - - } - } - if (contextContains(ModeleBasesComparison.XML_ELEMENT_NAME)) - { - if (role != null) - { - if (role.equals(ModeleBase.XML_VAR_POSITION_NAME)) - { - if (mbc!=null) - { mbc.setCoords(vp); } - else throw new SAXException("No Base model for this position Point"); - } - else if (role.equals(ModeleBase.XML_VAR_CENTER_NAME)) - { - if (mbc!=null) - { mbc.setCenter(vp); } - else throw new SAXException("No Base model for this center Point"); - } - } - } - if (contextContains(TextAnnotation.XML_ELEMENT_NAME)) - { - if (ta!=null) - ta.setAncrage(vp.x,vp.y); - else throw new SAXException("No TextAnnotation model for this Point"); - } - } - else if (qName.equals(ModelBaseStyle.XML_ELEMENT_NAME)) - { - msb = new ModelBaseStyle(); - msb.setBaseOutlineColor(Color.decode(attributes.getValue(ModelBaseStyle.XML_VAR_OUTLINE_NAME))); - msb.setBaseInnerColor(Color.decode(attributes.getValue(ModelBaseStyle.XML_VAR_INNER_NAME))); - msb.setBaseNameColor(Color.decode(attributes.getValue(ModelBaseStyle.XML_VAR_NAME_NAME))); - msb.setBaseNumberColor(Color.decode(attributes.getValue(ModelBaseStyle.XML_VAR_NUMBER_NAME))); - if (mbn!=null) - { mbn.setStyleBase(msb); } - else if (mbc!=null) - { mbc.setStyleBase(msb); } - msb = null; - } - else if (qName.equals(ModeleBPStyle.XML_ELEMENT_NAME)) - { - mbps = new ModeleBPStyle(); - boolean customColor = Boolean.parseBoolean(attributes.getValue(ModeleBPStyle.XML_VAR_CUSTOM_STYLED_NAME)); - if (customColor) - mbps.setCustomColor(Color.decode(attributes.getValue(ModeleBPStyle.XML_VAR_COLOR_NAME))); - mbps.setThickness(Double.parseDouble(attributes.getValue(ModeleBPStyle.XML_VAR_THICKNESS_NAME))); - mbps.setBent(Double.parseDouble(attributes.getValue(ModeleBPStyle.XML_VAR_BENT_NAME))); - if (mbp!=null) - { mbp.setStyle(mbps); } - mbps = null; - } - addToContext(qName); - } - - - - public void endElement(String uri, String localName, String qName) - throws SAXException { - if (qName.equals(ModeleBaseNucleotide.XML_VAR_CONTENT_NAME)){ - if (_buffer==null){ - throw new SAXException("Invalid location for tag "+ModeleBaseNucleotide.XML_VAR_CONTENT_NAME); - } - if (mbn==null){ - throw new SAXException("Invalid location for tag "+ModeleBaseNucleotide.XML_VAR_CONTENT_NAME); - } - String val = _buffer.toString(); - mbn.setContent(val); - } - else if (qName.equals(ModeleBasesComparison.XML_VAR_FIRST_CONTENT_NAME)){ - if (_buffer==null){ - throw new SAXException("Invalid location for tag "+ModeleBaseNucleotide.XML_VAR_CONTENT_NAME); - } - if (mbc==null){ - throw new SAXException("Invalid location for tag "+ModeleBaseNucleotide.XML_VAR_CONTENT_NAME); - } - String val = _buffer.toString(); - mbc.setBase1(val.trim().charAt(0)); - } - else if (qName.equals(ModeleBasesComparison.XML_VAR_SECOND_CONTENT_NAME)){ - if (_buffer==null){ - throw new SAXException("Invalid location for tag "+ModeleBaseNucleotide.XML_VAR_CONTENT_NAME); - } - if (mbc==null){ - throw new SAXException("Invalid location for tag "+ModeleBaseNucleotide.XML_VAR_CONTENT_NAME); - } - String val = _buffer.toString(); - mbc.setBase2(val.trim().charAt(0)); - } - else if (qName.equals(ModeleBaseNucleotide.XML_ELEMENT_NAME)){ - mbn = null; - } - else if (qName.equals(ModeleBP.XML_ELEMENT_NAME)) - { - mbp = null; - } - else if (qName.equals(HighlightRegionAnnotation.XML_ELEMENT_NAME)) - { - hra = null; - } - else if (qName.equals(TextAnnotation.XML_VAR_TEXT_NAME)) - { - String text = _buffer.toString(); - ta.setText(text); - _buffer = null; - } - else if (qName.equals(RNA.XML_VAR_NAME_NAME)) - { - if (rna!=null){ - rna.setName(_buffer.toString()); - _buffer = null; - } - } - else if (qName.equals(VARNAConfig.XML_VAR_CM_CAPTION)){ - config._colorMapCaption = _buffer.toString(); - _buffer = null; - } - - else if (qName.equals(TextAnnotation.XML_ELEMENT_NAME)) - { - rna.addAnnotation(ta); - ta = null; - } - else if (qName.equals(XMLUtils.XML_BASELIST_ELEMENT_NAME)) - { - String result = _buffer.toString(); - ArrayList al = XMLUtils.toModeleBaseArray(result, rna); - if (contextContains(TextAnnotation.XML_ELEMENT_NAME)) - { - switch(ta.getType()) - { - case POSITION: - break; - case BASE: - ta.setAncrage(al.get(0)); - break; - case HELIX: - case LOOP: - try { - ta.setAncrage(al, ta.getType()); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - break; - default: - } - } - if (contextContains(HighlightRegionAnnotation.XML_ELEMENT_NAME)) - { - hra.setBases(al); - } - _buffer = null; - } - - removeFromContext(qName); - } - - public void characters(char[] ch, int start, int length) - throws SAXException { - String lecture = new String(ch, start, length); - if (_buffer != null) - _buffer.append(lecture); - } - - public void startDocument() throws SAXException { - } - - public void endDocument() throws SAXException { - } - - public RNA getRNA() - { - return rna; - } - - public VARNAConfig getVARNAConfig() - { - return config; - } - -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/utils/XMLUtils.java b/src2/fr/orsay/lri/varna/utils/XMLUtils.java deleted file mode 100644 index e3acefc..0000000 --- a/src2/fr/orsay/lri/varna/utils/XMLUtils.java +++ /dev/null @@ -1,148 +0,0 @@ -package fr.orsay.lri.varna.utils; - -import java.awt.Color; -import java.awt.Font; -import java.util.ArrayList; -import java.util.Formatter; - -import javax.xml.transform.sax.TransformerHandler; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; - -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.RNA; - -public class XMLUtils { - public static String toHTMLNotation(Color c) - { - Formatter f = new Formatter(); - f.format("#%02X%02X%02X", c.getRed(),c.getGreen(),c.getBlue()); - return f.toString(); - } - - public static void toXML(TransformerHandler hd, Font f) throws SAXException - { - toXML(hd, f,""); - } - - - public static String XML_BASELIST_ELEMENT_NAME = "baselist"; - public static String XML_FONT_ELEMENT_NAME = "font"; - public static String XML_ROLE_NAME = "role"; - public static String XML_NAME_NAME = "name"; - public static String XML_FAMILY_NAME = "family"; - public static String XML_STYLE_NAME = "style"; - public static String XML_SIZE_NAME = "size"; - - public static void toXML(TransformerHandler hd, Font f, String role) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - if (!role.equals("")) - atts.addAttribute("","",XML_ROLE_NAME,"CDATA",""+role); - atts.addAttribute("","",XML_NAME_NAME,"CDATA",""+f.getName()); - //atts.addAttribute("","",XML_FAMILY_NAME,"CDATA",""+f.getFamily()); - atts.addAttribute("","",XML_STYLE_NAME,"CDATA",""+f.getStyle()); - atts.addAttribute("","",XML_SIZE_NAME,"CDATA",""+f.getSize2D()); - hd.startElement("","",XML_FONT_ELEMENT_NAME,atts); - hd.endElement("","",XML_FONT_ELEMENT_NAME); - } - - public static Font getFont(String qName, Attributes attributes) - { - if (qName.equals(XMLUtils.XML_FONT_ELEMENT_NAME)){ - int style = Integer.parseInt(attributes.getValue(XMLUtils.XML_STYLE_NAME)); - String name = (attributes.getValue(XMLUtils.XML_NAME_NAME)); - double size = Double.parseDouble(attributes.getValue(XMLUtils.XML_SIZE_NAME)); - Font f = new Font(name, style, (int)size); - return f.deriveFont((float)size); - } - return null; - } - - - public static void toXML(TransformerHandler hd, ModeleBase mb) throws SAXException - { - ArrayList m = new ArrayList(); - m.add(mb); - toXML(hd, m); - } - - - public static void toXML(TransformerHandler hd, ArrayList m) throws SAXException - { - AttributesImpl atts = new AttributesImpl(); - String result = ""; - for (ModeleBase mb: m) - { - if (!result.equals("")) - result+= ","; - result += mb.getIndex(); - - } - hd.startElement("","",XML_BASELIST_ELEMENT_NAME,atts); - exportCDATAString(hd, result); - hd.endElement("","",XML_BASELIST_ELEMENT_NAME); - } - - public static ArrayList toModeleBaseArray(String baselist, RNA rna) - { - ArrayList result = new ArrayList(); - String[] data = baselist.trim().split(","); - for(int i=0;i 0) - return NO_SUCH_PAGE; - Graphics2D g2 = (Graphics2D) g; - g2.setPaint(Color.blue); - g2.setFont(new Font("Serif", Font.PLAIN, 64)); - g2.drawString(phrase, 96, 144); - return PAGE_EXISTS; - } - - public static void main(String args[]) { - PrinterJob tache = PrinterJob.getPrinterJob(); - tache.setPrintable(new Imprimer( - "Ceci est un teste d'impression en java!")); - - // printDialog affiche la fenetre de sélection de l’imprimante, - // etc... - - // il retourne true si on clique sur "Ok", false si on clique sur - // "Annuler" - //System.out.println(PrinterJob.getPrinterJob()); - if (!tache.printDialog()) - return; - try { - tache.print(); - } catch (Exception e) { - System.err.println("impossible d'imprimer"); - } - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/views/PrintTest.java b/src2/fr/orsay/lri/varna/views/PrintTest.java deleted file mode 100644 index 99bda20..0000000 --- a/src2/fr/orsay/lri/varna/views/PrintTest.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - 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.views; - -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Shape; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.font.FontRenderContext; -import java.awt.font.TextLayout; -import java.awt.geom.AffineTransform; -import java.awt.geom.GeneralPath; -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.awt.print.PageFormat; -import java.awt.print.Printable; -import java.awt.print.PrinterException; -import java.awt.print.PrinterJob; - -import javax.print.attribute.HashPrintRequestAttributeSet; -import javax.print.attribute.PrintRequestAttributeSet; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -/** - * This program demonstrates how to print 2D graphics - */ -public class PrintTest { - @SuppressWarnings("deprecation") - public static void main(String[] args) { - JFrame frame = new PrintTestFrame(); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.show(); - } -} - -/** - * This frame shows a panel with 2D graphics and buttons to print the graphics - * and to set up the page format. - */ - -@SuppressWarnings("serial") -class PrintTestFrame extends JFrame { - public PrintTestFrame() { - setTitle("PrintTest"); - setSize(WIDTH, HEIGHT); - - Container contentPane = getContentPane(); - canvas = new PrintPanel(); - contentPane.add(canvas, BorderLayout.CENTER); - - attributes = new HashPrintRequestAttributeSet(); - - JPanel buttonPanel = new JPanel(); - JButton printButton = new JButton("Print"); - buttonPanel.add(printButton); - printButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent event) { - try { - PrinterJob job = PrinterJob.getPrinterJob(); - job.setPrintable(canvas); - if (job.printDialog(attributes)) { - job.print(attributes); - } - } catch (PrinterException exception) { - JOptionPane.showMessageDialog(PrintTestFrame.this, - exception); - } - } - }); - - JButton pageSetupButton = new JButton("Page setup"); - buttonPanel.add(pageSetupButton); - pageSetupButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent event) { - PrinterJob job = PrinterJob.getPrinterJob(); - job.pageDialog(attributes); - } - }); - - contentPane.add(buttonPanel, BorderLayout.NORTH); - } - - private PrintPanel canvas; - - private PrintRequestAttributeSet attributes; - - private static final int WIDTH = 300; - - private static final int HEIGHT = 300; -} - -/** - * This panel generates a 2D graphics image for screen display and printing. - */ - -@SuppressWarnings("serial") -class PrintPanel extends JPanel implements Printable { - - public void paintComponent(Graphics g) { - super.paintComponent(g); - Graphics2D g2 = (Graphics2D) g; - drawPage(g2); - } - - public int print(Graphics g, PageFormat pf, int page) - throws PrinterException { - if (page >= 1) - return Printable.NO_SUCH_PAGE; - Graphics2D g2 = (Graphics2D) g; - g2.translate(pf.getImageableX(), pf.getImageableY()); - g2.draw(new Rectangle2D.Double(0, 0, pf.getImageableWidth(), pf - .getImageableHeight())); - - drawPage(g2); - return Printable.PAGE_EXISTS; - } - - /** - * This method draws the page both on the screen and the printer graphics - * context. - * - * @param g2 - * the graphics context - */ - public void drawPage(Graphics2D g2) { - FontRenderContext context = g2.getFontRenderContext(); - Font f = new Font("Serif", Font.PLAIN, 72); - - boolean drawOutline = true; - /** - * textLayout is not implemented - * - * @j2sNative - * - * drawOutline = false; - */ - {} - if (drawOutline) { - // BH: SwingJS HTML5 would have to use a different method for this - - GeneralPath clipShape = new GeneralPath(); - - TextLayout layout = new TextLayout("Hello", f, context); - AffineTransform transform = AffineTransform.getTranslateInstance(0, 72); - Shape outline = layout.getOutline(transform); - clipShape.append(outline, false); - - layout = new TextLayout("World", f, context); - transform = AffineTransform.getTranslateInstance(0, 144); - outline = layout.getOutline(transform); - clipShape.append(outline, false); - - g2.draw(clipShape); - g2.clip(clipShape); - } else { - g2.setFont(f); - g2.drawString("Hello", 0, 72); - g2.drawString("World", 0, 144); - } - - final int NLINES = 50; - Point2D p = new Point2D.Double(0, 0); - for (int i = 0; i < NLINES; i++) { - double x = (2 * getWidth() * i) / NLINES; - double y = (2 * getHeight() * (NLINES - 1 - i)) / NLINES; - Point2D q = new Point2D.Double(x, y); - g2.draw(new Line2D.Double(p, q)); - } - } -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/views/VueAboutPanel.java b/src2/fr/orsay/lri/varna/views/VueAboutPanel.java deleted file mode 100644 index fffbc80..0000000 --- a/src2/fr/orsay/lri/varna/views/VueAboutPanel.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - 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.views; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; - -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import javax.swing.JTextArea; -import javax.swing.Timer; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; -import fr.orsay.lri.varna.models.VARNAConfig; - -/** - * BH j2s SwingJS replaces thread with simple javax.swing.Timer - * - */ -public class VueAboutPanel extends JPanel { - - /** - * - */ - private static final long serialVersionUID = 4525998278180950602L; - - private AboutAnimator _anim; - private JPanel _textPanel; - private JTextArea _textArea; - - public VueAboutPanel() { - init(); - } - - private void init() { - try { - setBorder(BorderFactory.createEtchedBorder()); - setLayout(new BorderLayout()); - setBackground(Color.WHITE); - - String message = "VARNA " - + VARNAConfig.MAJOR_VERSION - + "." - + VARNAConfig.MINOR_VERSION - + "\n" - + "\n" - + "Created by: Kevin Darty, Alain Denise and Yann Ponty\n" - + "Contact: ponty@lri.fr\n" - + "\n" - + "VARNA is freely distributed under the terms of the GNU GPL 3.0 license.\n" - + "\n" - + "Supported by the BRASERO project (ANR-06-BLAN-0045)\n"; - - _textArea = new JTextArea(); - _textArea.setText(message); - _textArea.setEditable(false); - - _textPanel = new JPanel(); - _textPanel.setBackground(Color.WHITE); - _textPanel.setLayout(new BorderLayout()); - _textPanel.setBorder(BorderFactory.createMatteBorder(0, 15, 0, 15, - getBackground())); - _textPanel.add(_textArea); - - VARNAPanel vp = new VARNAPanel("GGGGAAAACCCC", "((((....))))"); - vp.setModifiable(false); - vp.setPreferredSize(new Dimension(100, 100)); - // vp.setBorder(BorderFactory.createLineBorder(Color.gray)); - - _anim = new AboutAnimator(vp); - _anim - .addRNA("GGGGAAGGGGAAAACCCCAACCCC", - "((((..((((....))))..))))"); - _anim.addRNA("GGGGAAGGGGAAGGGGAAAACCCCAACCCCAACCCC", - "((((..((((..((((....))))..))))..))))"); - _anim - .addRNA( - "GGGGAGGGGAAAACCCCAGGGGAGGGGAAAACCCCAGGGGAAAACCCCAGGGGAAAACCCCACCCCAGGGGAAAACCCCACCCC", - "((((.((((....)))).((((.((((....)))).((((....)))).((((....)))).)))).((((....)))).))))"); - _anim - .addRNA( - "GGGGGGGGAAAACCCCAGGGGAAAACCCCAGGGGGGGGAAAACCCCAGGGGAAAACCCCAGGGGAAAACCCCAGGGGAAAACCCCGGGGAAAACCCCACCCCAGGGGAAAACCCCAGGGGAAAACCCCCCCC", - "((((((((....)))).((((....)))).((((((((....)))).((((....)))).((((....)))).((((....))))((((....)))).)))).((((....)))).((((....))))))))"); - _anim.addRNA("GGGGAAAACCCC", "((((....))))"); - _anim.addRNA("GGGGAAGGGGAAAACCCCAGGGGAAAACCCCACCCC", - "((((..((((....)))).((((....)))).))))"); - _anim.addRNA("GGGGAGGGGAAAACCCCAGGGGAAAACCCCAGGGGAAAACCCCACCCC", - "((((.((((....)))).((((....)))).((((....)))).))))"); - _anim - .addRNA( - "GGGGAGGGGAAAAAAACCCCAGGGGAAAAAAACCCCAGGGGAAAAAAACCCCACCCC", - "((((.((((.......)))).((((.......)))).((((.......)))).))))"); - _anim.start(); - - add(vp, BorderLayout.WEST); - add(_textPanel, BorderLayout.CENTER); - } catch (ExceptionNonEqualLength e) { - } - } - - public void gracefulStop() { - _anim.gracefulStop(); - } - - private class AboutAnimator implements ActionListener { - VARNAPanel _vp; - ArrayList _structures = new ArrayList(); - ArrayList _sequences = new ArrayList(); - int _period = 2000; - boolean _over = false; - - public AboutAnimator(VARNAPanel vp) { - super(); - _vp = vp; - } - - /** - * mode pointer for timer cycle -- DELAY1, TASK, DELAY2, STOP - */ - int mode = 0; - - /** - * modes for run() - * - */ - final int DELAY1 = 0, TASK = 1, DELAY2 = 2, STOP = 3; - int i = 0; - - @Override - public void actionPerformed(ActionEvent e) { - run(); - } - - public void start() { - int mode = DELAY1; - run(); - } - - public void addRNA(String seq, String str) { - _sequences.add(seq); - _structures.add(str); - } - - public void gracefulStop() { - _over = true; - } - - public void run() { - int initialDelay; - if (_over) - mode = STOP; - switch (mode) { - case DELAY1: - mode = TASK; - initialDelay = _period; - break; - case TASK: - String seq = _sequences.get(i); - String str = _structures.get(i); - try { - _vp.drawRNAInterpolated(seq, str); - mode = DELAY2; - initialDelay = 500; - } catch (ExceptionNonEqualLength e) { - initialDelay = -1; - } - break; - case DELAY2: - i = (i + 1) % _sequences.size(); - mode = DELAY1; - initialDelay = 0; - break; - case STOP: - default: - initialDelay = -1; - break; - } - if (initialDelay >= 0) { - Timer t = new Timer(initialDelay, this); - t.setDelay(0); - t.setRepeats(false); - t.start(); - } else { - System.out.println("VueAbout done"); - } - - } - } - -} diff --git a/src2/fr/orsay/lri/varna/views/VueAnnotation.java b/src2/fr/orsay/lri/varna/views/VueAnnotation.java deleted file mode 100644 index 95a8cce..0000000 --- a/src2/fr/orsay/lri/varna/views/VueAnnotation.java +++ /dev/null @@ -1,382 +0,0 @@ -/* - 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.views; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.GridLayout; -import java.awt.geom.Point2D.Double; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSlider; -import javax.swing.JTextArea; -import javax.swing.border.Border; -import javax.swing.plaf.basic.BasicBorders; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurSliderLabel; -import fr.orsay.lri.varna.controlers.ControleurVueAnnotation; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; - -/** - * - * BH SwingJS using asynchronous JOptionPane.showConfirmDialog - * - * annoted text view for edition - * - * @author Darty@lri.fr - * - */ -public class VueAnnotation { - - protected VARNAPanel _vp; - private JSlider ySlider, xSlider; - private JButton colorButton; - private JTextArea textArea; - private JPanel panel; - protected TextAnnotation textAnnotation, textAnnotationSave; - private VueFont vueFont; - private ControleurVueAnnotation _controleurVueAnnotation; - protected boolean newAnnotation, limited; - private Double position; - private JSlider rotationSlider; - - /** - * creates a view for a new annoted text - * - * @param vp - * @param limited - * if true, lets custom position and angle. - */ - public VueAnnotation(VARNAPanel vp, boolean limited) { - this( - vp, - (int) (vp.getExtendedRNABBox().x + vp.getExtendedRNABBox().width / 2.0), - (int) (vp.getExtendedRNABBox().y + vp.getExtendedRNABBox().height / 2.0), - limited); - } - - /** - * creates a view for a new annoted text, without limited option - * - * @param vp - */ - public VueAnnotation(VARNAPanel vp) { - this(vp, false); - } - - /** - * creates a view for a new annoted text at a given position, without - * limited option - * - * @param vp - */ - public VueAnnotation(VARNAPanel vp, int x, int y) { - this(vp, x, y, false); - } - - /** - * creates a view for a new annoted text at a given position, without - * limited option - * - * @param vp - */ - public VueAnnotation(VARNAPanel vp, int x, int y, boolean limited) { - this(vp, new TextAnnotation("", x, y), false, true); - } - - /** - * creates a view for an annoted text, without limited option - * - * @param vp - * @param textAnnot - */ - public VueAnnotation(VARNAPanel vp, TextAnnotation textAnnot, - boolean newAnnotation) { - this(vp, textAnnot, (textAnnot.getType()!=TextAnnotation.AnchorType.POSITION), newAnnotation); - } - - /** - * creates a view for an annoted text - * - * - * @param vp - * @param textAnnot - * @param reduite - * if true, lets custom position and angle. - * @param newAnnotation - * if true, deleted if cancelled. - */ - public VueAnnotation(VARNAPanel vp, TextAnnotation textAnnot, - boolean reduite, boolean newAnnotation) { - this.limited = reduite; - this.newAnnotation = newAnnotation; - _vp = vp; - textAnnotation = textAnnot; - textAnnotationSave = textAnnotation.clone(); - - if (!_vp.getListeAnnotations().contains(textAnnot)) { - _vp.addAnnotation(textAnnotation); - } - - _controleurVueAnnotation = new ControleurVueAnnotation(this); - - position = textAnnotation.getCenterPosition(); - - /* - * if (textAnnotation.getType() != TextAnnotation.POSITION) { position = - * _vp.transformCoord(position); } - */ - - JPanel py = new JPanel(); - JPanel px = new JPanel(); - panel = new JPanel(); - panel.setLayout(new GridLayout(0, 1)); - py.setLayout(new FlowLayout(FlowLayout.LEFT)); - px.setLayout(new FlowLayout(FlowLayout.LEFT)); - - ySlider = new JSlider(JSlider.HORIZONTAL, 0, (int) (_vp - .getExtendedRNABBox().height), Math.max(0, Math.min((int) (_vp - .getExtendedRNABBox().height), (int) (position.y - _vp - .getExtendedRNABBox().y)))); - // Turn on labels at major tick marks. - ySlider.setMajorTickSpacing(500); - ySlider.setMinorTickSpacing(100); - ySlider.setPaintTicks(true); - ySlider.setPaintLabels(true); - ySlider.setPreferredSize(new Dimension(400, - ySlider.getPreferredSize().height)); - - JLabel yValueLabel = new JLabel(String.valueOf((int) position.y - - _vp.getExtendedRNABBox().y)); - yValueLabel.setPreferredSize(new Dimension(50, yValueLabel - .getPreferredSize().height)); - ySlider - .addChangeListener(new ControleurSliderLabel(yValueLabel, false)); - ySlider.addChangeListener(_controleurVueAnnotation); - - xSlider = new JSlider(JSlider.HORIZONTAL, 0, (int) (_vp - .getExtendedRNABBox().width), Math.max(0, Math.min((int) _vp - .getExtendedRNABBox().width, (int) (position.x - _vp - .getExtendedRNABBox().x)))); - // Turn on labels at major tick marks. - xSlider.setMajorTickSpacing(500); - xSlider.setMinorTickSpacing(100); - xSlider.setPaintTicks(true); - xSlider.setPaintLabels(true); - xSlider.setPreferredSize(new Dimension(400, - xSlider.getPreferredSize().height)); - - JLabel xValueLabel = new JLabel(String.valueOf((int) position.x - - _vp.getExtendedRNABBox().x)); - xValueLabel.setPreferredSize(new Dimension(50, xValueLabel - .getPreferredSize().height)); - xSlider - .addChangeListener(new ControleurSliderLabel(xValueLabel, false)); - xSlider.addChangeListener(_controleurVueAnnotation); - - JLabel labelY = new JLabel("Y:"); - JLabel labelX = new JLabel("X:"); - - py.add(labelY); - py.add(ySlider); - py.add(yValueLabel); - px.add(labelX); - px.add(xSlider); - px.add(xValueLabel); - - /*if (!limited) { - panel.add(px); - panel.add(py); - }*/ - - JPanel panelTexte = new JPanel(); - panelTexte.setLayout(new BorderLayout()); - textArea = new JTextArea(textAnnotation.getTexte()); - textArea.addCaretListener(_controleurVueAnnotation); - textArea.setPreferredSize(panelTexte.getSize()); - Border border = new BasicBorders.FieldBorder(Color.black, Color.black, - Color.black, Color.black); - textArea.setBorder(border); - JLabel labelTexte = new JLabel("Text:"); - panelTexte.add(textArea, BorderLayout.CENTER); - panelTexte.add(labelTexte, BorderLayout.NORTH); - panel.add(panelTexte); - - vueFont = new VueFont(textAnnot.getFont()); - vueFont.getBoxPolice().addActionListener(_controleurVueAnnotation); - vueFont.getSizeSlider().addChangeListener(_controleurVueAnnotation); - vueFont.getStylesBox().addActionListener(_controleurVueAnnotation); - - colorButton = new JButton("Set color"); - colorButton.setActionCommand("setcolor"); - colorButton.setForeground(textAnnot.getColor()); - colorButton.addActionListener(_controleurVueAnnotation); - - JPanel fontAndColor = new JPanel(); - fontAndColor.add(vueFont.getPanel()); - fontAndColor.add(colorButton); - - panel.add(fontAndColor); - - JPanel rotationPanel = new JPanel(); - - rotationSlider = new JSlider(JSlider.HORIZONTAL, -360, 360, - (int) textAnnotation.getAngleInDegres()); - rotationSlider.setMajorTickSpacing(60); - rotationSlider.setPaintTicks(true); - rotationSlider.setPaintLabels(true); - rotationSlider.setPreferredSize(new Dimension(500, 50)); - - JLabel rotationLabel = new JLabel(String.valueOf(0)); - rotationLabel.setPreferredSize(new Dimension(50, rotationLabel - .getPreferredSize().height)); - rotationSlider.addChangeListener(new ControleurSliderLabel( - rotationLabel, false)); - rotationSlider.addChangeListener(_controleurVueAnnotation); - - JLabel labelZ = new JLabel("Rotation (degrees):"); - - rotationPanel.add(labelZ); - rotationPanel.add(rotationSlider); - rotationPanel.add(rotationLabel); - - /* - * if (!limited) { panel.add(rotationPanel); } - */ - - if (limited) { - ySlider.setEnabled(false); - xSlider.setEnabled(false); - rotationSlider.setEnabled(false); - } - textArea.requestFocusInWindow(); - - } - - private void applyFont() { - textAnnotation.setFont(vueFont.getFont()); - } - - /** - * update the annoted text on the VARNAPanel - */ - public void update() { - applyFont(); - if (textAnnotation.getType() == TextAnnotation.AnchorType.POSITION) - textAnnotation.setAncrage((double) xSlider.getValue() - + _vp.getExtendedRNABBox().x, ySlider.getValue() - + _vp.getExtendedRNABBox().y); - textAnnotation.setText(textArea.getText()); - textAnnotation.setAngleInDegres(rotationSlider.getValue()); - _vp.clearSelection(); - _vp.repaint(); - } - - public JPanel getPanel() { - return panel; - } - - /** - * - * @return the annoted text - */ - public TextAnnotation getTextAnnotation() { - return textAnnotation; - } - - public VARNAPanel get_vp() { - return _vp; - } - - /** - * shows the dialog which add it to the VARNAPanel for previsualization. - *

- * if validate, just update the annoted text - *

- * if cancelled : remove the annoted text if it was a new one, otherwise - * cancel modifications - *

- * - */ - public void show() { - _vp.set_selectedAnnotation(textAnnotation); - _vp.highlightSelectedAnnotation(); - - // BH SwingjS using asynchronous dialog - Runnable ok = new Runnable() { - - @Override - public void run() { - update(); - } - - }; - - Runnable cancel = new Runnable() { - - @Override - public void run() { - if (newAnnotation) { - _vp.set_selectedAnnotation(null); - if (!_vp.removeAnnotation(textAnnotation)) - _vp.errorDialog(new Exception("Impossible de supprimer")); - } else { - textAnnotation.copy(textAnnotationSave); - } - } - - }; - - Runnable final_ = new Runnable() { - - @Override - public void run() { - _vp.resetAnnotationHighlight(); - _vp.set_selectedAnnotation(null); - _vp.repaint(); - } - - }; - - _vp.getVARNAUI().showConfirmDialog(getPanel(), "Add/edit annotation", ok, cancel, cancel, final_); - } - - public boolean isLimited() { - return limited; - } - - public void setLimited(boolean limited) { - this.limited = limited; - } - - public boolean isNewAnnotation() { - return this.newAnnotation; - } - - public void updateColor(Color c) { - colorButton.setForeground(c); - textAnnotation.setColor(c); - - } - -} diff --git a/src2/fr/orsay/lri/varna/views/VueBPHeightIncrement.java b/src2/fr/orsay/lri/varna/views/VueBPHeightIncrement.java deleted file mode 100644 index 342608f..0000000 --- a/src2/fr/orsay/lri/varna/views/VueBPHeightIncrement.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - 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.views; - -import java.awt.Dimension; -import java.awt.FlowLayout; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSlider; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurBPHeightIncrement; -import fr.orsay.lri.varna.controlers.ControleurSliderLabel; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VueBPHeightIncrement { - private VARNAPanel _vp; - private JPanel panel; - private JSlider spaceSlider; - - public VueBPHeightIncrement(VARNAPanel vp) { - _vp = vp; - panel = new JPanel(); - - spaceSlider = new JSlider(JSlider.HORIZONTAL, 10, 200, Integer - .valueOf(String.valueOf(Math - .round(vp.getRNA().getBPHeightIncrement() * 100)))); - // Turn on labels at major tick marks. - spaceSlider.setMajorTickSpacing(30); - spaceSlider.setPaintTicks(true); - spaceSlider.setPaintLabels(true); - - JLabel spaceLabel = new JLabel(String - .valueOf(vp.getRNA().getBPHeightIncrement() * 100.0)); - spaceLabel.setPreferredSize(new Dimension(50, spaceLabel - .getPreferredSize().height)); - spaceSlider.addChangeListener(new ControleurSliderLabel(spaceLabel, - false)); - spaceSlider.addChangeListener(new ControleurBPHeightIncrement(this)); - - panel = new JPanel(); - panel.setLayout(new FlowLayout(FlowLayout.LEFT)); - - JLabel labelS = new JLabel("HeighInc:"); - - panel.add(labelS); - panel.add(spaceSlider); - panel.add(spaceLabel); - } - - public VARNAPanel get_vp() { - return _vp; - } - - public JPanel getPanel() { - return panel; - } - - public Double getIncrement() { - return spaceSlider.getValue() / 100.0; - } -} diff --git a/src2/fr/orsay/lri/varna/views/VueBPList.java b/src2/fr/orsay/lri/varna/views/VueBPList.java deleted file mode 100644 index 7c18d9c..0000000 --- a/src2/fr/orsay/lri/varna/views/VueBPList.java +++ /dev/null @@ -1,221 +0,0 @@ -package fr.orsay.lri.varna.views; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyVetoException; -import java.beans.VetoableChangeListener; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Vector; - -import javax.swing.DefaultCellEditor; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; -import javax.swing.table.AbstractTableModel; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.ActionEditor; -import fr.orsay.lri.varna.components.ActionRenderer; -import fr.orsay.lri.varna.components.ColorRenderer; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; -import fr.orsay.lri.varna.models.rna.ModeleBP; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VueBPList extends JPanel implements TableModelListener, ActionListener -{ - - private JTable table; - private BPTableModel _tm; - private VARNAPanel _vp; - private ArrayList data; - private ArrayList _backup; - private ArrayList columns; - - - public enum Actions{ - ACTION_DELETE, - ACTION_EDIT_STYLE; - - public String toString() - { - switch(this) - { - case ACTION_DELETE: - return "Delete"; - case ACTION_EDIT_STYLE: - return "Edit Style"; - } - return "N/A"; - } - }; - - public VueBPList(VARNAPanel vp) - { - super(new GridLayout(1, 0)); - _vp = vp; - init(); - } - - private void init() - { - Object[] col = {"Sec.Str.","5' partner","3' partner","5' edge","3' edge","Orientation","Remove"}; - columns = new ArrayList(); - for (int i = 0; i < col.length; i++) - { - columns.add(col[i]); - } - - _backup = new ArrayList(); - data = new ArrayList(); - for (ModeleBP ms: _vp.getRNA().getAllBPs()) - { - data.add(ms); - } - Collections.sort(data); - _tm = new BPTableModel(); - table = new JTable(_tm); - - table.setDefaultRenderer(Color.class, new ColorRenderer(true)); - table.setDefaultRenderer(Actions.class, new ActionRenderer()); - - table.setDefaultEditor(ModeleBP.Edge.class, new DefaultCellEditor(new JComboBox(ModeleBP.Edge.values()))); - table.setDefaultEditor(ModeleBP.Stericity.class, new DefaultCellEditor(new JComboBox(ModeleBP.Stericity.values()))); - table.setDefaultEditor(Actions.class, new ActionEditor(this)); - - table.setPreferredScrollableViewportSize(new Dimension(500, 500)); - table.getModel().addTableModelListener(this); - - table.setRowHeight(25); - - JScrollPane scrollPane = new JScrollPane(table); - add(scrollPane); - setOpaque(true); // content panes must be opaque - this.doLayout(); - - JOptionPane.showMessageDialog(_vp, this, "Base pairs Edition", JOptionPane.PLAIN_MESSAGE); - - } - - public void cancelChanges() - { - for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) - { - ModeleBase mb = _vp.getRNA().get_listeBases().get(i); - mb.setValue(_backup.get(i)); - } - _vp.getRNA().rescaleColorMap(_vp.getColorMap()); - } - - private class BPTableModel extends AbstractTableModel { - /** - * - */ - private static final long serialVersionUID = 1L; - public String getColumnName(int col) { - return columns.get(col).toString(); - } - public int getRowCount() { return data.size(); } - public int getColumnCount() { return columns.size(); } - public Object getValueAt(int row, int col) { - ModeleBP mb = data.get(row); - if (col==0) - { - return new Boolean(mb.getPartner3().getElementStructure()==mb.getPartner5().getIndex()); - } - else if (col==1) - { - return new String(""+mb.getPartner5().getBaseNumber()+"-"+mb.getPartner5().getContent()); - } - else if (col==2) - { - return new String(""+mb.getPartner3().getBaseNumber()+"-"+mb.getPartner3().getContent()); - } - else if (col==3) - { - return mb.getEdgePartner5(); - } - else if (col==4) - { - return mb.getEdgePartner3(); - } - else if (col==5) - { - return mb.getStericity(); - } - else if (col==6) - { - return Actions.ACTION_DELETE; - } - return "N/A"; - } - public boolean isCellEditable(int row, int col) - { - if ( col == 3 || col ==4 || col ==5 || col ==6) - return true; - return false; - } - public void setValueAt(Object value, int row, int col) { - if ( col == 3 || col ==4 || col ==5) - { - ModeleBP mb = data.get(row); - if ( col == 3) - { - mb.setEdge5((ModeleBP.Edge)value); - } - else if ( col == 4) - { - mb.setEdge3((ModeleBP.Edge)value); - } - else if ( col == 5) - { - mb.setStericity((ModeleBP.Stericity)value); - } - fireTableCellUpdated(row, col); - _vp.repaint(); - - } - } - - public Class getColumnClass(int c) { - return getValueAt(0, c).getClass(); - } - } - - public void tableChanged(TableModelEvent e) { - if (e.getType() == TableModelEvent.UPDATE) - { - table.repaint(); - } - - } - - public void actionPerformed(ActionEvent arg0) { - //System.out.println(""+arg0.toString()); - String[] data2 = arg0.getActionCommand().split("-"); - int row = Integer.parseInt(data2[data2.length-1]); - if (data2[0].equals("Delete")) - { - ModeleBP ms = data.get(row); - _vp.getVARNAUI().UIRemoveBP(ms); - - - data.remove(row); - - _tm.fireTableRowsDeleted(row, row); - } - } - -} diff --git a/src2/fr/orsay/lri/varna/views/VueBPThickness.java b/src2/fr/orsay/lri/varna/views/VueBPThickness.java deleted file mode 100644 index af35a03..0000000 --- a/src2/fr/orsay/lri/varna/views/VueBPThickness.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - 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.views; - -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.util.ArrayList; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSlider; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurSliderLabel; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.ModeleBP; - -public class VueBPThickness implements ChangeListener { - - private VARNAPanel _vp; - ArrayList _msbp; - private JSlider _thicknessSlider; - private JPanel panel; - - private ArrayList _backupThicknesses = new ArrayList(); - - private double FACTOR = 10.0; - - public VueBPThickness(VARNAPanel vp, ArrayList msbp) { - _vp = vp; - _msbp = msbp; - backupThicknesses(); - - _thicknessSlider = new JSlider(JSlider.HORIZONTAL, 1, 100, - (int) (msbp.get(0).getStyle().getThickness( - VARNAConfig.DEFAULT_BP_THICKNESS) * FACTOR)); - _thicknessSlider.setMajorTickSpacing(10); - _thicknessSlider.setPaintTicks(true); - _thicknessSlider.setPaintLabels(false); - _thicknessSlider.setPreferredSize(new Dimension(500, 50)); - - JLabel thicknessLabel = new JLabel(String.valueOf(msbp.get(0).getStyle() - .getThickness(VARNAConfig.DEFAULT_BP_THICKNESS))); - thicknessLabel.setPreferredSize(new Dimension(50, thicknessLabel - .getPreferredSize().height)); - _thicknessSlider.addChangeListener(new ControleurSliderLabel( - thicknessLabel, 1.0 / FACTOR)); - _thicknessSlider.addChangeListener(this); - - panel = new JPanel(); - panel.setLayout(new FlowLayout(FlowLayout.LEFT)); - - JLabel labelZ = new JLabel("Thickness:"); - - panel.add(labelZ); - panel.add(_thicknessSlider); - panel.add(thicknessLabel); - } - - private void backupThicknesses() { - for (int i = 0; i < _msbp.size(); i++) { - this._backupThicknesses.add(_msbp.get(i).getStyle().getThickness( - VARNAConfig.DEFAULT_BP_THICKNESS)); - } - } - - public void restoreThicknesses() { - for (int i = 0; i < _msbp.size(); i++) { - _msbp.get(i).getStyle().setThickness(_backupThicknesses.get(i)); - } - } - - public JPanel getPanel() { - return panel; - } - - public double getThickness() { - return (double) _thicknessSlider.getValue() / FACTOR; - } - - public VARNAPanel get_vp() { - return _vp; - } - - public void stateChanged(ChangeEvent e) { - for (int i = 0; i < _msbp.size(); i++) { - _msbp.get(i).getStyle().setThickness( - ((double) _thicknessSlider.getValue()) / FACTOR); - } - _vp.repaint(); - } -} diff --git a/src2/fr/orsay/lri/varna/views/VueBPType.java b/src2/fr/orsay/lri/varna/views/VueBPType.java deleted file mode 100644 index 93d5b33..0000000 --- a/src2/fr/orsay/lri/varna/views/VueBPType.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - 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.views; - -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.rna.ModeleBP; - - -public class VueBPType implements ActionListener { - - private VARNAPanel _vp; - ModeleBP _msbp; - private JComboBox _edge5; - private JComboBox _edge3; - private JComboBox _stericity; - private JPanel panel; - - public VueBPType(VARNAPanel vp, ModeleBP msbp) { - _vp = vp; - _msbp = msbp; - - ModeleBP.Edge[] edges = ModeleBP.Edge.values(); - ModeleBP.Edge bck = msbp.getEdgePartner5(); - _edge5 = new JComboBox(edges); - for (int i = 0; i < edges.length; i++) { - if (edges[i] == bck) - _edge5.setSelectedIndex(i); - } - - bck = msbp.getEdgePartner3(); - _edge3 = new JComboBox(edges); - for (int i = 0; i < edges.length; i++) { - if (edges[i] == bck) - _edge3.setSelectedIndex(i); - } - - ModeleBP.Stericity[] sters = ModeleBP.Stericity.values(); - ModeleBP.Stericity bcks = msbp.getStericity(); - _stericity = new JComboBox(sters); - for (int i = 0; i < sters.length; i++) { - if (sters[i] == bcks) - _stericity.setSelectedIndex(i); - } - - _edge5.addActionListener(this); - _edge3.addActionListener(this); - _stericity.addActionListener(this); - - panel = new JPanel(); - panel.setLayout(new FlowLayout(FlowLayout.LEFT)); - - JLabel label5 = new JLabel("5' edge: "); - JLabel label3 = new JLabel("3' edge: "); - JLabel labelS = new JLabel("Stericity: "); - - panel.add(label5); - panel.add(_edge5); - panel.add(label3); - panel.add(_edge3); - panel.add(labelS); - panel.add(_stericity); - } - - public JPanel getPanel() { - return panel; - } - - public ModeleBP.Edge getEdge5() { - return (ModeleBP.Edge) _edge5.getSelectedItem(); - } - - public ModeleBP.Edge getEdge3() { - return (ModeleBP.Edge) _edge3.getSelectedItem(); - } - - public ModeleBP.Stericity getStericity() { - return (ModeleBP.Stericity) _stericity.getSelectedItem(); - } - - public VARNAPanel get_vp() { - return _vp; - } - - public void actionPerformed(ActionEvent e) { - _msbp.setEdge5(getEdge5()); - _msbp.setEdge3(getEdge3()); - _msbp.setStericity(getStericity()); - _vp.repaint(); - } - -} diff --git a/src2/fr/orsay/lri/varna/views/VueBaseValues.java b/src2/fr/orsay/lri/varna/views/VueBaseValues.java deleted file mode 100644 index 980ac65..0000000 --- a/src2/fr/orsay/lri/varna/views/VueBaseValues.java +++ /dev/null @@ -1,134 +0,0 @@ -package fr.orsay.lri.varna.views; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyVetoException; -import java.beans.VetoableChangeListener; -import java.util.ArrayList; -import java.util.Vector; - -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; -import javax.swing.table.AbstractTableModel; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.ColorRenderer; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VueBaseValues extends JPanel implements TableModelListener { - - private JTable table; - private ValueTableModel _tm; - private VARNAPanel _vp; - private ArrayList data; - private ArrayList _backup; - private ArrayList columns; - - - public VueBaseValues(VARNAPanel vp) - { - super(new GridLayout(1, 0)); - _vp = vp; - init(); - } - - private void init() - { - Object[] col = {"Number","Base","Value","Preview"}; - columns = new ArrayList(); - for (int i = 0; i < col.length; i++) - { - columns.add(col[i]); - } - - _backup = new ArrayList(); - data = new ArrayList(); - for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) - { - ModeleBase mb = _vp.getRNA().get_listeBases().get(i); - data.add(mb); - _backup.add(mb.getValue()); - } - _tm = new ValueTableModel(); - table = new JTable(_tm); - table.setDefaultRenderer(Color.class, new ColorRenderer(true)); - table.setPreferredScrollableViewportSize(new Dimension(300, 300)); - table.getModel().addTableModelListener(this); - - JScrollPane scrollPane = new JScrollPane(table); - this.add(scrollPane); - } - - public void cancelChanges() - { - for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) - { - ModeleBase mb = _vp.getRNA().get_listeBases().get(i); - mb.setValue(_backup.get(i)); - } - _vp.getRNA().rescaleColorMap(_vp.getColorMap()); - } - - private class ValueTableModel extends AbstractTableModel { - public String getColumnName(int col) { - return columns.get(col).toString(); - } - public int getRowCount() { return data.size(); } - public int getColumnCount() { return columns.size(); } - public Object getValueAt(int row, int col) { - ModeleBase mb = data.get(row); - if (col==0) - { - return new Integer(mb.getBaseNumber()); - } - else if (col==1) - { - return new String(mb.getContent()); - } - else if (col==2) - { - return new Double(mb.getValue()); - } - else if (col==3) - { - return _vp.getColorMap().getColorForValue(mb.getValue()); - } - return "N/A"; - } - public boolean isCellEditable(int row, int col) - { - if (getColumnName(col).equals("Value")) - return true; - return false; - } - public void setValueAt(Object value, int row, int col) { - if (getColumnName(col).equals("Value")) - { - data.get(row).setValue(((Double)value)); - _vp.getRNA().rescaleColorMap(_vp.getColorMap()); - _vp.repaint(); - fireTableCellUpdated(row, col); - } - } - public Class getColumnClass(int c) { - return getValueAt(0, c).getClass(); - } - } - - public void tableChanged(TableModelEvent e) { - if (e.getType() == TableModelEvent.UPDATE) - { - table.repaint(); - } - - } - -} diff --git a/src2/fr/orsay/lri/varna/views/VueBases.java b/src2/fr/orsay/lri/varna/views/VueBases.java deleted file mode 100644 index 6f9d95a..0000000 --- a/src2/fr/orsay/lri/varna/views/VueBases.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - 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.views; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.util.ArrayList; -import java.util.Hashtable; - -import javax.swing.JComponent; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; - - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.BaseSpecialColorEditor; -import fr.orsay.lri.varna.components.BaseTableModel; -import fr.orsay.lri.varna.components.ColorRenderer; -import fr.orsay.lri.varna.models.BaseList; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; - -public class VueBases extends JPanel { - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * for bases by kind - */ - public final static int KIND_MODE = 1; - /** - * for all bases - */ - public final static int ALL_MODE = 2; - /** - * for base pairs by king - */ - public final static int COUPLE_MODE = 3; - - private int _mode; - - private VARNAPanel _vp; - - private ArrayList data = new ArrayList(); - - private Hashtable revdata = new Hashtable(); - - private JTable table; - - private BaseTableModel specialTableModel; - - public VueBases(VARNAPanel vp, int mode) { - super(new GridLayout(1, 0)); - _vp = vp; - switch (mode) { - case (KIND_MODE): - _mode = KIND_MODE; - kindMode(); - break; - case (ALL_MODE): - _mode = ALL_MODE; - allMode(); - break; - case (COUPLE_MODE): - _mode = COUPLE_MODE; - coupleMode(); - break; - default: - break; - } - } - - private BaseList locateOrAddList(String caption) - { - if (!revdata.containsKey(caption)) - { - BaseList mbl = new BaseList(caption); - revdata.put(caption,mbl); - data.add(mbl); - } - return revdata.get(caption); - } - - private void coupleMode() { - String pairString; - for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) { - - int j = _vp.getRNA().get_listeBases().get(i).getElementStructure(); - if (j > i) { - String tmp1 = (_vp.getRNA().get_listeBases().get(i).getContent()); - String tmp2 = (_vp.getRNA().get_listeBases().get(j).getContent()); - pairString = tmp1 +"-"+ tmp2; - BaseList bl = locateOrAddList(pairString); - bl.addBase(_vp.getRNA().get_listeBases().get(i)); - bl.addBase(_vp.getRNA().get_listeBases().get(j)); - } - } - createView(); - } - - private void allMode() { - for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) { - ModeleBase mb = _vp.getRNA().get_listeBases().get(i); - BaseList bl = locateOrAddList(""+i); - bl.addBase(mb); - } - createView(); - } - - private void kindMode() { - for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) { - ModeleBase mb = _vp.getRNA().get_listeBases().get(i); - String tmp1 = (mb.getContent()); - BaseList bl = locateOrAddList(tmp1); - bl.addBase(mb); - } - createView(); - } - - private void createView() { - specialTableModel = new BaseTableModel(data); - table = new JTable(specialTableModel); - table.setPreferredScrollableViewportSize(new Dimension(500, 300)); - // TODO: Find equivalent in JRE 1.5 - //table.setFillsViewportHeight(true); - // Create the scroll pane and add the table to it. - JScrollPane scrollPane = new JScrollPane(table); - - // Set up renderer and editor for the Favorite Color column. - table.setDefaultRenderer(Color.class, new ColorRenderer(true)); - table.setDefaultEditor(Color.class, new BaseSpecialColorEditor(this)); - specialTableModel.addTableModelListener(new TableModelListener(){ - - public void tableChanged(TableModelEvent e) { - _vp.repaint(); - } - - }); - - // Add the scroll pane to this panel. - add(scrollPane); - - UIvueBases(); - } - - /** - * Create the GUI and show it. For thread safety, this method should be - * invoked from the event-dispatching thread. - */ - public void UIvueBases() { - // Create and set up the content pane. - JComponent newContentPane = this; - newContentPane.setOpaque(true); // content panes must be opaque - - JOptionPane.showMessageDialog(_vp, newContentPane, - "Base Colors Edition", JOptionPane.PLAIN_MESSAGE); - - } - - public int getMode() { - return _mode; - } - - public BaseList getDataAt(int i) { - return data.get(i); - } - - - public ArrayList getData() { - return data; - } - - public VARNAPanel get_vp() { - return _vp; - } - - public JTable getTable() { - return table; - } - - public void setTable(JTable table) { - this.table = table; - } - - public BaseTableModel getSpecialTableModel() { - return specialTableModel; - } - - public void setSpecialTableModel(BaseTableModel specialTableModel) { - this.specialTableModel = specialTableModel; - } - -} diff --git a/src2/fr/orsay/lri/varna/views/VueBorder.java b/src2/fr/orsay/lri/varna/views/VueBorder.java deleted file mode 100644 index b0f9ca6..0000000 --- a/src2/fr/orsay/lri/varna/views/VueBorder.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - 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.views; - -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.GridLayout; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSlider; - - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurBorder; -import fr.orsay.lri.varna.controlers.ControleurSliderLabel; - -public class VueBorder { - - private VARNAPanel _vp; - private JSlider borderHeightSlider, borderWidthSlider; - private JPanel panel; - - public VueBorder(VARNAPanel vp) { - _vp = vp; - - JPanel pup = new JPanel(); - JPanel pdown = new JPanel(); - panel = new JPanel(); - panel.setLayout(new GridLayout(2, 1)); - pup.setLayout(new FlowLayout(FlowLayout.LEFT)); - pdown.setLayout(new FlowLayout(FlowLayout.LEFT)); - - borderHeightSlider = new JSlider(JSlider.HORIZONTAL, 0, - _vp.getHeight() / 2 - 10, _vp.getBorderSize().height); - // Turn on labels at major tick marks. - borderHeightSlider.setMajorTickSpacing(50); - borderHeightSlider.setMinorTickSpacing(10); - borderHeightSlider.setPaintTicks(true); - borderHeightSlider.setPaintLabels(true); - JLabel borderHeightLabel = new JLabel(String.valueOf(_vp - .getBorderSize().height)); - borderHeightLabel.setPreferredSize(new Dimension(50, borderHeightLabel - .getPreferredSize().height)); - borderHeightSlider.addChangeListener(new ControleurSliderLabel( - borderHeightLabel, false)); - borderHeightSlider.addChangeListener(new ControleurBorder(this)); - - borderWidthSlider = new JSlider(JSlider.HORIZONTAL, 0, - _vp.getWidth() / 2 - 10, _vp.getBorderSize().width); - // Turn on labels at major tick marks. - borderWidthSlider.setMajorTickSpacing(50); - borderWidthSlider.setMinorTickSpacing(10); - borderWidthSlider.setPaintTicks(true); - borderWidthSlider.setPaintLabels(true); - JLabel borderWidthLabel = new JLabel(String - .valueOf(_vp.getBorderSize().width)); - borderWidthLabel.setPreferredSize(new Dimension(50, borderWidthLabel - .getPreferredSize().height)); - borderWidthSlider.addChangeListener(new ControleurSliderLabel( - borderWidthLabel, false)); - borderWidthSlider.addChangeListener(new ControleurBorder(this)); - - JLabel labelW = new JLabel("Width:"); - JLabel labelH = new JLabel("Height:"); - - pup.add(labelW); - pup.add(borderWidthSlider); - pup.add(borderWidthLabel); - - pdown.add(labelH); - pdown.add(borderHeightSlider); - pdown.add(borderHeightLabel); - - panel.add(pup); - panel.add(pdown); - } - - public JPanel getPanel() { - return panel; - } - - public Dimension getDimension() { - return new Dimension(borderWidthSlider.getValue(), borderHeightSlider - .getValue()); - } - - public int getHeight() { - return borderHeightSlider.getValue(); - } - - public int getWidth() { - return borderWidthSlider.getValue(); - } - - public VARNAPanel get_vp() { - return _vp; - } -} diff --git a/src2/fr/orsay/lri/varna/views/VueChemProbAnnotation.java b/src2/fr/orsay/lri/varna/views/VueChemProbAnnotation.java deleted file mode 100644 index 536d3fa..0000000 --- a/src2/fr/orsay/lri/varna/views/VueChemProbAnnotation.java +++ /dev/null @@ -1,172 +0,0 @@ - package fr.orsay.lri.varna.views; - - - import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; - -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JSpinner; -import javax.swing.SpinnerNumberModel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.models.annotations.ChemProbAnnotation; -import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation; - - -public class VueChemProbAnnotation implements ChangeListener, ActionListener, ItemListener { - - protected VARNAPanel _vp; - private JPanel panel; - protected ChemProbAnnotation _an; - private static int CONTROL_HEIGHT = 50; - private static int TITLE_WIDTH = 70; - private static int CONTROL_WIDTH = 200; - protected JButton color = new JButton(); - JSpinner intensity; - JComboBox outward = new JComboBox(new String[]{"Inward","Outward"}); - JComboBox type = new JComboBox(ChemProbAnnotation.ChemProbAnnotationType.values()); - - public VueChemProbAnnotation(VARNAPanel vp, ChemProbAnnotation an) { - _an = an; - _vp = vp; - - panel = new JPanel(); - panel.setLayout(new FlowLayout(FlowLayout.LEFT)); - - - JPanel outlinep = new JPanel(); - JLabel l1 = new JLabel("Color: "); - l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT)); - color.setContentAreaFilled(false); - color.setOpaque(true); - color.setPreferredSize(new Dimension(CONTROL_WIDTH,CONTROL_HEIGHT)); - color.setBackground(_an.getColor()); - color.addActionListener(this); - color.setActionCommand("outline"); - outlinep.add(l1); - outlinep.add(color); - - - JPanel radiusp = new JPanel(); - l1 = new JLabel("Intensity: "); - l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT)); - SpinnerNumberModel jm = new SpinnerNumberModel(_an.getIntensity(),0.01,10.0,0.01); - intensity = new JSpinner(jm); - radiusp.add(l1); - radiusp.add(intensity); - intensity.addChangeListener(this); - - JPanel dirp = new JPanel(); - l1 = new JLabel("Direction: "); - l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT)); - outward.addItemListener(this); - dirp.add(l1); - dirp.add(outward); - - JPanel typep = new JPanel(); - l1 = new JLabel("Type: "); - l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT)); - type.addItemListener(this); - typep.add(l1); - typep.add(type); - - - - JPanel jp = new JPanel(); - jp.setLayout(new GridLayout(4,1)); - jp.add(outlinep); - jp.add(radiusp); - jp.add(dirp); - jp.add(typep); - panel.add(jp); - } - - public JPanel getPanel() { - return panel; - } - - public VARNAPanel get_vp() { - return _vp; - } - - HighlightRegionAnnotation _backup = null; - - public boolean show() { - boolean accept = false; - intensity.setValue(_an.getIntensity()); - color.setBackground(_an.getColor()); - type.setSelectedItem(_an.getType()); - outward.setSelectedItem((_an.isOut()?"Inward":"Outward")); - - if (JOptionPane.showConfirmDialog(_vp, getPanel(), - "Edit chemical probing annotation", JOptionPane.OK_CANCEL_OPTION, - JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION) - { - accept = true; - } - _vp.repaint(); - return accept; - } - - public void stateChanged(ChangeEvent e) { - if (e.getSource().equals(intensity)) - { - Object val = intensity.getValue(); - if (val instanceof Double) - { - _an.setIntensity(((Double)val).doubleValue()); - _vp.repaint(); - } - } - - } - - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("outline")) { - // BH j2s SwingJS asynchronous for JavaScript; synchronous for Java - _vp.getVARNAUI().showColorDialog("Choose new outline color", _an.getColor(), new Runnable() { - - @Override - public void run() { - Color c = (Color) _vp.getVARNAUI().dialogReturnValue; - if (c != null) { - _an.setColor(c); - color.setBackground(_an.getColor()); - _vp.repaint(); - } - } - - }); - } - - } - - public void itemStateChanged(ItemEvent e) { - if (e.getSource()==outward) - { - _an.setOut(!e.getItem().equals("Outward")); - _vp.repaint(); - } - else if ((e.getSource()==type)&&(e.getItem() instanceof ChemProbAnnotation.ChemProbAnnotationType)) - { - ChemProbAnnotation.ChemProbAnnotationType t = (ChemProbAnnotation.ChemProbAnnotationType) e.getItem(); - _an.setType(t); - _vp.repaint(); - } - - } - } - - diff --git a/src2/fr/orsay/lri/varna/views/VueColorMapStyle.java b/src2/fr/orsay/lri/varna/views/VueColorMapStyle.java deleted file mode 100644 index 6a1a836..0000000 --- a/src2/fr/orsay/lri/varna/views/VueColorMapStyle.java +++ /dev/null @@ -1,305 +0,0 @@ -package fr.orsay.lri.varna.views; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.Comparator; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JColorChooser; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.filechooser.FileFilter; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.GradientEditorPanel; -import fr.orsay.lri.varna.models.VARNAConfig; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; -import fr.orsay.lri.varna.models.rna.ModeleColorMap.NamedColorMapTypes; - -public class VueColorMapStyle extends JPanel implements ActionListener, ItemListener, PropertyChangeListener { - private VARNAPanel _vp; - private GradientEditorPanel _gp; - private JComboBox _cb; - private JTextField _code; - private ModeleColorMap _backup; - // TODO BH SwingJS note that the save dialog is never used in JavaScript - private static JFileChooser fc = new JFileChooser(){ - public void approveSelection(){ - File f = getSelectedFile(); - if(f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_OPTION); - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } - }; - - public VueColorMapStyle(VARNAPanel vp) - { - super(); - _vp = vp; - init(); - } - - private void init() - { - JLabel gradientCaption = new JLabel("Click gradient to add new color..."); - _gp = new GradientEditorPanel(_vp.getColorMap().clone()); - _backup = _vp.getColorMap(); - _gp.setPreferredSize(new Dimension(300,70)); - _gp.addPropertyChangeListener(this); - - JPanel codePanel = new JPanel(); - JLabel codeCaption = new JLabel("Param. code: "); - codeCaption.setVisible(true); - _code = new JTextField(""); - _code.setFont(Font.decode("Monospaced-PLAIN-12")); - _code.setEditable(true); - _code.addFocusListener(new FocusListener(){ - - public void focusGained(FocusEvent arg0) { - _code.setSelectionStart(0); - _code.setSelectionEnd(_code.getText().length()); - } - - public void focusLost(FocusEvent arg0) { - } - }); - _code.setVisible(false); - - NamedColorMapTypes[] palettes = ModeleColorMap.NamedColorMapTypes.values(); - Arrays.sort(palettes,new Comparator(){ - public int compare(ModeleColorMap.NamedColorMapTypes arg0, ModeleColorMap.NamedColorMapTypes arg1) { - return arg0.getId().compareTo(arg1.getId()); - } - }); - Object[] finalArray = new Object[palettes.length+1]; - int selected = -1; - for (int i=0;ito) - { - if (e.getSource().equals(_fromSlider)) - { - _toSlider.setValue(from); - } - else if (e.getSource().equals(_toSlider)) - { - _fromSlider.setValue(to); - } - } - from = _fromSlider.getValue(); - to = _toSlider.getValue(); - _an.setBases(_vp.getRNA().getBasesBetween(from, to)); - _vp.repaint(); - } - else if (e.getSource().equals(rad)) - { - Object val = rad.getValue(); - if (val instanceof Double) - { - _an.setRadius(((Double)val).doubleValue()); - } - } - - } - - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("outline")) - { - Color c = JColorChooser.showDialog(getPanel(), "Choose new outline color", _an.getOutlineColor()); - if (c!= null) - { _an.setOutlineColor(c); } - } - else if (e.getActionCommand().equals("fill")) - { - Color c = JColorChooser.showDialog(getPanel(), "Choose new fill color", _an.getFillColor()); - if (c!= null) - { _an.setFillColor(c); } - } - outlineShow.setBackground(_an.getOutlineColor()); - fillShow.setBackground(_an.getFillColor()); - _vp.repaint(); - - } - } - diff --git a/src2/fr/orsay/lri/varna/views/VueJPEG.java b/src2/fr/orsay/lri/varna/views/VueJPEG.java deleted file mode 100644 index e6741a9..0000000 --- a/src2/fr/orsay/lri/varna/views/VueJPEG.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - 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.views; - -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.GridLayout; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSlider; - -public class VueJPEG { - private JSlider qualitySlider; - private JSlider scaleSlider; - private JPanel panel; - - // Turn on labels at major tick marks. -// public VueJPEG() { -// } - - public VueJPEG(boolean showQuality, boolean showScale) { - qualitySlider = new JSlider(JSlider.HORIZONTAL, 10, 100, 75); - qualitySlider.setMajorTickSpacing(5); - qualitySlider.setPaintTicks(true); - qualitySlider.setPaintLabels(true); - qualitySlider.setPreferredSize(new Dimension(400, 50)); - scaleSlider = new JSlider(JSlider.HORIZONTAL, 0, 600, 100); - scaleSlider.setPreferredSize(new Dimension(400, 50)); - scaleSlider.setMajorTickSpacing(100); - scaleSlider.setPaintTicks(true); - scaleSlider.setPaintLabels(true); - panel = new JPanel(); - JPanel pup = new JPanel(); - JPanel pdown = new JPanel(); - int nbPanels = 0; - if (showQuality) - nbPanels++; - if (showScale) - nbPanels++; - panel.setLayout(new GridLayout(nbPanels, 1)); - pup.setLayout(new FlowLayout(FlowLayout.LEFT)); - pdown.setLayout(new FlowLayout(FlowLayout.LEFT)); - - JLabel lseq = new JLabel("Resolution:"); - JLabel lstr = new JLabel("Quality:"); - pup.add(lseq); - pup.add(scaleSlider); - pdown.add(lstr); - pdown.add(qualitySlider); - if (showQuality) { - panel.add(pup); - } - if (showScale) { - panel.add(pdown); - } - } - - public JSlider getQualitySlider() { - return qualitySlider; - } - - public JSlider getScaleSlider() { - return scaleSlider; - } - - public JPanel getPanel() { - return panel; - } -} diff --git a/src2/fr/orsay/lri/varna/views/VueListeAnnotations.java b/src2/fr/orsay/lri/varna/views/VueListeAnnotations.java deleted file mode 100644 index 6fecd1d..0000000 --- a/src2/fr/orsay/lri/varna/views/VueListeAnnotations.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * 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.views; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.filechooser.FileFilter; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.AnnotationTableModel; -import fr.orsay.lri.varna.controlers.ControleurTableAnnotations; -import fr.orsay.lri.varna.models.annotations.TextAnnotation; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; - -/** - * a view for all annoted texts on the VARNAPanel - * - * @author Darty@lri.fr - * - */ -public class VueListeAnnotations extends JPanel { - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * if this view is for removing annoted texts - */ - public static final int REMOVE = 0; - /** - * if this view is for editing annoted texts - */ - public static final int EDIT = 1; - - private VARNAPanel _vp; - private ArrayList data; - private JTable table; - private int type; - private AnnotationTableModel specialTableModel; - // BH SwingJS - this is never used in JavaScript - private static JFileChooser fc = new JFileChooser(){ - public void approveSelection(){ - File f = getSelectedFile(); - if(f.exists() && getDialogType() == SAVE_DIALOG){ - int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_OPTION); - switch(result){ - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.NO_OPTION: - return; - case JOptionPane.CLOSED_OPTION: - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - } - } - super.approveSelection(); - } - }; - - - /** - * creates the view - * - * @param vp - * @param type - * (REMOVE or EDIT) - */ - public VueListeAnnotations(VARNAPanel vp, int type) { - super(new BorderLayout()); - this.type = type; - _vp = vp; - data = new ArrayList(); - data.addAll(_vp.getListeAnnotations()); - data.addAll(_vp.getRNA().getHighlightRegion()); - data.addAll(_vp.getRNA().getChemProbAnnotations()); - createView(); - } - - private void createView() { - specialTableModel = new AnnotationTableModel(data); - table = new JTable(specialTableModel); - ControleurTableAnnotations ctrl = new ControleurTableAnnotations(table, - _vp, type); - table.addMouseListener(ctrl); - table.addMouseMotionListener(ctrl); - // table.setPreferredScrollableViewportSize(new Dimension(500, 100)); - // TODO: Find equivalent in JRE 1.5 - // table.setFillsViewportHeight(true); - // Create the scroll pane and add the table to it. - JScrollPane scrollPane = new JScrollPane(table); - - add(scrollPane, BorderLayout.CENTER); - - FileFilter CPAFiles = new FileFilter(){ - public boolean accept(File f) { - return f.getName().toLowerCase().endsWith(".cpa") || f.isDirectory(); - } - - public String getDescription() { - return "Chemical Probing Annotations (*.cpa) Files"; - } - - }; - fc.addChoosableFileFilter(CPAFiles); - fc.setFileFilter(CPAFiles); - - - JButton loadStyleButton = new JButton("Load"); - loadStyleButton.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e) { - if (fc.showOpenDialog(VueListeAnnotations.this)==JFileChooser.APPROVE_OPTION) - { - File file = fc.getSelectedFile(); - try { - BufferedReader br = new BufferedReader(new FileReader(file)); - String s = br.readLine(); - while(s != null) - { - if (s.startsWith(TextAnnotation.HEADER_TEXT)) - s = br.readLine(); - } - // TODO - } catch (FileNotFoundException e1) { - e1.printStackTrace(); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - }); - JButton saveStyleButton = new JButton("Save"); - saveStyleButton.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e) { - if (fc.showSaveDialog(VueListeAnnotations.this)==JFileChooser.APPROVE_OPTION) - { - try { - PrintWriter out = new PrintWriter(fc.getSelectedFile()); - // TODO out.println(_gp.getColorMap().getParamEncoding()); - out.close(); - } catch (FileNotFoundException e1) { - e1.printStackTrace(); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - }); - saveStyleButton.setAlignmentX(CENTER_ALIGNMENT); - loadStyleButton.setAlignmentX(CENTER_ALIGNMENT); - - JPanel jp2 = new JPanel(); - BoxLayout bl = new BoxLayout(jp2, BoxLayout.X_AXIS); - jp2.setLayout(bl); - jp2.setAlignmentX(CENTER_ALIGNMENT); - jp2.add(loadStyleButton); - jp2.add(Box.createRigidArea(new Dimension(5,0))); - jp2.add(saveStyleButton); - this.add(jp2,BorderLayout.SOUTH); - - - - UIvueListeAnnotations(); - } - - /** - * Create the GUI and show it. For thread safety, this method should be - * invoked from the event-dispatching thread. - */ - public void UIvueListeAnnotations() { - JComponent newContentPane = this; - newContentPane.setOpaque(true); - JOptionPane.showMessageDialog(_vp, newContentPane, - "Annotation edition", JOptionPane.PLAIN_MESSAGE); - } - - public ArrayList getData() { - return data; - } - - public void setData(ArrayList data) { - this.data = data; - } - - public VARNAPanel get_vp() { - return _vp; - } - - public JTable getTable() { - return table; - } - - public void setTable(JTable table) { - this.table = table; - } - - public AnnotationTableModel getSpecialTableModel() { - return specialTableModel; - } - - public void setSpecialTableModel(AnnotationTableModel specialTableModel) { - this.specialTableModel = specialTableModel; - } -} diff --git a/src2/fr/orsay/lri/varna/views/VueLoadColorMapValues.java b/src2/fr/orsay/lri/varna/views/VueLoadColorMapValues.java deleted file mode 100644 index 3bfb27a..0000000 --- a/src2/fr/orsay/lri/varna/views/VueLoadColorMapValues.java +++ /dev/null @@ -1,116 +0,0 @@ -package fr.orsay.lri.varna.views; - -import java.awt.CardLayout; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JTextField; - -import fr.orsay.lri.varna.VARNAPanel; - -public class VueLoadColorMapValues extends JPanel implements ActionListener { - /** - * - */ - private static final long serialVersionUID = -1648400107478203724L; - VARNAPanel _vp; - - public VueLoadColorMapValues(VARNAPanel vp) - { - _vp = vp; - init(); - } - JRadioButton urlCB = new JRadioButton("URL"); - JRadioButton fileCB = new JRadioButton("File"); - JPanel urlAux = new JPanel(); - JPanel fileAux = new JPanel(); - CardLayout l = new CardLayout(); - JPanel input = new JPanel(); - JTextField urlTxt = new JTextField(); - JTextField fileTxt = new JTextField(); - JButton load = new JButton("Choose file"); - - private void init() - { - setLayout(new GridLayout(2,1)); - JPanel choice = new JPanel(); - urlCB.addActionListener(this); - fileCB.addActionListener(this); - ButtonGroup group = new ButtonGroup(); - group.add(urlCB); - group.add(fileCB); - choice.add(new JLabel("Choose input source:")); - choice.add(urlCB); - choice.add(fileCB); - input.setLayout(l); - urlTxt.setPreferredSize(new Dimension(300,30)); - fileTxt.setPreferredSize(new Dimension(300,30)); - urlAux.add(urlTxt); - fileAux.add(fileTxt); - fileAux.add(load); - input.add(fileAux,"file"); - input.add(urlAux,"url"); - group.setSelected(fileCB.getModel(), true); - load.addActionListener(this); - this.add(choice); - this.add(input); - } - -public void actionPerformed(ActionEvent e) { - if (e.getSource() instanceof JRadioButton) - { - if (urlCB.isSelected()) - { - l.show(input, "url"); - } - else - { - l.show(input, "file"); - } - } - else if (e.getSource() instanceof JButton) - { - JFileChooser fc = new JFileChooser(); - if (fc.showOpenDialog(_vp) == JFileChooser.APPROVE_OPTION) - { - this.fileTxt.setText(fc.getSelectedFile().getAbsolutePath()); - } - } -} - -public Reader getReader() throws IOException -{ - if (urlCB.isSelected()) - { - URL url = new URL(urlTxt.getText()); - URLConnection connexion = url.openConnection(); - connexion.setUseCaches(false); - InputStream r = connexion.getInputStream(); - return new InputStreamReader(r); - } - else - { - return new FileReader(fileTxt.getText()); - } - -} - -} diff --git a/src2/fr/orsay/lri/varna/views/VueManualInput.java b/src2/fr/orsay/lri/varna/views/VueManualInput.java deleted file mode 100644 index 07aef4a..0000000 --- a/src2/fr/orsay/lri/varna/views/VueManualInput.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - 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.views; - -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.GridLayout; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import fr.orsay.lri.varna.VARNAPanel; - - -public class VueManualInput { - - private VARNAPanel _vp; - private JPanel panel; - private JTextField tseq, tstr; - - public VueManualInput(VARNAPanel vp) { - _vp = vp; - buildView(); - } - - private void buildView() { - panel = new JPanel(); - JPanel pup = new JPanel(); - JPanel pdown = new JPanel(); - panel.setLayout(new GridLayout(2, 1)); - pup.setLayout(new FlowLayout(FlowLayout.LEFT)); - pdown.setLayout(new FlowLayout(FlowLayout.LEFT)); - - Font _textFieldsFont = Font.decode("MonoSpaced-PLAIN-12"); - - JLabel lseq = new JLabel("Sequence:"); - tseq = new JTextField(_vp.getRNA().getListeBasesToString()); - JLabel lstr = new JLabel("Structure:"); - tstr = new JTextField(_vp.getRNA().getStructDBN()); - tstr - .setPreferredSize(new Dimension(400, - tstr.getPreferredSize().height)); - tseq - .setPreferredSize(new Dimension(400, - tseq.getPreferredSize().height)); - tstr.setFont(_textFieldsFont); - tseq.setFont(_textFieldsFont); - pup.add(lseq); - pup.add(tseq); - pdown.add(lstr); - pdown.add(tstr); - panel.add(pup); - panel.add(pdown); - } - - public JPanel getPanel() { - return panel; - } - - public void setPanel(JPanel panel) { - this.panel = panel; - } - - public JTextField getTseq() { - return tseq; - } - - public JTextField getTstr() { - return tstr; - } -} diff --git a/src2/fr/orsay/lri/varna/views/VueMenu.java b/src2/fr/orsay/lri/varna/views/VueMenu.java deleted file mode 100644 index f7ee43f..0000000 --- a/src2/fr/orsay/lri/varna/views/VueMenu.java +++ /dev/null @@ -1,495 +0,0 @@ -/* - 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.views; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Font; -import java.awt.Point; -import java.awt.event.KeyEvent; -import java.util.ArrayList; - -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import javax.swing.JSeparator; -import javax.swing.KeyStroke; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurMenu; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VueMenu extends JPopupMenu { - /** - * - */ - private static final long serialVersionUID = 1L; - - private VARNAPanel _vp; - - private ControleurMenu _controlerMenu; - - private JCheckBoxMenuItem _itemOptionSpecialBaseColored = new JCheckBoxMenuItem( - "Custom colored", false); - private JCheckBoxMenuItem _itemShowWarnings = new JCheckBoxMenuItem( - "Show warnings", false); - private JCheckBoxMenuItem _itemDrawBackbone = new JCheckBoxMenuItem( - "Draw backbone", true); - private JCheckBoxMenuItem _itemOptionGapsBaseColored = new JCheckBoxMenuItem( - "Custom colored", false); - private JCheckBoxMenuItem _itemOptionBondsColored = new JCheckBoxMenuItem( - "Use base color for base-pairs", false); - private JCheckBoxMenuItem _itemShowNCBP = new JCheckBoxMenuItem( - "Show non-canonical BPs", true); - private JCheckBoxMenuItem _itemShowOnlyPlanar = new JCheckBoxMenuItem( - "Hide tertiary BPs", false); - private JCheckBoxMenuItem _itemFlatExteriorLoop = new JCheckBoxMenuItem( - "Flat exterior loop", false); - - private JCheckBoxMenuItem _itemShowColorMap = new JCheckBoxMenuItem( - "Show color map", false); - private JMenuItem _dashBasesColor; - - private ArrayList _disabled = new ArrayList(); - - private JMenuItem _rotation; - private JMenuItem _bpHeightIncrement; - - private Point _spawnOrigin = new Point(-1,-1); - - public VueMenu(VARNAPanel vp) { - _vp = vp; - _controlerMenu = new ControleurMenu(_vp, this); - } - - private void addTitle(String title, boolean keep) { - // TOD BH SwingJS -- this should not be necessary - JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator - //JSeparator sep = new JSeparator(); - JMenuItem titleItem = new JMenuItem(" " + title);//BH SwingJS was JLabel -- need to be able to do this. - // titleItem.setAlignmentX(0.5f); - Font previousFont = titleItem.getFont(); - Font futureFont = previousFont.deriveFont(Font.BOLD).deriveFont( - (float) previousFont.getSize() + 1.0f); - - titleItem.setFont(futureFont); - Color current = titleItem.getForeground(); - Color future = current.brighter().brighter(); - // titleItem.setBackground(future); - titleItem.setForeground(future); - add(titleItem); - add(sep); - if (!keep) { - _disabled.add(sep); - _disabled.add(titleItem); - } - } - - private void configMenuItem(JMenuItem mi, String command, String keyStroke, Container par) - { configMenuItem(mi,command,keyStroke,par,false); } - - private void configMenuItem(JMenuItem mi, String command, String keyStroke, Container par, boolean disabled) - { - mi.setActionCommand(command); - mi.addActionListener(_controlerMenu); - if (keyStroke!=null) - if (!keyStroke.equals("")) - mi.setAccelerator(KeyStroke.getKeyStroke(keyStroke)); - if (disabled) - { _disabled.add(mi);} - par.add(mi); - } - - private JMenuItem createMenuItem(String caption, String command, String keyStroke, Container par, boolean disabled) - { - JMenuItem mi = new JMenuItem(caption); - configMenuItem(mi, command,keyStroke, par, disabled); - return mi; - } - - private JMenuItem createMenuItem(String caption, String command, String keyStroke, Container par) - { return createMenuItem(caption, command, keyStroke, par,false); } - - - public void updateDialog() { - for (int i = 0; i < _disabled.size(); i++) { - JComponent j = _disabled.get(i); - j.setVisible(_vp.isModifiable()); - } - _itemOptionSpecialBaseColored.setState(_vp.getColorSpecialBases()); - _itemShowWarnings.setState(_vp.getShowWarnings()); - _itemOptionGapsBaseColored.setState(_vp.getColorGapsBases()); - _itemOptionGapsBaseColored.setEnabled(_vp.isComparisonMode()); - _dashBasesColor.setEnabled(_vp.isComparisonMode()); - - _rotation.setEnabled(_vp.getDrawMode() != RNA.DRAW_MODE_LINEAR); - _bpHeightIncrement.setEnabled(_vp.getDrawMode() == RNA.DRAW_MODE_LINEAR); - - _itemOptionBondsColored.setState(_vp.getUseBaseColorsForBPs()); - _itemShowNCBP.setState(_vp.getShowNonCanonicalBP()); - _itemShowOnlyPlanar.setState(!_vp.getShowNonPlanarBP()); - _itemShowColorMap.setState(_vp.getColorMapVisible()); - _itemFlatExteriorLoop.setState(_vp.getFlatExteriorLoop()); - _itemFlatExteriorLoop.setEnabled(_vp.getDrawMode() == RNA.DRAW_MODE_RADIATE); - } - - /** - * Builds the popup menu - */ - public void buildPopupMenu() { - addTitle("File", true); - fileMenu(); - exportMenu(); - createMenuItem("Print...", "print", "control P", this); - addSeparator(); - - addTitle("Display", true); - viewMenu(); - displayMenu(); - //JSeparator sep = new JSeparator(); - // TODO BH SwingJS - this should not be necessary - JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator - add(sep); - _disabled.add(sep); - - addTitle("Edit", false); - editRNAMenu(); - redrawMenu(); - colorClassesMenu(); - annotationMenu(); - _disabled.add(_itemShowNCBP); - _disabled.add(_itemShowOnlyPlanar); - aboutMenu(); - } - - private void annotationMenu() { - JMenu submenuAnnotations = new JMenu("Annotations"); - JMenu addAnnotations = new JMenu("New"); - createMenuItem("Here", "annotationsaddPosition", "", addAnnotations); - createMenuItem("Base", "annotationsaddBase", "", addAnnotations); - createMenuItem("Loop", "annotationsaddLoop", "", addAnnotations); - createMenuItem("Helix", "annotationsaddHelix", "", addAnnotations); - //JSeparator sep = new JSeparator(); - JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator - - addAnnotations.add(sep); - createMenuItem("Region", "annotationsaddRegion", "", addAnnotations); - createMenuItem("Chem. prob.", "annotationsaddChemProb", "", addAnnotations); - submenuAnnotations.add(addAnnotations); - createMenuItem("Edit from list...", "annotationsedit", "", submenuAnnotations); - createMenuItem("Remove from list...", "annotationsremove", "", submenuAnnotations); - submenuAnnotations.addSeparator(); - createMenuItem("Auto 5'/3'", "annotationsautoextremites", "control alt Q", submenuAnnotations); - createMenuItem("Auto helices", "annotationsautohelices", "control Q", submenuAnnotations); - createMenuItem("Auto interior loops", "annotationsautointerior", "alt shift Q", submenuAnnotations); - createMenuItem("Auto terminal loops", "annotationsautoterminal", "control shift Q", submenuAnnotations); - add(submenuAnnotations); - } - - private void fileMenu() { - createMenuItem("New...", "userInput", "control N", this,true); - createMenuItem("Open...", "file", "control O", this,true); - createMenuItem("Save...", "saveas", "control S", this,true); - JMenu submenuSave = new JMenu("Save as"); - createMenuItem("DBN (Vienna)", "dbn", "", submenuSave); - createMenuItem("BPSEQ", "bpseq", "", submenuSave); - createMenuItem("CT", "ct", "", submenuSave); - add(submenuSave); - } - - private void exportMenu() { - // Export menu - JMenu submenuExport = new JMenu("Export"); - createMenuItem("SVG", "svg", "", submenuExport); - createMenuItem("PGF/TIKZ", "tikz", "", submenuExport); - createMenuItem("XFIG", "xfig", "", submenuExport); - submenuExport.addSeparator(); - createMenuItem("EPS", "eps", "", submenuExport); - submenuExport.addSeparator(); - createMenuItem("PNG", "png", "", submenuExport); - createMenuItem("JPEG", "jpeg", "", submenuExport); - add(submenuExport); - } - - - private void displayMenu() { - - // SubMenu Base-pairs - JMenu subMenuBasePairs = new JMenu("Base Pairs"); - createMenuItem("BP style...", "bpstyle", "control shift P", subMenuBasePairs); - configMenuItem(_itemShowNCBP, "shownc", "control W", subMenuBasePairs); - configMenuItem(_itemShowOnlyPlanar, "shownp", "control E", subMenuBasePairs); - // SubMenu Non standard Bases - JMenu subMenuNSBases = new JMenu("Non-standard bases"); - configMenuItem(_itemOptionSpecialBaseColored, "specialbasecolored", "control J", subMenuNSBases); - createMenuItem("Color", "specialBasesColor", "control shift J", subMenuNSBases); - // SubMenu Gaps Bases - JMenu subMenuGapsBases = new JMenu("'Gaps' bases"); - configMenuItem(_itemOptionGapsBaseColored, "dashbasecolored", "control D", subMenuGapsBases); - _dashBasesColor = createMenuItem("Color", "dashBasesColor", "control shift D", subMenuGapsBases); - // Removable separator - //JSeparator sep = new JSeparator(); - JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator - _disabled.add(sep); - - // Style menu - JMenu submenuStyle = new JMenu("RNA style"); - createMenuItem("Toggle draw bases", "gaspin", "alt G", submenuStyle,true); - submenuStyle.add(subMenuBasePairs); - submenuStyle.addSeparator(); - submenuStyle.add(subMenuNSBases); - submenuStyle.add(subMenuGapsBases); - submenuStyle.add(sep); - createMenuItem("Backbone color", "backbone", "control K", submenuStyle,true); - configMenuItem(_itemDrawBackbone, "showbackbone", "alt B", submenuStyle); - - // Submenu Title - JMenu submenuTitle = new JMenu("Title"); - createMenuItem("Set Title", "setTitle", "control T", submenuTitle, true); - createMenuItem("Font", "titleDisplay", "control shift T", submenuTitle, true); - createMenuItem("Color", "titleColor", "control alt T", submenuTitle, true); - _disabled.add(submenuTitle); - - // Color map menu - JMenu submenuColorMap = new JMenu("Color map"); - configMenuItem(_itemShowColorMap, "toggleshowcolormap", "control shift L", submenuColorMap, false); - createMenuItem("Caption", "colormapcaption", "control shift C", submenuColorMap,true); - createMenuItem("Style...", "colormapstyle", "control L", submenuColorMap,false); - submenuColorMap.addSeparator(); - createMenuItem("Edit values...", "colormapvalues", "shift L", submenuColorMap,true); - createMenuItem("Load values...", "colormaploadvalues", "control shift K", submenuColorMap,true); - _disabled.add(submenuColorMap); - - // Menu Misc - JMenu submenuMisc = new JMenu("Misc"); - createMenuItem("Num. period.", "numPeriod", "control M", submenuMisc); - createMenuItem("Background color", "background", "control G", submenuMisc); - submenuMisc.add(submenuTitle); - - // Main menu - add(submenuStyle); - add(submenuColorMap); - add(submenuMisc); - - } - - private void editRNAMenu() - { - createMenuItem("Bases...","editallbases","",this,true); - createMenuItem("BasePairs...","editallbps","",this,true); - } - - private void redrawMenu() { - JMenu submenuRedraw = new JMenu("Redraw"); - _disabled.add(submenuRedraw); - - JMenu submenuAlgorithms = new JMenu("Algorithm"); - _disabled.add(submenuAlgorithms); - - createMenuItem("Linear","line","control 1",submenuAlgorithms,true); - createMenuItem("Circular","circular","control 2",submenuAlgorithms,true); - createMenuItem("Radiate","radiate","control 3",submenuAlgorithms,true); - createMenuItem("NAView","naview","control 4",submenuAlgorithms,true); - //createMenuItem("VARNAView","varnaview","control 5",submenuAlgorithms,true); - //createMenuItem("MOTIFView","motifview","control 6",submenuAlgorithms,true); - submenuRedraw.add(submenuAlgorithms); - - // Sets the height increment in LINEAR_MODE type of drawing - _bpHeightIncrement = createMenuItem("BP height increment","bpheightincrement","control H",submenuRedraw); - configMenuItem(_itemFlatExteriorLoop, "flat", "control F", submenuRedraw, true); - - // Item pour le r�glage de l'espace entre chaques bases - createMenuItem("Space between bases","spaceBetweenBases","control shift S",submenuRedraw,true); - createMenuItem("Reset","reset","control shift R",submenuRedraw,true); - - add(submenuRedraw); - } - - @SuppressWarnings("unused") - private void warningMenu() { - // Menu showWarning - configMenuItem(_itemShowWarnings, "showwarnings", "", this, true); - } - - private void viewMenu() { - // View menu - JMenu submenuView = new JMenu("View"); - - // Zoom submenu - JMenu zoomDisplay = new JMenu("Zoom"); - createMenuItem("25%","zoom25","",zoomDisplay); - createMenuItem("50%","zoom50","",zoomDisplay); - createMenuItem("100%","zoom100","",zoomDisplay); - createMenuItem("150%","zoom150","",zoomDisplay); - createMenuItem("200%","zoom200","",zoomDisplay); - createMenuItem("Custom","zoom","control Z",zoomDisplay); - submenuView.add(zoomDisplay); - _rotation = createMenuItem("Rotation...","rotation","control R",submenuView); - createMenuItem("Rescale...","rescale","",submenuView); - submenuView.addSeparator(); - createMenuItem("Border size","borderSize","control B",submenuView); - - add(submenuView); - - } - - JMenu _subMenuBases; - - private Component _selectionMenuIndex = null; - - public void addSelectionMenu(JMenuItem s) { - _selectionMenuIndex = s; - _disabled.add(s); - insert(s, getComponentCount() - 2); - } - - public void removeSelectionMenu() { - if (_selectionMenuIndex != null) { - this.remove(_selectionMenuIndex); - _selectionMenuIndex = null; - } - } - - private void colorClassesMenu() { - // Menu Bases - _subMenuBases = new JMenu("Colors"); - _disabled.add(_subMenuBases); - createMenuItem("By Base","eachKind","control U",_subMenuBases,true); - createMenuItem("By BP","eachCouple","shift U",_subMenuBases,true); - createMenuItem("By Position","eachBase","alt U",_subMenuBases,true); - add(_subMenuBases); - } - - /** - * add default color options to a menu - */ - public void addColorOptions(JMenu submenu) { - createMenuItem("Fill Color",submenu.getActionCommand() + ",InnerColor","",submenu,true); - createMenuItem("Stroke Color",submenu.getActionCommand() + ",OutlineColor","",submenu,true); - createMenuItem("Label Color",submenu.getActionCommand() + ",NameColor","",submenu,true); - submenu.addSeparator(); - createMenuItem("BP Color",submenu.getActionCommand() + ",BPColor","",submenu,true); - createMenuItem("BP Thickness",submenu.getActionCommand() + ",BPThickness","",submenu,true); - submenu.addSeparator(); - createMenuItem("Number Color",submenu.getActionCommand() + ",NumberColor","",submenu,true); - } - - private void aboutMenu() { - addSeparator(); - createMenuItem("About VARNA", "about", "control A", this); - } - - public void addAnnotationMenu(JMenu menu) { - addAnnotationMenu(menu, false); - } - - public void addAnnotationMenu(JMenu menu, boolean existingAnnot) { - String title = "Annotation"; - if (existingAnnot) - { - String debut = ""; - String texte = _vp.get_selectedAnnotation().getTexte(); - if (texte.length() < 5) - debut = texte; - else - debut = texte.substring(0, 5) + "..."; - title = "Annotation: " + debut; - } - JMenu menuAnnotation = new JMenu(title); - if (!existingAnnot) - createMenuItem("Add",menu.getActionCommand() + "annotationadd","",menuAnnotation,true); - createMenuItem("Edit",menu.getActionCommand() + "annotationedit","",menuAnnotation,true); - createMenuItem("Remove",menu.getActionCommand() + "annotationremove","",menuAnnotation,true); - menu.add(menuAnnotation); - } - - - public static long getSerialVersionUID() { - return serialVersionUID; - } - - public VARNAPanel get_vp() { - return _vp; - } - - public ControleurMenu get_controleurMenu() { - return _controlerMenu; - } - - public JCheckBoxMenuItem get_itemOptionSpecialBaseColored() { - return _itemOptionSpecialBaseColored; - } - - public JCheckBoxMenuItem get_itemShowWarnings() { - return _itemShowWarnings; - } - - public JCheckBoxMenuItem get_itemOptionDashBaseColored() { - return _itemOptionGapsBaseColored; - } - - public void set_controleurMenu(ControleurMenu menu) { - _controlerMenu = menu; - } - - public void set_itemOptionSpecialBaseColored( - JCheckBoxMenuItem optionSpecialBaseColored) { - _itemOptionSpecialBaseColored = optionSpecialBaseColored; - } - - public void set_itemShowWarnings(JCheckBoxMenuItem showWarnings) { - _itemShowWarnings = showWarnings; - } - - public void set_itemOptionDashBaseColored( - JCheckBoxMenuItem optionDashBaseColored) { - _itemOptionGapsBaseColored = optionDashBaseColored; - } - - public JMenuItem get_rotation() { - return _rotation; - } - - public void set_rotation(JMenuItem _rotation) { - this._rotation = _rotation; - } - - public JCheckBoxMenuItem get_itemOptionBondsColored() { - return _itemOptionBondsColored; - } - - public void set_itemOptionBondsColored(JCheckBoxMenuItem optionBondsColored) { - _itemOptionBondsColored = optionBondsColored; - } - - - public void show(Component invoker,int x,int y) { - _spawnOrigin = new Point(x,y); - super.show(invoker,x,y); - } - - public Point getSpawnPoint() - { - return _spawnOrigin ; - } - -} \ No newline at end of file diff --git a/src2/fr/orsay/lri/varna/views/VueNumPeriod.java b/src2/fr/orsay/lri/varna/views/VueNumPeriod.java deleted file mode 100644 index e092304..0000000 --- a/src2/fr/orsay/lri/varna/views/VueNumPeriod.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - 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.views; - -import java.awt.Dimension; -import java.awt.FlowLayout; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSlider; - - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurNumPeriod; -import fr.orsay.lri.varna.controlers.ControleurSliderLabel; - -public class VueNumPeriod { - private VARNAPanel _vp; - private JPanel panel; - private JSlider numPeriodSlider; - - public VueNumPeriod(VARNAPanel vp) { - _vp = vp; - panel = new JPanel(); - - int maxPeriod = _vp.getRNA().get_listeBases().size(); - numPeriodSlider = new JSlider(JSlider.HORIZONTAL, 1, maxPeriod, Math - .min(_vp.getNumPeriod(), maxPeriod)); - // Turn on labels at major tick marks. - numPeriodSlider.setMajorTickSpacing(10); - numPeriodSlider.setMinorTickSpacing(5); - numPeriodSlider.setPaintTicks(true); - numPeriodSlider.setPaintLabels(true); - - JLabel numLabel = new JLabel(String.valueOf(_vp.getNumPeriod())); - numLabel.setPreferredSize(new Dimension(50, - numLabel.getPreferredSize().height)); - numPeriodSlider.addChangeListener(new ControleurSliderLabel(numLabel, - false)); - numPeriodSlider.addChangeListener(new ControleurNumPeriod(this)); - - panel = new JPanel(); - panel.setLayout(new FlowLayout(FlowLayout.LEFT)); - - JLabel labelS = new JLabel("NumPeriod:"); - - panel.add(labelS); - panel.add(numPeriodSlider); - panel.add(numLabel); - } - - public VARNAPanel get_vp() { - return _vp; - } - - public JPanel getPanel() { - return panel; - } - - public int getNumPeriod() { - return numPeriodSlider.getValue(); - } -} diff --git a/src2/fr/orsay/lri/varna/views/VueRNAList.java b/src2/fr/orsay/lri/varna/views/VueRNAList.java deleted file mode 100644 index 1fc7e28..0000000 --- a/src2/fr/orsay/lri/varna/views/VueRNAList.java +++ /dev/null @@ -1,195 +0,0 @@ -package fr.orsay.lri.varna.views; - - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyVetoException; -import java.beans.VetoableChangeListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Vector; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableColumn; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.components.ColorRenderer; -import fr.orsay.lri.varna.models.rna.ModeleBase; -import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; -import fr.orsay.lri.varna.models.rna.ModeleColorMap; -import fr.orsay.lri.varna.models.rna.RNA; - -public class VueRNAList extends JPanel implements TableModelListener, ActionListener { - - private JTable table; - private ValueTableModel _tm; - private ArrayList data; - private ArrayList columns; - private ArrayList included; - - - public VueRNAList( ArrayList rnas) - { - super(new BorderLayout()); - data = rnas; - init(); - } - - public ArrayList getSelectedRNAs() - { - ArrayList result = new ArrayList(); - for (int i = 0; i < data.size(); i++) - { - if (included.get(i)) - { - result.add(data.get(i)); - } - } - return result; - } - - private void init() - { - Object[] col = {"Num","Selected","Name","ID","Length"}; - columns = new ArrayList(); - for (int i = 0; i < col.length; i++) - { - columns.add(col[i]); - } - included = new ArrayList(); - for (int i = 0; i < data.size(); i++) - { - included.add(new Boolean(true)); - } - - - _tm = new ValueTableModel(); - table = new JTable(_tm); - table.setDefaultRenderer(Color.class, new ColorRenderer(true)); - table.setPreferredScrollableViewportSize(new Dimension(600, 300)); - table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - TableColumn c0 = table.getColumnModel().getColumn(0); - c0.setPreferredWidth(30); - TableColumn c1 = table.getColumnModel().getColumn(1); - c1.setPreferredWidth(30); - TableColumn c2 = table.getColumnModel().getColumn(2); - c2.setPreferredWidth(200); - TableColumn c3 = table.getColumnModel().getColumn(3); - c3.setPreferredWidth(200); - TableColumn c4 = table.getColumnModel().getColumn(4); - c4.setPreferredWidth(30); - table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); - table.getModel().addTableModelListener(this); - - JScrollPane scrollPane = new JScrollPane(table); - this.add(scrollPane,BorderLayout.CENTER); - JPanel jp = new JPanel(); - JPanel jpl = new JPanel(); - JPanel jpr = new JPanel(); - jp.setLayout(new BorderLayout()); - jp.add(jpl,BorderLayout.WEST); - jp.add(jpr,BorderLayout.EAST); - jp.add(new JLabel("Please select which model(s) should be imported." ),BorderLayout.SOUTH); - JButton selectAll = new JButton("Select All"); - selectAll.addActionListener(this); - selectAll.setActionCommand("all"); - JButton deselectAll = new JButton("Deselect All"); - deselectAll.addActionListener(this); - deselectAll.setActionCommand("none"); - jpl.add(selectAll); - jpr.add(deselectAll); - - add(scrollPane,BorderLayout.CENTER); - add(jp,BorderLayout.SOUTH); - } - - - - private class ValueTableModel extends AbstractTableModel { - public String getColumnName(int col) { - return columns.get(col).toString(); - } - public int getRowCount() { return data.size(); } - public int getColumnCount() { return columns.size(); } - public Object getValueAt(int row, int col) { - RNA r = data.get(row); - if (col==0) - { - return new Integer(row+1); - } - else if (col==1) - { - return new Boolean(included.get(row)); - } - else if (col==2) - { - return new String(r.getName()); - } - else if (col==3) - { - return new String(r.getID()); - } - else if (col==4) - { - return new Integer(r.getSize()); - } - return "N/A"; - } - public boolean isCellEditable(int row, int col) - { - if (col==1) - return true; - return false; - } - public void setValueAt(Object value, int row, int col) { - if (col==1) - { - included.set(row, (Boolean)value); - fireTableCellUpdated(row, col); - } - } - public Class getColumnClass(int c) { - return getValueAt(0, c).getClass(); - } - } - - public void tableChanged(TableModelEvent e) { - if (e.getType() == TableModelEvent.UPDATE) - { - table.repaint(); - } - - } - - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("none")) - { - for(int i=0;i 0 ? close_final_error[0] : null); - finalCallback = (close_final_error.length > 1 ? close_final_error[1] : null); - errorCallback = (close_final_error.length > 2 ? close_final_error[2] : null); - onDialogReturn(JOptionPane.showConfirmDialog(_vp, optionPanel, title, JOptionPane.OK_CANCEL_OPTION)); - } - - /** - * BH SwingJS - * - * Initiate an input dialog with callbacks. - * - * @param message - * @param initialValue - * @param input - * @param close_final_error optional [close,finally,error] - */ - public void showInputDialog(String message, Object initialValue, Runnable input, Runnable... close_final_error) { - objectCallback = input; - closeBtnCallback = (close_final_error.length > 0 ? close_final_error[0] : null); - finalCallback = (close_final_error.length > 1 ? close_final_error[1] : null); - errorCallback = (close_final_error.length > 2 ? close_final_error[2] : null); - onDialogReturn(JOptionPane.showInputDialog(_vp, message, initialValue)); - } - - /** - * BH SwingJS - * - * Initiate an color chooser dialog with callbacks. - * - * @param message - * @param initialValue - * @param input - * @param close_final_error optional [close,finally,error] - */ - public void showColorDialog(String message, Object initialValue, Runnable ret) { - objectCallback = ret; - onDialogReturn(JColorChooser.showDialog(_vp, message, (Color) initialValue)); - } - - - /** - * BH SwingJS - * - * A general method to handle all the showInputDialog, JFileChooser, and JColorChooser callbacks from all the VueXXX classes. - * - * The initial return to be ignored is an object that is an instanceof UIResource. - * - */ - public void onDialogReturn(Object value) { - dialogReturnValue = value; - if (objectCallback != null && !(value instanceof UIResource)) - objectCallback.run(); - } - - /** - * BH SwingJS - * - * A general method to handle all the showConfirmDialog callbacks from all - * the VueXXX classes. - * - * The initial return to be ignored is NaN, testable as - * value != Math.floor(value). - * - */ - public void onDialogReturn(int value) { - try { - switch (value) { - case JOptionPane.OK_OPTION | JOptionPane.YES_OPTION: - if (okBtnCallback != null) - okBtnCallback.run(); - break; - case JOptionPane.NO_OPTION: - if (noBtnCallback != null) - noBtnCallback.run(); - break; - case JOptionPane.CANCEL_OPTION: - if (cancelBtnCallback != null) - cancelBtnCallback.run(); - break; - case JOptionPane.CLOSED_OPTION: - if (closeBtnCallback != null) - closeBtnCallback.run(); - break; - } - } catch (Throwable e) { - dialogError = e; - if (errorCallback != null) - errorCallback.run(); - } finally { - if (value != Math.floor(value)) { - // asynchronous deferred - return; - } - if (finalCallback != null) - finalCallback.run(); - okBtnCallback = noBtnCallback = cancelBtnCallback = closeBtnCallback = errorCallback = objectCallback = null; - dialogError = null; - } - } - - - protected VARNAPanel _vp; - private File _fileChooserDirectory = null; - private UndoableEditSupport _undoableEditSupport; - - public VueUI(VARNAPanel vp) { - _vp = vp; - _undoableEditSupport = new UndoableEditSupport(_vp); - } - - public void addUndoableEditListener(UndoManager manager) { - _undoableEditSupport.addUndoableEditListener(manager); - } - - public void UIToggleColorMap() { - if (_vp.isModifiable()) { - _vp.setColorMapVisible(!_vp.getColorMapVisible()); - _vp.repaint(); - } - } - - public void UIToggleDrawBackbone() { - if (_vp.isModifiable()) { - _vp.setDrawBackbone(!_vp.getDrawBackbone()); - _vp.repaint(); - } - } - - public Hashtable backupAllCoords() { - Hashtable tmp = new Hashtable(); - for (int i = 0; i < _vp.getRNA().getSize(); i++) { - tmp.put(i, _vp.getRNA().getCoords(i)); - } - return tmp; - } - - public void UIToggleFlatExteriorLoop() { - if (_vp.isModifiable() - && _vp.getRNA().get_drawMode() == RNA.DRAW_MODE_RADIATE) { - Hashtable bck = backupAllCoords(); - _undoableEditSupport.postEdit(new VARNAEdits.RedrawEdit( - RNA.DRAW_MODE_RADIATE, _vp, !_vp.getFlatExteriorLoop())); - _vp.setFlatExteriorLoop(!_vp.getFlatExteriorLoop()); - _vp.reset(); - _vp.drawRNA(_vp.getRNA(), RNA.DRAW_MODE_RADIATE); - _vp.repaint(); - _vp.fireLayoutChanged(bck); - } - } - - public void UIRadiate() { - if (_vp.isModifiable()) { - Hashtable bck = backupAllCoords(); - _undoableEditSupport.postEdit(new VARNAEdits.RedrawEdit( - RNA.DRAW_MODE_RADIATE, _vp)); - _vp.reset(); - _vp.drawRNA(_vp.getRNA(), RNA.DRAW_MODE_RADIATE); - _vp.repaint(); - _vp.fireLayoutChanged(bck); - } - } - - public void UIMOTIFView() { - if (_vp.isModifiable()) { - Hashtable bck = backupAllCoords(); - _undoableEditSupport.postEdit(new VARNAEdits.RedrawEdit( - RNA.DRAW_MODE_MOTIFVIEW, _vp)); - _vp.reset(); - _vp.drawRNA(_vp.getRNA(), RNA.DRAW_MODE_MOTIFVIEW); - _vp.repaint(); - _vp.fireLayoutChanged(bck); - } - } - - public void UILine() { - if (_vp.isModifiable()) { - Hashtable bck = backupAllCoords(); - _undoableEditSupport.postEdit(new VARNAEdits.RedrawEdit( - RNA.DRAW_MODE_LINEAR, _vp)); - _vp.reset(); - _vp.drawRNA(_vp.getRNA(), RNA.DRAW_MODE_LINEAR); - _vp.repaint(); - _vp.fireLayoutChanged(bck); - } - } - - public void UICircular() { - if (_vp.isModifiable()) { - Hashtable bck = backupAllCoords(); - _undoableEditSupport.postEdit(new VARNAEdits.RedrawEdit( - RNA.DRAW_MODE_CIRCULAR, _vp)); - _vp.reset(); - _vp.drawRNA(_vp.getRNA(), RNA.DRAW_MODE_CIRCULAR); - _vp.repaint(); - _vp.fireLayoutChanged(bck); - } - } - - public void UINAView() { - if (_vp.isModifiable()) { - Hashtable bck = backupAllCoords(); - _undoableEditSupport.postEdit(new VARNAEdits.RedrawEdit( - RNA.DRAW_MODE_NAVIEW, _vp)); - _vp.reset(); - _vp.drawRNA(_vp.getRNA(), RNA.DRAW_MODE_NAVIEW); - _vp.repaint(); - _vp.fireLayoutChanged(bck); - } - } - - public void UIVARNAView() { - if (_vp.isModifiable()) { - Hashtable bck = backupAllCoords(); - _undoableEditSupport.postEdit(new VARNAEdits.RedrawEdit( - RNA.DRAW_MODE_VARNA_VIEW, _vp)); - _vp.reset(); - _vp.drawRNA(_vp.getRNA(), RNA.DRAW_MODE_VARNA_VIEW); - _vp.repaint(); - _vp.fireLayoutChanged(bck); - } - } - - public void UIReset() { - if (_vp.isModifiable()) { - Hashtable bck = backupAllCoords(); - _undoableEditSupport.postEdit(new VARNAEdits.RedrawEdit(_vp - .getRNA().get_drawMode(), _vp)); - _vp.reset(); - _vp.drawRNA(_vp.getRNA(), _vp.getRNA().get_drawMode()); - _vp.repaint(); - _vp.fireLayoutChanged(bck); - } - } - - private void savePath(JFileChooser jfc) { - _fileChooserDirectory = jfc.getCurrentDirectory(); - } - - private void loadPath(JFileChooser jfc) { - if (_fileChooserDirectory != null) { - jfc.setCurrentDirectory(_fileChooserDirectory); - } - } - - public void UIChooseRNAs(ArrayList rnas) { - if (rnas.size() > 5) { - final VueRNAList vrna = new VueRNAList(rnas); - Runnable ok = new Runnable() { - - @Override - public void run() { - for (RNA r : vrna.getSelectedRNAs()) { - try { - r.drawRNA(_vp.getConfig()); - } catch (ExceptionNAViewAlgorithm e) { - e.printStackTrace(); - } - _vp.showRNA(r); - } - _vp.repaint(); - } - - }; - showConfirmDialog(vrna, "Select imported sequence/structures", ok, null); - } else { - for (RNA r : rnas) { - try { - r.drawRNA(_vp.getConfig()); - } catch (ExceptionNAViewAlgorithm e) { - e.printStackTrace(); - } - _vp.showRNA(r); - } - _vp.repaint(); - } - } - - public void UIFile() throws ExceptionNonEqualLength { - if (_vp.isModifiable()) { - JFileChooser fc = new JFileChooser(); - fc.setFileSelectionMode(JFileChooser.OPEN_DIALOG); - fc.setDialogTitle("Open..."); - loadPath(fc); - if (fc.showOpenDialog(_vp) == JFileChooser.APPROVE_OPTION) { - try { - savePath(fc); - String path = fc.getSelectedFile().getAbsolutePath(); - if (!path.toLowerCase().endsWith(".varna")) { - ArrayList rnas = RNAFactory.loadSecStr(path); - if (rnas.isEmpty()) { - throw new ExceptionFileFormatOrSyntax("No RNA could be parsed from that source."); - } else { - UIChooseRNAs(rnas); - } - } else { - FullBackup bck = _vp.loadSession(fc.getSelectedFile()); // was path - } - } catch (ExceptionExportFailed e1) { - _vp.errorDialog(e1); - } catch (ExceptionPermissionDenied e1) { - _vp.errorDialog(e1); - } catch (ExceptionLoadingFailed e1) { - _vp.errorDialog(e1); - } catch (ExceptionFileFormatOrSyntax e1) { - _vp.errorDialog(e1); - } catch (ExceptionUnmatchedClosingParentheses e1) { - _vp.errorDialog(e1); - } catch (FileNotFoundException e) { - _vp.errorDialog(e); - } - } - } - } - - public void UISetColorMapStyle() { - final VueColorMapStyle vcms = new VueColorMapStyle(_vp); - Runnable ok = new Runnable() { - - @Override - public void run() { - _vp.setColorMap(vcms.getColorMap()); - } - - }; - Runnable cancel = new Runnable() { - - @Override - public void run() { - vcms.cancelChanges(); - } - - }; - showConfirmDialog(vcms, "Choose color map style", ok, cancel, cancel, null, null); - } - - public void UILoadColorMapValues() { - final VueLoadColorMapValues vcmv = new VueLoadColorMapValues(_vp); - Runnable ok = new Runnable(){ - - @Override - public void run() { - _vp.setColorMapVisible(true); - try { - _vp.readValues(vcmv.getReader()); - } catch (IOException e) { - _vp.errorDialog((Exception) getDialogError()); - } - } - - }; - showConfirmDialog(vcmv, "Load base values", ok, null); - } - - public void UISetColorMapValues() { - final VueBaseValues vbv = new VueBaseValues(_vp); - Runnable cancel = new Runnable() { - - @Override - public void run() { - vbv.cancelChanges(); - } - - }; - showConfirmDialog(vbv, "Choose base values", null, cancel); - } - - public void UIManualInput() throws ParseException, ExceptionNonEqualLength { - if (_vp.isModifiable()) { - final VueManualInput manualInput = new VueManualInput(_vp); - Runnable ok = new Runnable() { - - @Override - public void run() { - if (_vp.getRNA().getSize() == 0) { - - } - try { - RNA r = new RNA(); - VARNAConfig cfg = new VARNAConfig(); - r.setRNA(manualInput.getTseq().getText(), manualInput.getTstr().getText()); - r.drawRNA(_vp.getRNA().get_drawMode(), cfg); - _vp.drawRNAInterpolated(r); - _vp.repaint(); - } catch (ExceptionFileFormatOrSyntax e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionNAViewAlgorithm e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExceptionUnmatchedClosingParentheses e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - }; - showConfirmDialog(manualInput.getPanel(), "Input sequence/structure", ok, null); - } - } - - public void UISetTitle() { - if (_vp.isModifiable()) { - Runnable input = new Runnable() { - - @Override - public void run() { - String res = (String) getDialogReturnValue(); - if (res != null) { - _vp.setTitle(res); - _vp.repaint(); - } - } - - }; - - showInputDialog("Input title", _vp.getTitle(), input); - } - } - - public void UISetColorMapCaption() { - if (_vp.isModifiable()) { - Runnable input = new Runnable() { - - @Override - public void run() { - String res = (String) getDialogReturnValue(); - if (res != null) { - _vp.setColorMapCaption(res); - _vp.repaint(); - } - } - - }; - showInputDialog("Input new color map caption", _vp.getColorMapCaption(), input); - } - } - - public void UISetBaseCharacter() { - if (_vp.isModifiable()) { - final int i = _vp.getNearestBase(); - - if (_vp.isComparisonMode()) { - - Runnable input = new Runnable() { - - @Override - public void run() { - String res = (String) getDialogReturnValue(); - if (res != null) { - ModeleBasesComparison mb = (ModeleBasesComparison) _vp.getRNA().get_listeBases().get(i); - String bck = mb.getBase1() + "|" + mb.getBase2(); - mb.setBase1(((res.length() > 0) ? res.charAt(0) : ' ')); - mb.setBase2(((res.length() > 1) ? res.charAt(1) : ' ')); - _vp.repaint(); - _vp.fireSequenceChanged(i, bck, res); - } - } - - }; - - - - showInputDialog("Input base", ((ModeleBasesComparison) _vp.getRNA().get_listeBases().get(i)).getBases(), input); - - } else { - - Runnable input = new Runnable() { - - @Override - public void run() { - String res = (String) getDialogReturnValue(); - if (res != null) { - ModeleBaseNucleotide mb = (ModeleBaseNucleotide) _vp.getRNA().get_listeBases().get(i); - String bck = mb.getBase(); - mb.setBase(res); - _vp.repaint(); - _vp.fireSequenceChanged(i, bck, res); - } - } - - }; - showInputDialog("Input base", ((ModeleBaseNucleotide) _vp.getRNA().get_listeBases().get(i)).getBase(), input); - } - } - } - - FileNameExtensionFilter _varnaFilter = new FileNameExtensionFilter( - "VARNA Session File", "varna", "VARNA"); - FileNameExtensionFilter _bpseqFilter = new FileNameExtensionFilter( - "BPSeq (CRW) File", "bpseq", "BPSEQ"); - FileNameExtensionFilter _ctFilter = new FileNameExtensionFilter( - "Connect (MFold) File", "ct", "CT"); - FileNameExtensionFilter _dbnFilter = new FileNameExtensionFilter( - "Dot-bracket notation (Vienna) File", "dbn", "DBN", "faa", "FAA"); - - FileNameExtensionFilter _jpgFilter = new FileNameExtensionFilter( - "JPEG Picture", "jpeg", "jpg", "JPG", "JPEG"); - FileNameExtensionFilter _pngFilter = new FileNameExtensionFilter( - "PNG Picture", "png", "PNG"); - FileNameExtensionFilter _epsFilter = new FileNameExtensionFilter( - "EPS File", "eps", "EPS"); - FileNameExtensionFilter _svgFilter = new FileNameExtensionFilter( - "SVG Picture", "svg", "SVG"); - FileNameExtensionFilter _xfigFilter = new FileNameExtensionFilter( - "XFig Diagram", "fig", "xfig", "FIG", "XFIG"); - FileNameExtensionFilter _tikzFilter = new FileNameExtensionFilter( - "PGF/Tikz diagram", "tex", "pgf"); - - public void UIExport() throws ExceptionExportFailed, - ExceptionPermissionDenied, ExceptionWritingForbidden, - ExceptionJPEGEncoding { - ArrayList v = new ArrayList(); - v.add(_epsFilter); - v.add(_svgFilter); - v.add(_tikzFilter); - v.add(_xfigFilter); - v.add(_jpgFilter); - v.add(_pngFilter); - String dest = UIChooseOutputFile(v); - if (dest != null) { - String extLower = dest.substring(dest.lastIndexOf('.')) - .toLowerCase(); - // System.out.println(extLower); - if (extLower.equals(".eps")) { - _vp.getRNA().saveRNAEPS(dest, _vp.getConfig()); - } else if (extLower.equals(".svg")) { - _vp.getRNA().saveRNASVG(dest, _vp.getConfig()); - } else if (extLower.equals(".fig") || extLower.equals(".xfig")) { - _vp.getRNA().saveRNAXFIG(dest, _vp.getConfig()); - } else if (extLower.equals(".pgf") || extLower.equals(".tex")) { - _vp.getRNA().saveRNATIKZ(dest, _vp.getConfig()); - } else if (extLower.equals(".png")) { - saveToPNG(dest); - } else if (extLower.equals(".jpg") || extLower.equals(".jpeg")) { - saveToJPEG(dest); - } - } - } - - public void UIExportJPEG() throws ExceptionJPEGEncoding, - ExceptionExportFailed { - String dest = UIChooseOutputFile(_jpgFilter); - if (dest != null) { - saveToJPEG(dest); - } - } - - public void UIPrint() { - VARNAPrinter.printComponent(_vp); - } - - public void UIExportPNG() throws ExceptionExportFailed { - String dest = UIChooseOutputFile(_pngFilter); - if (dest != null) { - saveToPNG(dest); - } - } - - public void UIExportXFIG() throws ExceptionExportFailed, - ExceptionWritingForbidden { - String dest = UIChooseOutputFile(_xfigFilter); - if (dest != null) { - _vp.getRNA().saveRNAXFIG(dest, _vp.getConfig()); - } - } - - public void UIExportTIKZ() throws ExceptionExportFailed, - ExceptionWritingForbidden { - String dest = UIChooseOutputFile(_tikzFilter); - if (dest != null) { - _vp.getRNA().saveRNATIKZ(dest, _vp.getConfig()); - } - } - - public void UIExportEPS() throws ExceptionExportFailed, - ExceptionWritingForbidden { - String dest = UIChooseOutputFile(_epsFilter); - if (dest != null) { - _vp.getRNA().saveRNAEPS(dest, _vp.getConfig()); - } - } - - public void UIExportSVG() throws ExceptionExportFailed, - ExceptionWritingForbidden { - String dest = UIChooseOutputFile(_svgFilter); - if (dest != null) { - _vp.getRNA().saveRNASVG(dest, _vp.getConfig()); - } - } - - public void UISaveAsDBN() throws ExceptionExportFailed, - ExceptionPermissionDenied { - String name = _vp.getVARNAUI().UIChooseOutputFile(_dbnFilter); - if (name != null) - _vp.getRNA().saveAsDBN(name, _vp.getTitle()); - } - - public void UISaveAsCT() throws ExceptionExportFailed, - ExceptionPermissionDenied { - String name = _vp.getVARNAUI().UIChooseOutputFile(_ctFilter); - if (name != null) - _vp.getRNA().saveAsCT(name, _vp.getTitle()); - } - - public void UISaveAsBPSEQ() throws ExceptionExportFailed, - ExceptionPermissionDenied { - String name = _vp.getVARNAUI().UIChooseOutputFile(_bpseqFilter); - if (name != null) - _vp.getRNA().saveAsBPSEQ(name, _vp.getTitle()); - } - - public void UISaveAs() throws ExceptionExportFailed, - ExceptionPermissionDenied { - ArrayList v = new ArrayList(); - v.add(_bpseqFilter); - v.add(_dbnFilter); - v.add(_ctFilter); - v.add(_varnaFilter); - String dest = UIChooseOutputFile(v); - if (dest != null) { - String extLower = dest.substring(dest.lastIndexOf('.')) - .toLowerCase(); - if (extLower.endsWith("bpseq")) { - _vp.getRNA().saveAsBPSEQ(dest, _vp.getTitle()); - } else if (extLower.endsWith("ct")) { - _vp.getRNA().saveAsCT(dest, _vp.getTitle()); - } else if (extLower.endsWith("dbn") || extLower.endsWith("faa")) { - _vp.getRNA().saveAsDBN(dest, _vp.getTitle()); - } else if (extLower.endsWith("varna")) { - _vp.saveSession(dest); - } - } - } - - public String UIChooseOutputFile(FileNameExtensionFilter filtre) { - ArrayList v = new ArrayList(); - v.add(filtre); - return UIChooseOutputFile(v); - } - - /** - * Opens a save dialog with right extensions and return the absolute path - * - * @param filtre - * Allowed extensions - * @return null if the user doesn't approve the save dialog,
- * absolutePath if the user approve the save dialog - */ - public String UIChooseOutputFile(ArrayList filtre) { - JFileChooser fc = new JFileChooser(); - loadPath(fc); - String absolutePath = null; - // applique le filtre - for (int i = 0; i < filtre.size(); i++) { - fc.addChoosableFileFilter(filtre.get(i)); - } - // en mode open dialog pour voir les autres fichiers avec la meme - // extension - fc.setFileSelectionMode(JFileChooser.OPEN_DIALOG); - fc.setDialogTitle("Save..."); - // Si l'utilisateur a valider - if (fc.showSaveDialog(_vp) == JFileChooser.APPROVE_OPTION) { - savePath(fc); - absolutePath = fc.getSelectedFile().getAbsolutePath(); - String extension = _vp.getPopupMenu().get_controleurMenu() - .getExtension(fc.getSelectedFile()); - FileFilter f = fc.getFileFilter(); - if (f instanceof FileNameExtensionFilter) { - ArrayList listeExtension = new ArrayList(); - listeExtension.addAll(Arrays - .asList(((FileNameExtensionFilter) f).getExtensions())); - // si l'extension du fichier ne fait pas partie de la liste - // d'extensions acceptées - if (!listeExtension.contains(extension)) { - absolutePath += "." + listeExtension.get(0); - } - } - } - return absolutePath; - } - - public void UISetBorder() { - VueBorder border = new VueBorder(_vp); - final Dimension oldBorder = _vp.getBorderSize(); - _vp.drawBBox(true); - _vp.drawBorder(true); - _vp.repaint(); - Runnable cancel = new Runnable () { - - @Override - public void run() { - _vp.setBorderSize(oldBorder); - } - - }; - Runnable final_ = new Runnable () { - - @Override - public void run() { - _vp.drawBorder(false); - _vp.drawBBox(false); - _vp.repaint(); - } - - }; - - showConfirmDialog(border.getPanel(), "Set new border size", null, cancel, cancel, final_); - } - - public void UISetBackground() { - showColorDialog("Choose new background color", _vp.getBackground(), new Runnable() { - - @Override - public void run() { - if (dialogReturnValue != null) { - _vp.setBackground((Color) dialogReturnValue); - _vp.repaint(); - } - } - - }); - } - - public void UIZoomIn() { - double _actualZoom = _vp.getZoom(); - double _actualAmount = _vp.getZoomIncrement(); - Point _actualTranslation = _vp.getTranslation(); - double newZoom = Math.min(VARNAConfig.MAX_ZOOM, _actualZoom - * _actualAmount); - double ratio = newZoom / _actualZoom; - Point newTrans = new Point((int) (_actualTranslation.x * ratio), - (int) (_actualTranslation.y * ratio)); - _vp.setZoom(newZoom); - _vp.setTranslation(newTrans); - // verification que la translation ne pose pas de problemes - _vp.checkTranslation(); - // System.out.println("Zoom in"); - _vp.repaint(); - } - - public void UIZoomOut() { - double _actualZoom = _vp.getZoom(); - double _actualAmount = _vp.getZoomIncrement(); - Point _actualTranslation = _vp.getTranslation(); - double newZoom = Math.max(_actualZoom / _actualAmount, - VARNAConfig.MIN_ZOOM); - double ratio = newZoom / _actualZoom; - Point newTrans = new Point((int) (_actualTranslation.x * ratio), - (int) (_actualTranslation.y * ratio)); - _vp.setZoom(newZoom); - _vp.setTranslation(newTrans); - // verification que la translation ne pose pas de problemes - _vp.checkTranslation(); - _vp.repaint(); - } - - public void UICustomZoom() { - VueZoom zoom = new VueZoom(_vp); - final double oldZoom = _vp.getZoom(); - final double oldZoomAmount = _vp.getZoomIncrement(); - _vp.drawBBox(true); - _vp.repaint(); - Runnable cancel = new Runnable() { - - @Override - public void run() { - _vp.setZoom(oldZoom); - _vp.setZoomIncrement(oldZoomAmount); - } - - }; - Runnable final_ = new Runnable() { - - @Override - public void run() { - _vp.drawBBox(false); - _vp.repaint(); - } - - }; - showConfirmDialog(zoom.getPanel(), "Set zoom", null, cancel, cancel, final_); - } - - public void UIGlobalRescale() { - if (_vp.isModifiable()) { - if (_vp.getRNA().get_listeBases().size() > 0) { - final VueGlobalRescale rescale = new VueGlobalRescale(_vp); - Runnable cancel = new Runnable() { - - @Override - public void run() { - UIGlobalRescale(1. / rescale.getScale()); - } - - }; - Runnable final_ = new Runnable() { - - @Override - public void run() { - _vp.drawBBox(false); - _vp.repaint(); - } - - }; - showConfirmDialog(rescale.getPanel(), "Rescales the whole RNA (No redraw)", null, cancel, cancel, final_); - } - } - } - - public void UIGlobalRescale(double d) { - if (_vp.isModifiable()) { - if (_vp.getRNA().get_listeBases().size() > 0) { - _vp.globalRescale(d); - _undoableEditSupport.postEdit(new VARNAEdits.RescaleRNAEdit(d, - _vp)); - } - } - } - - public void UIGlobalRotation() { - if (_vp.isModifiable()) { - if (_vp.getRNA().get_listeBases().size() > 0) { - _vp.drawBBox(true); - _vp.repaint(); - final VueGlobalRotation rotation = new VueGlobalRotation(_vp); - Runnable cancel = new Runnable() { - - @Override - public void run() { - UIGlobalRotation(-rotation.getAngle()); - } - - }; - Runnable final_ = new Runnable() { - - @Override - public void run() { - _vp.drawBBox(false); - _vp.repaint(); - } - - }; - showConfirmDialog(rotation.getPanel(), "Rotates the whole RNA", null, cancel, cancel, final_, null); - } - } - } - - public void UIGlobalRotation(double d) { - if (_vp.isModifiable()) { - if (_vp.getRNA().get_listeBases().size() > 0) { - _vp.globalRotation(d); - _undoableEditSupport.postEdit(new VARNAEdits.RotateRNAEdit(d, - _vp)); - } - } - } - - public void UISetBPStyle() { - if (_vp.getRNA().get_listeBases().size() > 0) { - VueStyleBP bpstyle = new VueStyleBP(_vp); - final VARNAConfig.BP_STYLE bck = _vp.getBPStyle(); - Runnable cancel = new Runnable() { - - @Override - public void run() { - _vp.setBPStyle(bck); - _vp.repaint(); - } - - }; - showConfirmDialog(bpstyle.getPanel(), "Set main base pair style", null, cancel, cancel); - } - } - - public void UISetTitleColor() { - if (_vp.isModifiable()) { - showColorDialog("Choose new title color", _vp.getTitleColor(), new Runnable() { - - @Override - public void run() { - if (dialogReturnValue != null) { - _vp.setTitleColor((Color) dialogReturnValue); - _vp.repaint(); - } - } - - }); - } - } - - public void UISetBackboneColor() { - if (_vp.isModifiable()) { - showColorDialog("Choose new backbone color", _vp.getBackboneColor(), new Runnable() { - - @Override - public void run() { - if (dialogReturnValue != null) { - _vp.setBackboneColor((Color) dialogReturnValue); - _vp.repaint(); - } - } - - }); - } - } - - public void UISetTitleFont() { - if (_vp.isModifiable()) { - final VueFont font = new VueFont(_vp); - Runnable ok = new Runnable() { - - @Override - public void run() { - _vp.setTitleFont(font.getFont()); - _vp.repaint(); - } - - }; - showConfirmDialog(font.getPanel(), "New Title font", ok, null); - } - } - - public void UISetSpaceBetweenBases() { - if (_vp.isModifiable()) { - - final VueSpaceBetweenBases vsbb = new VueSpaceBetweenBases(_vp); - final Double oldSpace = _vp.getSpaceBetweenBases(); - Runnable cancel = new Runnable () { - - @Override - public void run() { - _vp.setSpaceBetweenBases(oldSpace); - _vp.drawRNA(_vp.getRNA()); - _vp.repaint(); - } - - }; - showConfirmDialog(vsbb.getPanel(), "Set the space between each base", null, cancel, cancel); - } - } - - public void UISetBPHeightIncrement() { - if (_vp.isModifiable()) { - - VueBPHeightIncrement v = new VueBPHeightIncrement(_vp); - final Double oldSpace = _vp.getBPHeightIncrement(); - Runnable cancel = new Runnable() { - - @Override - public void run() { - _vp.setBPHeightIncrement(oldSpace); - _vp.drawRNA(_vp.getRNA()); - _vp.repaint(); - } - - }; - showConfirmDialog(v.getPanel(), "Set the vertical increment in linear mode", null, cancel, cancel); - } - } - - public void UISetNumPeriod() { - if (_vp.getRNA().get_listeBases().size() != 0) { - final int oldNumPeriod = _vp.getNumPeriod(); - VueNumPeriod vnp = new VueNumPeriod(_vp); - Runnable cancel = new Runnable() { - - @Override - public void run() { - _vp.setNumPeriod(oldNumPeriod); - _vp.repaint(); - } - - }; - showConfirmDialog(vnp.getPanel(), "Set new numbering period", null, cancel, cancel); - } - } - - public void UIEditBasePair() { - if (_vp.isModifiable()) { - ModeleBase mb = _vp.getRNA().get_listeBases().get(_vp.getNearestBase()); - if (mb.getElementStructure() != -1) { - final ModeleBP msbp = mb.getStyleBP(); - final ModeleBP.Edge bck5 = msbp.getEdgePartner5(); - final ModeleBP.Edge bck3 = msbp.getEdgePartner3(); - final ModeleBP.Stericity bcks = msbp.getStericity(); - - VueBPType vbpt = new VueBPType(_vp, msbp); - Runnable cancel = new Runnable() { - - @Override - public void run() { - msbp.setEdge5(bck5); - msbp.setEdge3(bck3); - msbp.setStericity(bcks); - _vp.repaint(); - } - - }; - showConfirmDialog(vbpt.getPanel(), "Set base pair L/W type", null, cancel, cancel); - } - } - } - - public void UIColorBasePair() { - if (_vp.isModifiable()) { - ModeleBase mb = _vp.getRNA().get_listeBases().get(_vp.getNearestBase()); - if (mb.getElementStructure() != -1) { - final ModeleBP msbp = mb.getStyleBP(); - showColorDialog("Choose custom base pair color", - msbp.getStyle().getColor(_vp.getConfig()._bondColor), new Runnable() { - - @Override - public void run() { - if (dialogReturnValue != null) { - msbp.getStyle().setCustomColor((Color) dialogReturnValue); - _vp.repaint(); - } - } - - }); - } - } - } - - public void UIThicknessBasePair() { - if (_vp.isModifiable()) { - ModeleBase mb = _vp.getRNA().get_listeBases() - .get(_vp.getNearestBase()); - if (mb.getElementStructure() != -1) { - ModeleBP msbp = mb.getStyleBP(); - ArrayList bases = new ArrayList(); - bases.add(msbp); - UIThicknessBasePairs(bases); - } - } - } - - public void saveToPNG(final String filename) { - final VueJPEG jpeg = new VueJPEG(true, false); - Runnable ok = new Runnable() { - - @Override - public void run() { - Double scale = jpeg.getScaleSlider().getValue() / 100.0; - BufferedImage myImage = new BufferedImage((int) Math.round(_vp.getWidth() * scale), - (int) Math.round(_vp.getHeight() * scale), BufferedImage.TYPE_INT_ARGB); - // BH j2s SwingJS: was BufferedImage.TRANSLUCENT, which is TYPE_INT_ARGB_PRE ?? no transparent background? - Graphics2D g2 = myImage.createGraphics(); - AffineTransform AF = new AffineTransform(); - AF.setToScale(scale, scale); - g2.setTransform(AF); - _vp.paintComponent(g2, !_vp.getConfig()._drawBackground); - g2.dispose(); - try { - ImageIO.write(myImage, "PNG", new File(filename)); - } catch (IOException e) { - // cannot throw an exception from Runnable.run() - _vp.errorDialog(new ExceptionExportFailed(e.getMessage(), filename)); - } - } - - }; - showConfirmDialog(jpeg.getPanel(), "Set resolution", ok, null); - } - - public void saveToJPEG(final String filename) { - final VueJPEG jpeg = new VueJPEG(true, true); - Runnable ok = new Runnable() { - - @Override - public void run() { - Double scale; - if (jpeg.getScaleSlider().getValue() == 0) - scale = 1. / 100.; - else - scale = jpeg.getScaleSlider().getValue() / 100.; - BufferedImage myImage = new BufferedImage((int) Math.round(_vp - .getWidth() * scale), (int) Math.round(_vp.getHeight() - * scale), BufferedImage.TYPE_INT_RGB); - Graphics2D g2 = myImage.createGraphics(); - AffineTransform AF = new AffineTransform(); - AF.setToScale(scale, scale); - g2.setTransform(AF); - _vp.paintComponent(g2); - try { - FileImageOutputStream out = new FileImageOutputStream(new File( - filename)); - ImageWriter writer = ImageIO - .getImageWritersByFormatName("jpeg").next(); - ImageWriteParam params = writer.getDefaultWriteParam(); - params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - params.setCompressionQuality(jpeg.getQualitySlider().getValue() / 100.0f); - writer.setOutput(out); - IIOImage myIIOImage = new IIOImage(myImage, null, null); - writer.write(null, myIIOImage, params); - out.close(); - } catch (IOException e) { - // cannot throw an exception from Runnable.run() - _vp.errorDialog(new ExceptionExportFailed(e.getMessage(), filename)); - } - } - - }; - showConfirmDialog(jpeg.getPanel(), "Set resolution/quality", ok, null); - } - - public void UIToggleShowNCBP() { - if (_vp.isModifiable()) { - _vp.setShowNonCanonicalBP(!_vp.getShowNonCanonicalBP()); - _vp.repaint(); - } - } - - public void UIToggleColorSpecialBases() { - _vp.setColorNonStandardBases(!_vp.getColorSpecialBases()); - _vp.repaint(); - } - - public void UIToggleColorGapsBases() { - _vp.setColorGapsBases(!_vp.getColorGapsBases()); - _vp.repaint(); - } - - public void UIToggleShowNonPlanar() { - if (_vp.isModifiable()) { - _vp.setShowNonPlanarBP(!_vp.getShowNonPlanarBP()); - _vp.repaint(); - } - } - - public void UIToggleShowWarnings() { - _vp.setShowWarnings(!_vp.getShowWarnings()); - _vp.repaint(); - } - - public void UIPickSpecialBasesColor() { - showColorDialog("Choose new special bases color", _vp.getNonStandardBasesColor(), new Runnable() { - - @Override - public void run() { - if (dialogReturnValue != null) { - _vp.setNonStandardBasesColor((Color) dialogReturnValue); - _vp.setColorNonStandardBases(true); - _vp.repaint(); - } - } - - }); - } - - public void UIPickGapsBasesColor() { - showColorDialog("Choose new gaps bases color", _vp.getGapsBasesColor(), new Runnable() { - - @Override - public void run() { - if (dialogReturnValue != null) { - _vp.setGapsBasesColor((Color) dialogReturnValue); - _vp.setColorGapsBases(true); - _vp.repaint(); - } - } - - }); - } - - public void UIBaseTypeColor() { - if (_vp.isModifiable()) { - new VueBases(_vp, VueBases.KIND_MODE); - } - } - - public void UIToggleModifiable() { - _vp.setModifiable(!_vp.isModifiable()); - } - - public void UIBasePairTypeColor() { - if (_vp.isModifiable()) { - new VueBases(_vp, VueBases.COUPLE_MODE); - } - } - - public void UIBaseAllColor() { - if (_vp.isModifiable()) { - new VueBases(_vp, VueBases.ALL_MODE); - } - } - - public void UIAbout() { - final VueAboutPanel about = new VueAboutPanel(); - Runnable ok = new Runnable() { - - @Override - public void run() { - about.gracefulStop(); - } - - }; - showMessageDialog(about, "About VARNA " + VARNAConfig.MAJOR_VERSION + "." + VARNAConfig.MINOR_VERSION, - JOptionPane.PLAIN_MESSAGE, ok, ok); - } - - public void UIAutoAnnotateHelices() { - if (_vp.isModifiable()) { - _vp.getRNA().autoAnnotateHelices(); - _vp.repaint(); - } - } - - public void UIAutoAnnotateStrandEnds() { - if (_vp.isModifiable()) { - _vp.getRNA().autoAnnotateStrandEnds(); - _vp.repaint(); - } - } - - public void UIAutoAnnotateInteriorLoops() { - if (_vp.isModifiable()) { - _vp.getRNA().autoAnnotateInteriorLoops(); - _vp.repaint(); - } - } - - public void UIAutoAnnotateTerminalLoops() { - if (_vp.isModifiable()) { - _vp.getRNA().autoAnnotateTerminalLoops(); - _vp.repaint(); - } - } - - public void UIAnnotationRemoveFromAnnotation(TextAnnotation textAnnotation) { - if (_vp.isModifiable()) { - _vp.set_selectedAnnotation(null); - _vp.getListeAnnotations().remove(textAnnotation); - _vp.repaint(); - } - } - - public void UIAnnotationEditFromAnnotation(TextAnnotation textAnnotation) { - VueAnnotation vue; - if (textAnnotation.getType() == TextAnnotation.AnchorType.POSITION) - vue = new VueAnnotation(_vp, textAnnotation, false); - else - vue = new VueAnnotation(_vp, textAnnotation, true, false); - vue.show(); - } - - public void UIAnnotationAddFromStructure(TextAnnotation.AnchorType type, ArrayList listeIndex) - throws Exception { - TextAnnotation textAnnot; - ArrayList listeBase; - VueAnnotation vue; - switch (type) { - case BASE: - textAnnot = new TextAnnotation("", _vp.getRNA().get_listeBases() - .get(listeIndex.get(0))); - vue = new VueAnnotation(_vp, textAnnot, true); - vue.show(); - break; - case LOOP: - listeBase = new ArrayList(); - for (Integer i : listeIndex) { - listeBase.add(_vp.getRNA().get_listeBases().get(i)); - } - textAnnot = new TextAnnotation("", listeBase, type); - vue = new VueAnnotation(_vp, textAnnot, true); - vue.show(); - break; - case HELIX: - listeBase = new ArrayList(); - for (Integer i : listeIndex) { - listeBase.add(_vp.getRNA().get_listeBases().get(i)); - } - textAnnot = new TextAnnotation("", listeBase, type); - vue = new VueAnnotation(_vp, textAnnot, true); - vue.show(); - break; - default: - _vp.errorDialog(new Exception("Unknown structure type")); - break; - } - } - - public void UIAnnotationEditFromStructure(TextAnnotation.AnchorType type, - ArrayList listeIndex) { - if (_vp.isModifiable()) { - ModeleBase mb = _vp.getRNA().get_listeBases() - .get(listeIndex.get(0)); - TextAnnotation ta = _vp.getRNA().getAnnotation(type, mb); - if (ta != null) - UIAnnotationEditFromAnnotation(ta); - } - } - - public void UIAnnotationRemoveFromStructure(TextAnnotation.AnchorType type, - ArrayList listeIndex) { - if (_vp.isModifiable()) { - ModeleBase mb = _vp.getRNA().get_listeBases() - .get(listeIndex.get(0)); - TextAnnotation ta = _vp.getRNA().getAnnotation(type, mb); - if (ta != null) - UIAnnotationRemoveFromAnnotation(ta); - } - } - - public void UIAnnotationsAddPosition(int x, int y) { - if (_vp.isModifiable()) { - Point2D.Double p = _vp.panelToLogicPoint(new Point2D.Double(x, y)); - VueAnnotation annotationAdd = new VueAnnotation(_vp, (int) p.x, - (int) p.y); - annotationAdd.show(); - } - } - - public void UIAnnotationsAddBase(int x, int y) { - if (_vp.isModifiable()) { - ModeleBase mb = _vp.getBaseAt(new Point2D.Double(x, y)); - if (mb != null) { - _vp.highlightSelectedBase(mb); - TextAnnotation textAnnot = new TextAnnotation("", mb); - VueAnnotation annotationAdd = new VueAnnotation(_vp, textAnnot, - true); - annotationAdd.show(); - } - } - } - - public void UIAnnotationsAddLoop(int x, int y) { - if (_vp.isModifiable()) { - try { - ModeleBase mb = _vp.getBaseAt(new Point2D.Double(x, y)); - if (mb != null) { - Vector v = _vp.getRNA() - .getLoopBases(mb.getIndex()); - ArrayList mbs = _vp.getRNA().getBasesAt(v); - TextAnnotation textAnnot; - textAnnot = new TextAnnotation("", mbs, - TextAnnotation.AnchorType.LOOP); - _vp.setSelection(mbs); - VueAnnotation annotationAdd = new VueAnnotation(_vp, - textAnnot, true); - annotationAdd.show(); - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - private ArrayList extractMaxContiguousPortion( - ArrayList m) { - ModeleBase[] tab = new ModeleBase[_vp.getRNA().getSize()]; - for (int i = 0; i < tab.length; i++) { - tab[i] = null; - } - for (ModeleBase mb : m) { - tab[mb.getIndex()] = mb; - } - ArrayList best = new ArrayList(); - ArrayList current = new ArrayList(); - for (int i = 0; i < tab.length; i++) { - if (tab[i] != null) { - current.add(tab[i]); - } else { - if (current.size() > best.size()) - best = current; - current = new ArrayList(); - } - } - if (current.size() > best.size()) { - best = current; - } - return best; - } - - public void UIAnnotationsAddRegion(int x, int y) { - if (_vp.isModifiable()) { - ArrayList mb = _vp.getSelection().getBases(); - if (mb.size() == 0) { - ModeleBase m = _vp.getBaseAt(new Point2D.Double(x, y)); - mb.add(m); - } - mb = extractMaxContiguousPortion(extractMaxContiguousPortion(mb)); - _vp.setSelection(mb); - HighlightRegionAnnotation regionAnnot = new HighlightRegionAnnotation( - mb); - _vp.addHighlightRegion(regionAnnot); - VueHighlightRegionEdit annotationAdd = new VueHighlightRegionEdit( - _vp, regionAnnot); - if (!annotationAdd.show()) { - _vp.removeHighlightRegion(regionAnnot); - } - _vp.clearSelection(); - } - } - - public void UIAnnotationsAddChemProb(int x, int y) { - if (_vp.isModifiable() && _vp.getRNA().getSize() > 1) { - Point2D.Double p = _vp.panelToLogicPoint(new Point2D.Double(x, y)); - ModeleBase m1 = _vp.getBaseAt(new Point2D.Double(x, y)); - ModeleBase best = null; - if (m1.getIndex() - 1 >= 0) { - best = _vp.getRNA().getBaseAt(m1.getIndex() - 1); - } - if (m1.getIndex() + 1 < _vp.getRNA().getSize()) { - ModeleBase m2 = _vp.getRNA().getBaseAt(m1.getIndex() + 1); - if (best == null) { - best = m2; - } else { - if (best.getCoords().distance(p) > m2.getCoords().distance( - p)) { - best = m2; - } - } - } - ArrayList tab = new ArrayList(); - tab.add(m1); - tab.add(best); - _vp.setSelection(tab); - ChemProbAnnotation regionAnnot = new ChemProbAnnotation(m1, best); - _vp.getRNA().addChemProbAnnotation(regionAnnot); - VueChemProbAnnotation annotationAdd = new VueChemProbAnnotation( - _vp, regionAnnot); - if (!annotationAdd.show()) { - _vp.getRNA().removeChemProbAnnotation(regionAnnot); - } - _vp.clearSelection(); - } - } - - public void UIAnnotationsAddHelix(int x, int y) { - if (_vp.isModifiable()) { - try { - ModeleBase mb = _vp.getBaseAt(new Point2D.Double(x, y)); - if (mb != null) { - ArrayList v = _vp.getRNA().findHelix(mb.getIndex()); - ArrayList mbs = _vp.getRNA().getBasesAt(v); - TextAnnotation textAnnot; - textAnnot = new TextAnnotation("", mbs, - TextAnnotation.AnchorType.HELIX); - _vp.setSelection(mbs); - VueAnnotation annotationAdd = new VueAnnotation(_vp, - textAnnot, true); - annotationAdd.show(); - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - public void UIToggleGaspinMode() { - if (_vp.isModifiable()) { - _vp.toggleDrawOutlineBases(); - _vp.toggleFillBases(); - _vp.repaint(); - } - } - - public void UIAnnotationsAdd() { - if (_vp.isModifiable()) { - VueAnnotation annotationAdd = new VueAnnotation(_vp); - annotationAdd.show(); - } - } - - public void UIEditAllBasePairs() { - if (_vp.isModifiable()) { - new VueBPList(_vp); - } - } - - public void UIEditAllBases() { - if (_vp.isModifiable()) { - new VueBases(_vp, VueBases.ALL_MODE); - } - } - - public void UIAnnotationsRemove() { - if (_vp.isModifiable()) { - new VueListeAnnotations(_vp, VueListeAnnotations.REMOVE); - } - } - - public void UIAnnotationsEdit() { - if (_vp.isModifiable()) { - new VueListeAnnotations(_vp, VueListeAnnotations.EDIT); - } - } - - public void UIAddBP(int i, int j, ModeleBP ms) { - if (_vp.isModifiable()) { - _vp.getRNA().addBP(i, j, ms); - _undoableEditSupport.postEdit(new VARNAEdits.AddBPEdit(i, j, ms, - _vp)); - _vp.repaint(); - - HashSet tmp = new HashSet(); - tmp.add(ms); - _vp.fireStructureChanged(new HashSet(_vp.getRNA() - .getAllBPs()), tmp, new HashSet()); - } - } - - public void UIRemoveBP(ModeleBP ms) { - if (_vp.isModifiable()) { - _undoableEditSupport.postEdit(new VARNAEdits.RemoveBPEdit(ms - .getIndex5(), ms.getIndex3(), ms, _vp)); - _vp.getRNA().removeBP(ms); - _vp.repaint(); - - HashSet tmp = new HashSet(); - tmp.add(ms); - _vp.fireStructureChanged(new HashSet(_vp.getRNA() - .getAllBPs()), new HashSet(), tmp); - } - } - - public void UIShiftBaseCoord(ArrayList indices, double dx, double dy) { - if (_vp.isModifiable()) { - Hashtable backupPos = new Hashtable(); - - for (int index : indices) { - ModeleBase mb = _vp.getRNA().getBaseAt(index); - Point2D.Double d = mb.getCoords(); - backupPos.put(index, d); - _vp.getRNA().setCoord(index, d.x + dx, d.y + dy); - _vp.getRNA().setCenter(index, mb.getCenter().x + dx, mb.getCenter().y + dy); - } - _undoableEditSupport.postEdit(new VARNAEdits.BasesShiftEdit( - indices, dx, dy, _vp)); - _vp.repaint(); - _vp.fireLayoutChanged(backupPos); - } - } - - public void UIShiftBaseCoord(ArrayList indices, Point2D.Double dv) { - UIShiftBaseCoord(indices, dv.x, dv.y); - } - - public void UIMoveSingleBase(int index, double nx, double ny) { - if (_vp.isModifiable()) { - ModeleBase mb = _vp.getRNA().getBaseAt(index); - Point2D.Double d = mb.getCoords(); - Hashtable backupPos = new Hashtable(); - backupPos.put(index, d); - _undoableEditSupport.postEdit(new VARNAEdits.SingleBaseMoveEdit( - index, nx, ny, _vp)); - _vp.getRNA().setCoord(index, nx, ny); - _vp.repaint(); - _vp.fireLayoutChanged(backupPos); - } - } - - public void UIMoveSingleBase(int index, Point2D.Double dv) { - UIMoveSingleBase(index, dv.x, dv.y); - } - - public void UISetBaseCenter(int index, double x, double y) { - UISetBaseCenter(index, new Point2D.Double(x, y)); - } - - public void UISetBaseCenter(int index, Point2D.Double p) { - if (_vp.isModifiable()) { - _vp.getRNA().setCenter(index, p); - } - } - - public void UIUndo() { - _vp.undo(); - } - - public void UIRedo() { - _vp.redo(); - } - - /** - * Move a helix of the rna - * - * @param index - * :the index of the selected base - * @param newPos - * :the new xy coordinate, within the logical system of - * coordinates - */ - public void UIMoveHelixAtom(int index, Point2D.Double newPos) { - if (_vp.isModifiable() && (index >= 0) - && (index < _vp.getRNA().get_listeBases().size())) { - int indexTo = _vp.getRNA().get_listeBases().get(index) - .getElementStructure(); - Point h = _vp.getRNA().getHelixInterval(index); - Point ml = _vp.getRNA().getMultiLoop(h.x); - int i = ml.x; - if (indexTo != -1) { - if (i == 0) { - if (shouldFlip(index, newPos)) { - UIFlipHelix(h); - _undoableEditSupport - .postEdit(new VARNAEdits.HelixFlipEdit(h, _vp)); - } - } else { - UIRotateHelixAtom(index, newPos); - } - - } - _vp.fireLayoutChanged(); - } - } - - /** - * Flip an helix around its supporting base - */ - public void UIFlipHelix(Point h) { - int hBeg = h.x; - int hEnd = h.y; - Point2D.Double A = _vp.getRNA().getCoords(hBeg); - Point2D.Double B = _vp.getRNA().getCoords(hEnd); - Point2D.Double AB = new Point2D.Double(B.x - A.x, B.y - A.y); - double normAB = Math.sqrt(AB.x * AB.x + AB.y * AB.y); - // Creating a coordinate system centered on A and having - // unit x-vector Ox. - Point2D.Double O = A; - Point2D.Double Ox = new Point2D.Double(AB.x / normAB, AB.y / normAB); - Hashtable old = new Hashtable(); - for (int i = hBeg + 1; i < hEnd; i++) { - Point2D.Double P = _vp.getRNA().getCoords(i); - Point2D.Double nP = RNA.project(O, Ox, P); - old.put(i, nP); - } - _vp.getRNA().flipHelix(h); - _vp.fireLayoutChanged(old); - } - - /** - * Tests if an helix needs to be flipped. - */ - boolean shouldFlip(int index, Point2D.Double P) { - Point h = _vp.getRNA().getHelixInterval(index); - - Point2D.Double A = _vp.getRNA().getCoords(h.x); - Point2D.Double B = _vp.getRNA().getCoords(h.y); - Point2D.Double C = _vp.getRNA().getCoords(h.x + 1); - // Creating a vector that is orthogonal to AB - Point2D.Double hAB = new Point2D.Double(B.y - A.y, -(B.x - A.x)); - Point2D.Double AC = new Point2D.Double(C.x - A.x, C.y - A.y); - Point2D.Double AP = new Point2D.Double(P.x - A.x, P.y - A.y); - double signC = (hAB.x * AC.x + hAB.y * AC.y); - double signP = (hAB.x * AP.x + hAB.y * AP.y); - // Now, the product signC*signP is negative iff the mouse and the first - // base inside - // the helix are on different sides of the end of the helix => Flip the - // helix! - return (signC * signP < 0.0); - } - - public void UIRotateHelixAtom(int index, Point2D.Double newPos) { - Point h = _vp.getRNA().getHelixInterval(index); - Point ml = _vp.getRNA().getMultiLoop(h.x); - int i = ml.x; - int prevIndex = h.x; - int nextIndex = h.y; - while (i <= ml.y) { - int j = _vp.getRNA().get_listeBases().get(i).getElementStructure(); - if ((j != -1) && (i < h.x)) { - prevIndex = i; - } - if ((j != -1) && (i > h.y) && (nextIndex == h.y)) { - nextIndex = i; - } - if ((j > i) && (j < ml.y)) { - i = _vp.getRNA().get_listeBases().get(i).getElementStructure(); - } else { - i++; - } - } - Point2D.Double oldPos = _vp.getRNA().getCoords(index); - Point2D.Double limitLoopLeft, limitLoopRight, limitLeft, limitRight, helixStart, helixStop; - boolean isDirect = _vp.getRNA().testDirectionality(ml.x, ml.y, h.x); - if (isDirect) { - limitLoopLeft = _vp.getRNA().getCoords(ml.y); - limitLoopRight = _vp.getRNA().getCoords(ml.x); - limitLeft = _vp.getRNA().getCoords(prevIndex); - limitRight = _vp.getRNA().getCoords(nextIndex); - helixStart = _vp.getRNA().getCoords(h.x); - helixStop = _vp.getRNA().getCoords(h.y); - } else { - limitLoopLeft = _vp.getRNA().getCoords(ml.x); - limitLoopRight = _vp.getRNA().getCoords(ml.y); - limitLeft = _vp.getRNA().getCoords(nextIndex); - limitRight = _vp.getRNA().getCoords(prevIndex); - helixStart = _vp.getRNA().getCoords(h.y); - helixStop = _vp.getRNA().getCoords(h.x); - } - - Point2D.Double center = _vp.getRNA().get_listeBases().get(h.x) - .getCenter(); - double base = (RNA.computeAngle(center, limitLoopRight) + RNA - .computeAngle(center, limitLoopLeft)) / 2.0; - double pLimR = RNA.computeAngle(center, limitLeft) - base; - double pHelR = RNA.computeAngle(center, helixStart) - base; - double pNew = RNA.computeAngle(center, newPos) - base; - double pOld = RNA.computeAngle(center, oldPos) - base; - double pHelL = RNA.computeAngle(center, helixStop) - base; - double pLimL = RNA.computeAngle(center, limitRight) - base; - - while (pLimR < 0.0) - pLimR += 2.0 * Math.PI; - while (pHelR < pLimR) - pHelR += 2.0 * Math.PI; - while ((pNew < pHelR)) - pNew += 2.0 * Math.PI; - while ((pOld < pHelR)) - pOld += 2.0 * Math.PI; - while ((pHelL < pOld)) - pHelL += 2.0 * Math.PI; - while ((pLimL < pHelL)) - pLimL += 2.0 * Math.PI; - - double minDelta = normalizeAngle((pLimR - pHelR) + 0.25); - double maxDelta = normalizeAngle((pLimL - pHelL) - 0.25); - while (maxDelta < minDelta) - maxDelta += 2.0 * Math.PI; - double delta = normalizeAngle(pNew - pOld); - while (delta < minDelta) - delta += 2.0 * Math.PI; - - if (delta > maxDelta) { - double distanceMax = delta - maxDelta; - double distanceMin = minDelta - (delta - 2.0 * Math.PI); - if (distanceMin < distanceMax) { - delta = minDelta; - } else { - delta = maxDelta; - } - } - double corrected = RNA - .correctHysteresis((delta + base + (pHelR + pHelL) / 2.)); - delta = corrected - (base + (pHelR + pHelL) / 2.); - _undoableEditSupport.postEdit(new VARNAEdits.HelixRotateEdit(delta, - base, pLimL, pLimR, h, ml, _vp)); - UIRotateEverything(delta, base, pLimL, pLimR, h, ml); - } - - public void UIRotateEverything(double delta, double base, double pLimL, - double pLimR, Point h, Point ml) { - Hashtable backupPos = new Hashtable(); - _vp.getRNA().rotateEverything(delta, base, pLimL, pLimR, h, ml, - backupPos); - _vp.fireLayoutChanged(backupPos); - } - - private double normalizeAngle(double angle) { - return normalizeAngle(angle, 0.0); - } - - private double normalizeAngle(double angle, double base) { - while (angle < base) { - angle += 2.0 * Math.PI; - } - while (angle >= (2.0 * Math.PI) - base) { - angle -= 2.0 * Math.PI; - } - return angle; - } - - public void UIThicknessBasePairs(ArrayList bases) { - final VueBPThickness vbpt = new VueBPThickness(_vp, bases); - Runnable cancel = new Runnable() { - - @Override - public void run() { - vbpt.restoreThicknesses(); - _vp.repaint(); - } - - }; - showConfirmDialog(vbpt.getPanel(), "Set base pair(s) thickness", null, cancel, cancel); - } - - - -} diff --git a/src2/fr/orsay/lri/varna/views/VueZoom.java b/src2/fr/orsay/lri/varna/views/VueZoom.java deleted file mode 100644 index 08b75f9..0000000 --- a/src2/fr/orsay/lri/varna/views/VueZoom.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - 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.views; - -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.GridLayout; - -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSlider; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import fr.orsay.lri.varna.VARNAPanel; -import fr.orsay.lri.varna.controlers.ControleurSliderLabel; -import fr.orsay.lri.varna.controlers.ControleurZoom; -import fr.orsay.lri.varna.models.VARNAConfig; - -public class VueZoom implements ChangeListener { - - private VARNAPanel _vp; - private JSlider zoomSlider, zoomAmountSlider; - private JPanel panel; - - public VueZoom(VARNAPanel vp) { - _vp = vp; - - JPanel pup = new JPanel(); - JPanel pdown = new JPanel(); - panel = new JPanel(); - panel.setLayout(new GridLayout(2, 1)); - pup.setLayout(new FlowLayout(FlowLayout.LEFT)); - pdown.setLayout(new FlowLayout(FlowLayout.LEFT)); - - zoomSlider = new JSlider(JSlider.HORIZONTAL, - (int) (VARNAConfig.MIN_ZOOM * 100), - (int) (VARNAConfig.MAX_ZOOM * 100), (int) (_vp.getZoom() * 100)); - // Turn on labels at major tick marks. - zoomSlider.setMajorTickSpacing(2000); - zoomSlider.setMinorTickSpacing(500); - zoomSlider.setPaintTicks(true); - zoomSlider.setPaintLabels(true); - zoomSlider.setPreferredSize(new Dimension(250, zoomSlider - .getPreferredSize().height)); - zoomSlider.addChangeListener(new ControleurZoom(this)); - - JLabel zoomValueLabel = new JLabel(String.valueOf(_vp.getZoom())); - zoomValueLabel.setPreferredSize(new Dimension(50, zoomValueLabel - .getPreferredSize().height)); - zoomSlider.addChangeListener(new ControleurSliderLabel(zoomValueLabel, - true)); - - zoomAmountSlider = new JSlider(JSlider.HORIZONTAL, - (int) (VARNAConfig.MIN_AMOUNT * 100), - (int) (VARNAConfig.MAX_AMOUNT * 100), (int) (_vp - .getZoomIncrement() * 100)); - // Turn on labels at major tick marks. - zoomAmountSlider.setMajorTickSpacing(50); - zoomAmountSlider.setMinorTickSpacing(10); - zoomAmountSlider.setPaintTicks(true); - zoomAmountSlider.setPaintLabels(true); - zoomAmountSlider.setPreferredSize(new Dimension(200, zoomAmountSlider - .getPreferredSize().height)); - - JLabel zoomAmountValueLabel = new JLabel(String.valueOf(_vp - .getZoomIncrement())); - zoomAmountValueLabel.setPreferredSize(new Dimension(50, - zoomAmountValueLabel.getPreferredSize().height)); - zoomAmountSlider.addChangeListener(new ControleurSliderLabel( - zoomAmountValueLabel, true)); - zoomAmountSlider.addChangeListener(this); - - JLabel labelZ = new JLabel("Zoom:"); - JLabel labelA = new JLabel("Increment:"); - - pup.add(labelZ); - pup.add(zoomSlider); - pup.add(zoomValueLabel); - pdown.add(labelA); - pdown.add(zoomAmountSlider); - pdown.add(zoomAmountValueLabel); - panel.add(pup); - panel.add(pdown); - } - - public JPanel getPanel() { - return panel; - } - - public double getZoom() { - return zoomSlider.getValue() / 100.0; - } - - public double getZoomAmount() { - return zoomAmountSlider.getValue() / 100.0; - } - - public VARNAPanel get_vp() { - return _vp; - } - - public void stateChanged(ChangeEvent e) { - _vp.setZoomIncrement(getZoomAmount()); - } -} diff --git a/src2/javajs/J2SIgnoreImport.java b/src2/javajs/J2SIgnoreImport.java deleted file mode 100644 index b92c82b..0000000 --- a/src2/javajs/J2SIgnoreImport.java +++ /dev/null @@ -1,7 +0,0 @@ -package javajs; - -public @interface J2SIgnoreImport { - - Class[] value(); - -} diff --git a/src2/javajs/J2SRequireImport.java b/src2/javajs/J2SRequireImport.java deleted file mode 100644 index 646cebd..0000000 --- a/src2/javajs/J2SRequireImport.java +++ /dev/null @@ -1,7 +0,0 @@ -package javajs; - -public @interface J2SRequireImport { - - Class[] value(); - -} diff --git a/src2/javajs/_README.txt b/src2/javajs/_README.txt deleted file mode 100644 index e8c3779..0000000 --- a/src2/javajs/_README.txt +++ /dev/null @@ -1,38 +0,0 @@ -The javajs directory contains a variety of Java files that you are -encouraged to use in your project. It is self-contained, and the -classes and methods all work in Java as well as JavaScript. - -These classes perform functions not standard in Java or provide -classes that are particularly optimized for JavaScript (fewer overloaded -methods, especially). - --- creating (minimal) PDF files --- decoding and encoding image files --- working with binary, compound document, JSON, and zip data --- providing very efficient classes for vectors, matricies, and quaternions --- providing a java.lang.Thread subclass (JSThread) that can be used - wherever a thread is necessary; note that JSThread cannot sleep(), but - it provides a means of managing setTimeout callbacks that is very easy - to implement. --- providing two very important annotations: - - @J2SIgnoreImport Indicates that this class will never be used in JavaScript - and thus does not need to be indicated as a dependency. In - some cases, this annotation is necessary just to break a - cyclical dependency that Java somehow handles, but J2S does not. - - @J2SRequireImport Allows a SwingJS developer to work around J2S transpiler - issues that for some reason it is not indicating the need for - a dependent class. Typically this is because a static call - to a static method in a class. - - In addition, though, @J2SRequireImport can be used to "inject" - JavaScript at a specific point in code loading. For example, - swingjs.plaf.JSSlider uses the following annotation to load - jQueryUI, fooling J2S to think that it is a "class" file. - - @J2SRequireImport(swingjs.jquery.JQueryUI.class) - - -All files in the javajs/util directory will be moved to j2s/JU by a build script. - diff --git a/src2/javajs/api/BytePoster.java b/src2/javajs/api/BytePoster.java deleted file mode 100644 index 0b0f29a..0000000 --- a/src2/javajs/api/BytePoster.java +++ /dev/null @@ -1,7 +0,0 @@ -package javajs.api; - -public interface BytePoster { - - String postByteArray(String fileName, byte[] bytes); - -} diff --git a/src2/javajs/api/EigenInterface.java b/src2/javajs/api/EigenInterface.java deleted file mode 100644 index 4a1b592..0000000 --- a/src2/javajs/api/EigenInterface.java +++ /dev/null @@ -1,15 +0,0 @@ -package javajs.api; - -import javajs.util.V3; - -public interface EigenInterface { - - EigenInterface setM(double[][] n); - - double[] getEigenvalues(); - - void fillFloatArrays(V3[] eigenVectors, float[] eigenValues); - - float[][] getEigenvectorsFloatTransposed(); - -} diff --git a/src2/javajs/api/GenericBinaryDocument.java b/src2/javajs/api/GenericBinaryDocument.java deleted file mode 100644 index 823bd2a..0000000 --- a/src2/javajs/api/GenericBinaryDocument.java +++ /dev/null @@ -1,40 +0,0 @@ -package javajs.api; - -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.InputStream; -import java.util.Map; - - -import javajs.util.SB; - -public interface GenericBinaryDocument extends GenericBinaryDocumentReader { - - GenericBinaryDocument setStream(BufferedInputStream bis, boolean isBigEndian); - - void setStreamData(DataInputStream dataInputStream, boolean isBigEndian); - - long getPosition(); - - SB getAllDataFiles(String binaryFileList, String firstFile); - - void getAllDataMapped(String replace, String string, Map fileData); - - int swapBytesI(int nx); - - short swapBytesS(short s); - - void seek(long i); - - void setOutputChannel(GenericOutputChannel out); - - InputStream getInputStream(); - - int readIntLE() throws Exception; - - int readByteArray(byte[] b, int off, int len) throws Exception; - - - void close(); - -} diff --git a/src2/javajs/api/GenericBinaryDocumentReader.java b/src2/javajs/api/GenericBinaryDocumentReader.java deleted file mode 100644 index aea6f63..0000000 --- a/src2/javajs/api/GenericBinaryDocumentReader.java +++ /dev/null @@ -1,25 +0,0 @@ -package javajs.api; - -public interface GenericBinaryDocumentReader { - - byte readByte() throws Exception; - - byte[] readBytes(int n) throws Exception; - - int readUInt8() throws Exception; - - int readInt() throws Exception; - - short readShort() throws Exception; - - int readUnsignedShort() throws Exception; - - long readLong() throws Exception; - - float readFloat() throws Exception; - - double readDouble() throws Exception; - - String readString(int i) throws Exception; - -} diff --git a/src2/javajs/api/GenericCifDataParser.java b/src2/javajs/api/GenericCifDataParser.java deleted file mode 100644 index 81a71f7..0000000 --- a/src2/javajs/api/GenericCifDataParser.java +++ /dev/null @@ -1,45 +0,0 @@ -package javajs.api; - -import java.io.BufferedReader; -import java.util.Map; - - -public interface GenericCifDataParser { - - static final int NONE = -1; - - String fullTrim(String str); - - Map getAllCifData(); - - boolean getData() throws Exception; - - String getColumnName(int i); - - int getColumnCount(); - - String getFileHeader(); - - Object peekToken() throws Exception; - - Object getTokenPeeked(); - - Object getColumnData(int i); - - Object getNextDataToken() throws Exception; - - String getNextToken() throws Exception; - - void parseDataBlockParameters(String[] fields, String key, String data, int[] key2col, int[] col2key) throws Exception; - - String readLine(); - - GenericCifDataParser set(GenericLineReader reader, BufferedReader br, boolean debugging); - - String toUnicode(String data); - - String skipLoop(boolean doReport) throws Exception; - - String fixKey(String key); - -} diff --git a/src2/javajs/api/GenericColor.java b/src2/javajs/api/GenericColor.java deleted file mode 100644 index 57cf169..0000000 --- a/src2/javajs/api/GenericColor.java +++ /dev/null @@ -1,19 +0,0 @@ -package javajs.api; - -/** - * GenericColor allows both java.awt.Color and javajs.awt.Color to be - * handled by methods that need not distinguish between them. It is used - * in the javajs package for the background color of a javajs.swing.JComponent - * - * @author hansonr - * - */ -public interface GenericColor { - - int getRGB(); - - int getOpacity255(); - - void setOpacity255(int a); - -} diff --git a/src2/javajs/api/GenericImageDialog.java b/src2/javajs/api/GenericImageDialog.java deleted file mode 100644 index 54d8503..0000000 --- a/src2/javajs/api/GenericImageDialog.java +++ /dev/null @@ -1,9 +0,0 @@ -package javajs.api; - -public interface GenericImageDialog { - - void closeMe(); - - void setImage(Object image); - -} diff --git a/src2/javajs/api/GenericImageEncoder.java b/src2/javajs/api/GenericImageEncoder.java deleted file mode 100644 index 9aa7477..0000000 --- a/src2/javajs/api/GenericImageEncoder.java +++ /dev/null @@ -1,12 +0,0 @@ -package javajs.api; - -import java.util.Map; - -import javajs.util.OC; - -public interface GenericImageEncoder { - - public boolean createImage(String type, OC out, - Map params) throws Exception; - -} diff --git a/src2/javajs/api/GenericLineReader.java b/src2/javajs/api/GenericLineReader.java deleted file mode 100644 index f113a8b..0000000 --- a/src2/javajs/api/GenericLineReader.java +++ /dev/null @@ -1,5 +0,0 @@ -package javajs.api; - -public interface GenericLineReader { - public String readNextLine() throws Exception; -} diff --git a/src2/javajs/api/GenericOutputChannel.java b/src2/javajs/api/GenericOutputChannel.java deleted file mode 100644 index 73649d7..0000000 --- a/src2/javajs/api/GenericOutputChannel.java +++ /dev/null @@ -1,22 +0,0 @@ -package javajs.api; - -public interface GenericOutputChannel { - - boolean isBigEndian(); - - void writeByteAsInt(int b); - - void write(byte[] b, int off, int n); - - void writeInt(int i); - - void reset(); - - String closeChannel(); - - void writeLong(long b); - - void writeShort(short i); - - -} diff --git a/src2/javajs/api/GenericZipInputStream.java b/src2/javajs/api/GenericZipInputStream.java deleted file mode 100644 index e2e8018..0000000 --- a/src2/javajs/api/GenericZipInputStream.java +++ /dev/null @@ -1,13 +0,0 @@ -package javajs.api; - - -import java.io.InputStream; -import java.util.zip.ZipInputStream; - -public class GenericZipInputStream extends ZipInputStream implements ZInputStream { - - public GenericZipInputStream(InputStream in) { - super(in); - } - -} \ No newline at end of file diff --git a/src2/javajs/api/GenericZipTools.java b/src2/javajs/api/GenericZipTools.java deleted file mode 100644 index 47a2da2..0000000 --- a/src2/javajs/api/GenericZipTools.java +++ /dev/null @@ -1,47 +0,0 @@ -package javajs.api; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; - -import java.util.Map; - - -public interface GenericZipTools { - - public ZInputStream newZipInputStream(InputStream is); - - public String getZipDirectoryAsStringAndClose(BufferedInputStream t); - - public InputStream newGZIPInputStream(InputStream bis) throws IOException; - - public InputStream newBZip2InputStream(InputStream bis) throws IOException; - - public Object getZipFileDirectory(BufferedInputStream bis, - String[] subFileList, int listPtr, boolean asBufferedInputStream); - - public String[] getZipDirectoryAndClose(BufferedInputStream t, - String manifestID); - - public void getAllZipData(InputStream bis, String[] subFileList, - String replace, String binaryFileList, String exclude, - Map fileData); - - public Object getZipFileContentsAsBytes(BufferedInputStream bis, - String[] subFileList, int i); - - public void addZipEntry(Object zos, String fileName) throws IOException; - - public void closeZipEntry(Object zos) throws IOException; - - public Object getZipOutputStream(Object bos); - - public int getCrcValue(byte[] bytes); - - public void readFileAsMap(BufferedInputStream is, Map bdata, String name); - - public String cacheZipContents(BufferedInputStream bis, String shortName, - Map cache, boolean asByteArray); - - BufferedInputStream getUnGzippedInputStream(byte[] bytes); -} diff --git a/src2/javajs/api/Interface.java b/src2/javajs/api/Interface.java deleted file mode 100644 index 418d528..0000000 --- a/src2/javajs/api/Interface.java +++ /dev/null @@ -1,54 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2006 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package javajs.api; - -public class Interface { - - public static Object getInterface(String name) { - try { - Class x = Class.forName(name); - return (x == null ? null : x.newInstance()); - } catch (Exception e) { - System.out.println("Interface.getInterface Error creating instance for " + name + ": \n" + e); - return null; - } - } - - public static Object getInstanceWithParams(String name, Class[] classes, Object... params) { - try { - Class cl = Class.forName(name); - return cl.getConstructor(classes).newInstance(params); - } catch (Exception e) { - System.out.println("Interface.getInterfaceWithParams Error creating instance for " + name + ": \n" + e); - return null; - } - } - - -} diff --git a/src2/javajs/api/JSFunction.java b/src2/javajs/api/JSFunction.java deleted file mode 100644 index 1c6c108..0000000 --- a/src2/javajs/api/JSFunction.java +++ /dev/null @@ -1,12 +0,0 @@ -package javajs.api; - -/** - * A flag that this object is really a JavaScript function that, for example, - * might be called from setTimeout(). - * - * @author Bob Hanson - * - */ -public interface JSFunction { - -} diff --git a/src2/javajs/api/JSInterface.java b/src2/javajs/api/JSInterface.java deleted file mode 100644 index 0f785fa..0000000 --- a/src2/javajs/api/JSInterface.java +++ /dev/null @@ -1,30 +0,0 @@ -package javajs.api; - -/** - * called by JSmol JavaScript methods using - * - * this._applet.xxxx() - * - */ -public interface JSInterface { - - int cacheFileByName(String fileName, boolean isAdd); - void cachePut(String key, Object data); - void destroy(); - String getFullName(); - void openFileAsyncSpecial(String fileName, int flags); - boolean processMouseEvent(int id, int x, int y, int modifiers, long time); - void processTwoPointGesture(float[][][] touches); - void setDisplay(Object canvas); - void setScreenDimension(int width, int height); - boolean setStatusDragDropped(int mode, int x, int y, String fileName); - void startHoverWatcher(boolean enable); - void update(); - - // these are not general methods -//Object getGLmolView(); -//String loadInlineString(String mol, String script, boolean isAppend); -//String openFile(String fileName); - -} - diff --git a/src2/javajs/api/JSONEncodable.java b/src2/javajs/api/JSONEncodable.java deleted file mode 100644 index b013279..0000000 --- a/src2/javajs/api/JSONEncodable.java +++ /dev/null @@ -1,7 +0,0 @@ -package javajs.api; - -public interface JSONEncodable { - - String toJSON(); - -} diff --git a/src2/javajs/api/ResettableStream.java b/src2/javajs/api/ResettableStream.java deleted file mode 100644 index 5ded55f..0000000 --- a/src2/javajs/api/ResettableStream.java +++ /dev/null @@ -1,7 +0,0 @@ -package javajs.api; - -public interface ResettableStream { - - void resetStream(); - -} diff --git a/src2/javajs/api/ZInputStream.java b/src2/javajs/api/ZInputStream.java deleted file mode 100644 index a3310f6..0000000 --- a/src2/javajs/api/ZInputStream.java +++ /dev/null @@ -1,6 +0,0 @@ -package javajs.api; - -public interface ZInputStream { - // placeholder for ZipInputStream not requiring direct access to java.util.zip - -} diff --git a/src2/javajs/api/js/J2SObjectInterface.java b/src2/javajs/api/js/J2SObjectInterface.java deleted file mode 100644 index 687f642..0000000 --- a/src2/javajs/api/js/J2SObjectInterface.java +++ /dev/null @@ -1,12 +0,0 @@ -package javajs.api.js; - -/** - * methods in JSmol JavaScript accessed in Jmol - */ -public interface J2SObjectInterface { - - Object _doAjax(Object url, String postOut, Object bytesOrStringOut, boolean isBinary); - - void _apply(Object func, Object data); - -} diff --git a/src2/javajs/api/js/JSInterface.java b/src2/javajs/api/js/JSInterface.java deleted file mode 100644 index 9b26631..0000000 --- a/src2/javajs/api/js/JSInterface.java +++ /dev/null @@ -1,41 +0,0 @@ -package javajs.api.js; - -/** - * called by JSmol JavaScript methods using - * - * this._applet.xxxx() - * - */ -public interface JSInterface { - - int cacheFileByName(String fileName, boolean isAdd); - - void cachePut(String key, Object data); - - void destroy(); - - String getFullName(); - - void openFileAsyncSpecial(String fileName, int flags); - - boolean processMouseEvent(int id, int x, int y, int modifiers, long time); - - void processTwoPointGesture(float[][][] touches); - - void setDisplay(Object canvas); - - void setScreenDimension(int width, int height); - - boolean setStatusDragDropped(int mode, int x, int y, String fileName); - - void startHoverWatcher(boolean enable); - - - - // these are not general methods - // Object getGLmolView(); - // String loadInlineString(String mol, String script, boolean isAppend); - // String openFile(String fileName); - -} - diff --git a/src2/javajs/export/PDFCreator.java b/src2/javajs/export/PDFCreator.java deleted file mode 100644 index 8306d94..0000000 --- a/src2/javajs/export/PDFCreator.java +++ /dev/null @@ -1,367 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2009-06-30 18:58:33 -0500 (Tue, 30 Jun 2009) $ - * $Revision: 11158 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2002-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.export; - -import java.io.IOException; -import java.io.OutputStream; -import java.util.Hashtable; -import java.util.Map; -import java.util.Map.Entry; - -import javajs.util.Lst; -import javajs.util.SB; - - - -public class PDFCreator { - - private OutputStream os; - private Lst indirectObjects; - private PDFObject root; - private PDFObject graphics; -// private PDFObject pageResources; -// private PDFObject graphicsResources; - - private int pt; - private int xrefPt; - private int count; - - private int height; - private int width; - - private Mapfonts; - - public PDFCreator() { - // for Class.forName - } - - public void setOutputStream(OutputStream os) { - this.os = os; - } - - public void newDocument(int paperWidth, int paperHeight, boolean isLandscape) { - width = (isLandscape ? paperHeight : paperWidth); - height = (isLandscape ? paperWidth : paperHeight); - System.out.println("Creating PDF with width=" + width + " and height=" + height); - fonts = new Hashtable(); - indirectObjects = new Lst(); - //graphicsResources = newObject(null); - //pageResources = newObject(null); // will set this to compressed stream later - root = newObject("Catalog"); - PDFObject pages = newObject("Pages"); - PDFObject page = newObject("Page"); - PDFObject pageContents = newObject(null); - graphics = newObject("XObject"); - - root.addDef("Pages", pages.getRef()); - pages.addDef("Count", "1"); - pages.addDef("Kids", "[ " + page.getRef() +" ]"); - page.addDef("Parent", pages.getRef()); - page.addDef("MediaBox", "[ 0 0 " + paperWidth + " " + paperHeight + " ]"); - if (isLandscape) - page.addDef("Rotate", "90"); - - pageContents.addDef("Length", "?"); - pageContents.append((isLandscape ? "q 0 1 1 0 0 0 " : "q 1 0 0 -1 0 "+(paperHeight))+" cm /" + graphics.getID() + " Do Q"); - page.addDef("Contents", pageContents.getRef()); - addProcSet(page); - addProcSet(graphics); - // will add fonts as well as they are needed - graphics.addDef("Subtype", "/Form"); - graphics.addDef("FormType", "1"); - graphics.addDef("BBox", "[0 0 " + width + " " + height + "]"); - graphics.addDef("Matrix", "[1 0 0 1 0 0]"); - graphics.addDef("Length", "?"); - page.addResource("XObject", graphics.getID(), graphics.getRef()); - g("q 1 w 1 J 1 j 10 M []0 d q "); // line width 1, line cap circle, line join circle, miter limit 10, solid - clip(0, 0, width, height); - } - - private void addProcSet(PDFObject o) { - o.addResource(null, "ProcSet", "[/PDF /Text /ImageB /ImageC /ImageI]"); - } - - private void clip(int x1, int y1, int x2, int y2) { - moveto(x1, y1); - lineto(x2, y1); - lineto(x2, y2); - lineto(x1, y2); - g("h W n"); - } - - public void moveto(int x, int y) { - g(x + " " + y + " m"); - } - - public void lineto(int x, int y) { - g(x + " " + y + " l"); - } - - private PDFObject newObject(String type) { - PDFObject o = new PDFObject(++count); - if (type != null) - o.addDef("Type", "/" + type); - indirectObjects.addLast(o); - return o; - } - - public void addInfo(Map data) { - Hashtable info = new Hashtable(); - for (Entry e: data.entrySet()) { - String value = "(" + e.getValue().replace(')','_').replace('(','_')+ ")"; - info.put(e.getKey(), value); - } - root.addDef("Info", info); - } - - private PDFObject addFontResource(String fname) { - PDFObject f = newObject("Font"); - fonts.put(fname, f); - f.addDef("BaseFont", fname); - f.addDef("Encoding", "/WinAnsiEncoding"); - f.addDef("Subtype", "/Type1"); - graphics.addResource("Font", f.getID(), f.getRef()); - return f; - } - - private Map images; - - public void addImageResource(Object newImage, int width, int height, int[] buffer, boolean isRGB) { - PDFObject imageObj = newObject("XObject"); - if (images == null) - images = new Hashtable(); - images.put(newImage, imageObj); - imageObj.addDef("Subtype", "/Image"); - imageObj.addDef("Length", "?"); - imageObj.addDef("ColorSpace", isRGB ? "/DeviceRGB" : "/DeviceGray"); - imageObj.addDef("BitsPerComponent", "8"); - imageObj.addDef("Width", "" + width); - imageObj.addDef("Height", "" + height); - graphics.addResource("XObject", imageObj.getID(), imageObj.getRef()); - int n = buffer.length; - byte[] stream = new byte[n * (isRGB ? 3 : 1)]; - if (isRGB) { - for (int i = 0, pt = 0; i < n; i++) { - stream[pt++] = (byte) ((buffer[i] >> 16) & 0xFF); - stream[pt++] = (byte) ((buffer[i] >> 8) & 0xFF); - stream[pt++] = (byte) (buffer[i] & 0xFF); - } - } else { - for (int i = 0; i < n; i++) - stream[i] = (byte) buffer[i]; - } - imageObj.setStream(stream); - graphics.addResource("XObject", imageObj.getID(), imageObj.getRef()); - } - - public void g(String cmd) { - graphics.append(cmd).appendC('\n'); - } - - private void output(String s) throws IOException { - byte[] b = s.getBytes(); - os.write(b, 0, b.length); - pt += b.length; - } - - public void closeDocument() throws IOException { - g("Q Q"); - outputHeader(); - writeObjects(); - writeXRefTable(); - writeTrailer(); - os.flush(); - os.close(); - } - - private void outputHeader() throws IOException { - output("%PDF-1.3\n%"); - byte[] b = new byte[] {-1, -1, -1, -1}; - os.write(b, 0, b.length); - pt += 4; - output("\n"); - } - - private void writeTrailer() throws IOException { - PDFObject trailer = new PDFObject(-2); - output("trailer"); - trailer.addDef("Size", "" + indirectObjects.size()); - trailer.addDef("Root", root.getRef()); - trailer.output(os); - output("startxref\n"); - output("" + xrefPt + "\n"); - output("%%EOF\n"); - } - - /** - * Write Font objects first. - * - * @throws IOException - */ - private void writeObjects() throws IOException { - int nObj = indirectObjects.size(); - for (int i = 0; i < nObj; i++) { - PDFObject o = indirectObjects.get(i); - if (!o.isFont()) - continue; - o.pt = pt; - pt += o.output(os); - } - for (int i = 0; i < nObj; i++) { - PDFObject o = indirectObjects.get(i); - if (o.isFont()) - continue; - o.pt = pt; - pt += o.output(os); - } - } - - private void writeXRefTable() throws IOException { - xrefPt = pt; - int nObj = indirectObjects.size(); - SB sb = new SB(); - // note trailing space, needed because \n is just one character - sb.append("xref\n0 " + (nObj + 1) - + "\n0000000000 65535 f\r\n"); - for (int i = 0; i < nObj; i++) { - PDFObject o = indirectObjects.get(i); - String s = "0000000000" + o.pt; - sb.append(s.substring(s.length() - 10)); - sb.append(" 00000 n\r\n"); - } - output(sb.toString()); - } - - public boolean canDoLineTo() { - return true; - } - - public void fill() { - g("f"); - } - - public void stroke() { - g("S"); - } - - public void doCircle(int x, int y, int r, boolean doFill) { - double d = r*4*(Math.sqrt(2)-1)/3; - double dx = x; - double dy = y; - g((dx + r) + " " + dy + " m"); - g((dx + r) + " " + (dy + d) + " " + (dx + d) + " " + (dy + r) + " " + (dx) + " " + (dy + r) + " " + " c"); - g((dx - d) + " " + (dy + r) + " " + (dx - r) + " " + (dy + d) + " " + (dx - r) + " " + (dy) + " c"); - g((dx - r) + " " + (dy - d) + " " + (dx - d) + " " + (dy - r) + " " + (dx) + " " + (dy - r) + " c"); - g((dx + d) + " " + (dy - r) + " " + (dx + r) + " " + (dy - d) + " " + (dx + r) + " " + (dy) + " c"); - g(doFill ? "f" : "s"); - } - - public void doPolygon(int[] axPoints, int[] ayPoints, int nPoints, boolean doFill) { - moveto(axPoints[0], ayPoints[0]); - for (int i = 1; i < nPoints; i++) - lineto(axPoints[i], ayPoints[i]); - g(doFill ? "f" : "s"); - } - - public void doRect(int x, int y, int width, int height, boolean doFill) { - g(x + " " + y + " " + width + " " + height + " re " + (doFill ? "f" : "s")); - } - - public void drawImage(Object image, int destX0, int destY0, - int destX1, int destY1, int srcX0, int srcY0, int srcX1, int srcY1) { - PDFObject imageObj = images.get(image); - if (imageObj == null) - return; - g("q"); - clip(destX0, destY0, destX1, destY1); - double iw = Double.parseDouble((String) imageObj.getDef("Width")); - double ih = Double.parseDouble((String) imageObj.getDef("Height")); - double dw = (destX1 - destX0 + 1); - double dh = (destY1 - destY0 + 1); - double sw = (srcX1 - srcX0 + 1); - double sh = (srcY1 - srcY0 + 1); - double scaleX = dw / sw; - double scaleY = dh / sh; - double transX = destX0 - srcX0 * scaleX; - double transY = destY0 + (ih - srcY0) * scaleY; - g(scaleX*iw + " 0 0 " + -scaleY*ih + " " + transX + " " + transY + " cm"); - g("/" + imageObj.getID() + " Do"); - g("Q"); - } - - public void drawStringRotated(String s, int x, int y, int angle) { - g("q " + getRotation(angle) + " " + x + " " + y - + " cm BT(" + s + ")Tj ET Q"); - } - - public String getRotation(int angle) { - float cos = 0, sin = 0; - switch (angle) { - case 0: - cos = 1; - break; - case 90: - sin = 1; - break; - case -90: - sin = -1; - break; - case 180: - cos = -1; - break; - default: - float a = (float) (angle * (Math.PI / 180)); - cos = (float) Math.cos(a); - sin = (float) Math.sin(a); - if (Math.abs(cos) < 0.0001) - cos = 0; - if (Math.abs(sin) < 0.0001) - sin = 0; - } - return cos + " " + sin + " " + sin + " " + -cos; - } - - public void setColor(float[] rgb, boolean isFill) { - g(rgb[0] + " " + rgb[1] + " " + rgb[2] + (isFill ? " rg" : " RG")); - } - - public void setFont(String fname, float size) { - PDFObject f = fonts.get(fname); - if (f == null) - f = addFontResource(fname); - g("/" + f.getID() + " " + size + " Tf"); - } - - public void setLineWidth(float width) { - g(width + " w"); - } - - public void translateScale(float x, float y, float scale) { - g(scale + " 0 0 " + scale + " " + x + " " + y + " cm"); - } - -} diff --git a/src2/javajs/export/PDFObject.java b/src2/javajs/export/PDFObject.java deleted file mode 100644 index 176dc19..0000000 --- a/src2/javajs/export/PDFObject.java +++ /dev/null @@ -1,152 +0,0 @@ -package javajs.export; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Hashtable; -import java.util.Map; -import java.util.Map.Entry; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; - -import javajs.util.SB; - - -/** - * A rudimentary class for working with PDF document creation. - * Written from scratch based on PDF Reference 13. - * - * @author hansonr Bob Hanson hansonr@stolaf.edu 10/28/2013 - * - */ -class PDFObject extends SB { - private Map dictionary; - private byte[] stream; - private int index; - String type; - int len; - int pt; - - PDFObject(int index) { - this.index = index; - } - - String getRef() { - return index + " 0 R"; - } - - String getID() { - return type.substring(0, 1) + index; - } - - boolean isFont() { - return "Font".equals(type); - } - - void setStream(byte[] stream) { - this.stream = stream; - } - - Object getDef(String key) { - return dictionary.get(key); - } - - void addDef(String key, Object value) { - if (dictionary == null) - dictionary = new Hashtable(); - dictionary.put(key, value); - if (key.equals("Type")) - type = ((String) value).substring(1); - } - - void setAsStream() { - stream = toBytes(0, -1); - setLength(0); - } - - int output(OutputStream os) throws IOException { - if (index > 0) { - String s = index + " 0 obj\n"; - write(os, s.getBytes(), 0); - } - int streamLen = 0; - if (dictionary != null) { - if (dictionary.containsKey("Length")) { - if (stream == null) - setAsStream(); - streamLen = stream.length; - boolean doDeflate = (streamLen > 1000); - if (doDeflate) { - Deflater deflater = new Deflater(9); - ByteArrayOutputStream outBytes = new ByteArrayOutputStream(1024); - DeflaterOutputStream compBytes = new DeflaterOutputStream(outBytes, - deflater); - compBytes.write(stream, 0, streamLen); - compBytes.finish(); - stream = outBytes.toByteArray(); - dictionary.put("Filter", "/FlateDecode"); - streamLen = stream.length; - } - dictionary.put("Length", "" + streamLen); - } - write(os, getDictionaryText(dictionary, "\n").getBytes(), 0); - } - if (length() > 0) - write(os, this.toString().getBytes(), 0); - if (stream != null) { - write(os, "stream\r\n".getBytes(), 0); - write(os, stream, streamLen); - write(os, "\r\nendstream\r\n".getBytes(), 0); - } - if (index > 0) - write(os, "endobj\n".getBytes(), 0); - return len; - } - - private void write(OutputStream os, byte[] bytes, int nBytes) throws IOException { - if (nBytes == 0) - nBytes = bytes.length; - len += nBytes; - os.write(bytes, 0, nBytes); - } - - @SuppressWarnings("unchecked") - private String getDictionaryText(Map d, String nl) { - SB sb = new SB(); - sb.append("<<"); - if (d.containsKey("Type")) - sb.append("/Type").appendO(d.get("Type")); - for (Entry e : d.entrySet()) { - String s = e.getKey(); - if (s.equals("Type") || s.startsWith("!")) - continue; - sb.append("/" + s); - Object o = e.getValue(); - if (o instanceof Map) { - sb.append((getDictionaryText((Map) o, ""))); - continue; - } - s = (String) e.getValue(); - if (!s.startsWith("/")) - sb.append(" "); - sb.appendO(s); - } - return (sb.length() > 3 ? sb.append(">>").append(nl).toString() : ""); - } - - @SuppressWarnings("unchecked") - private Map createSubdict(Map d0, String dict) { - Map d = (Map) d0.get(dict); - if (d == null) - d0.put(dict, d = new Hashtable()); - return d; - } - - void addResource(String type, String key, String value) { - Map r = createSubdict(dictionary, "Resources"); - if (type != null) - r = createSubdict(r, type); - r.put(key, value); - } - -} diff --git a/src2/javajs/img/BMPDecoder.java b/src2/javajs/img/BMPDecoder.java deleted file mode 100644 index 4c94c9b..0000000 --- a/src2/javajs/img/BMPDecoder.java +++ /dev/null @@ -1,211 +0,0 @@ -/* $RCSfile$ - * $Author: nicove $ - * $Date: 2007-03-30 12:26:16 -0500 (Fri, 30 Mar 2007) $ - * $Revision: 7275 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2002-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.img; - -import java.io.BufferedInputStream; -import java.io.IOException; - -import javajs.util.Rdr; - -/** - * src: http://www.javaworld.com/article/2077542/learn-java/java-tip-43--how-to- - * read-8--and-24-bit-microsoft-windows-bitmaps-in-java-applications.html - * - * see also: http://en.wikipedia.org/wiki/BMP_file_format - * - * Modified by Bob Hanson hansonr@stolaf.edu - * - * @author Bob Hanson (hansonr@stolaf.edu) - * - */ -public class BMPDecoder { - - public BMPDecoder() { - // for reflection - } - - private BufferedInputStream bis; - - /** - * original comment: - * - * loadbitmap() method converted from Windows C code. Reads only uncompressed - * 24- and 8-bit images. Tested with images saved using Microsoft Paint in - * Windows 95. If the image is not a 24- or 8-bit image, the program refuses - * to even try. I guess one could include 4-bit images by masking the byte by - * first 1100 and then 0011. I am not really interested in such images. If a - * compressed image is attempted, the routine will probably fail by generating - * an IOException. Look for variable ncompression to be different from 0 to - * indicate compression is present. - * - * @param bytes - * @return [image byte array, width, height] - */ - public Object[] decodeWindowsBMP(byte[] bytes) { - try { - bis = Rdr.getBIS(bytes); - temp = new byte[4]; - // read BITMAPFILEHEADER - if (readByte() != 'B' || readByte() != 'M') - return null; - readInt(); // file size; ignored - readShort(); // reserved - readShort(); // reserved - readInt(); // ptr to pixel array; ignored - int imageWidth, imageHeight, bitsPerPixel, nColors = 0, imageSize = 0; - // read BITMAP header - int headerSize = readInt(); - switch (headerSize) { - case 12: - // BITMAPCOREHEADER - imageWidth = readShort(); - imageHeight = readShort(); - readShort(); // planes - bitsPerPixel = readShort(); - break; - case 40: - // BITMAPINFOHEADER - imageWidth = readInt(); - imageHeight = readInt(); - readShort(); // planes - bitsPerPixel = readShort(); - int ncompression = readInt(); - if (ncompression != 0) { - System.out.println("BMP Compression is :" + ncompression - + " -- aborting"); - return null; - } - imageSize = readInt(); - readInt(); // hres - readInt(); // vres - nColors = readInt(); - readInt(); // colors used - break; - default: - System.out.println("BMP Header unrecognized, length=" + headerSize - + " -- aborting"); - return null; - } - boolean isYReversed = (imageHeight < 0); - if (isYReversed) - imageHeight = -imageHeight; - int nPixels = imageHeight * imageWidth; - int bytesPerPixel = bitsPerPixel / 8; - nColors = (nColors > 0 ? nColors : 1 << bitsPerPixel); - int npad = (bytesPerPixel == 4 ? 0 - : imageSize == 0 ? 4 - (imageWidth % 4) : (imageSize / imageHeight) - - imageWidth * bytesPerPixel) % 4; - int[] palette; - int[] buf = new int[nPixels]; - int dpt = (isYReversed ? imageWidth : -imageWidth); - int pt0 = (isYReversed ? 0 : nPixels + dpt); - int pt1 = (isYReversed ? nPixels : dpt); - switch (bitsPerPixel) { - case 32: - case 24: - for (int pt = pt0; pt != pt1; pt += dpt, pad(npad)) - for (int i = 0; i < imageWidth; i++) - buf[pt + i] = readColor(bytesPerPixel); - break; - case 8: - palette = new int[nColors]; - for (int i = 0; i < nColors; i++) - palette[i] = readColor(4); - for (int pt = pt0; pt != pt1; pt += dpt, pad(npad)) - for (int i = 0; i < imageWidth; i++) - buf[pt + i] = palette[readByte()]; - break; - case 4: - npad = (4 - (((imageWidth + 1) / 2) % 4)) % 4; - palette = new int[nColors]; - for (int i = 0; i < nColors; i++) - palette[i] = readColor(4); - int b4 = 0; - for (int pt = pt0; pt != pt1; pt += dpt, pad(npad)) - for (int i = 0, shift = 4; i < imageWidth; i++, shift = 4 - shift) - buf[pt + i] = palette[((shift == 4 ? (b4 = readByte()) : b4) >> shift) & 0xF]; - break; - case 1: - int color1 = readColor(3); - int color2 = readColor(3); - npad = (4 - (((imageWidth + 7) / 8) % 4)) % 4; - int b = 0; - for (int pt = pt0; pt != pt1; pt += dpt, pad(npad)) - for (int i = 0, bpt = -1; i < imageWidth; i++, bpt--) { - if (bpt < 0) { - b = readByte(); - bpt = 7; - } - buf[pt + i] = ((b & (1 << bpt)) == 0 ? color1 : color2); - } - break; - case 64: - case 2: - default: - System.out - .println("Not a 32-, 24-, 8-, 4-, or 1-bit Windows Bitmap, aborting..."); - return null; - } - return new Object[] { buf, Integer.valueOf(imageWidth), - Integer.valueOf(imageHeight) }; - } catch (Exception e) { - System.out.println("Caught exception in loadbitmap!"); - } - return null; - } - - private boolean pad(int npad) throws IOException { - for (int i = 0; i < npad; i++) - readByte(); - return true; - } - - private byte[] temp; - - private int readColor(int n) throws IOException { - bis.read(temp, 0, n); - return 0xff << 24 | ((temp[2] & 0xff) << 16) - | ((temp[1] & 0xff) << 8) | temp[0] & 0xff; - } - - private int readInt() throws IOException { - bis.read(temp, 0, 4); - return ((temp[3] & 0xff) << 24) | ((temp[2] & 0xff) << 16) - | ((temp[1] & 0xff) << 8) | temp[0] & 0xff; - } - - private int readShort() throws IOException { - bis.read(temp, 0, 2); - return ((temp[1] & 0xff) << 8) | temp[0] & 0xff; - } - - private int readByte() throws IOException { - bis.read(temp, 0, 1); - return temp[0] & 0xff; - } - -} diff --git a/src2/javajs/img/CRCEncoder.java b/src2/javajs/img/CRCEncoder.java deleted file mode 100644 index 77ed11e..0000000 --- a/src2/javajs/img/CRCEncoder.java +++ /dev/null @@ -1,110 +0,0 @@ -package javajs.img; - -import java.util.zip.CRC32; - - -import javajs.util.AU; - -abstract class CRCEncoder extends ImageEncoder { - - protected int startPos, bytePos; - - private CRC32 crc; - protected byte[] pngBytes; - protected int dataLen; - private byte[] int2 = new byte[2]; - private byte[] int4 = new byte[4]; - - CRCEncoder() { - pngBytes = new byte[250]; - crc = new CRC32(); - } - - protected void setData(byte[] b, int pt) { - pngBytes = b; - dataLen = b.length; - startPos = bytePos = pt; - } - - protected byte[] getBytes() { - return (dataLen == pngBytes.length ? pngBytes : AU.arrayCopyByte( - pngBytes, dataLen)); - } - - protected void writeCRC() { - crc.reset(); - crc.update(pngBytes, startPos, bytePos - startPos); - writeInt4((int) crc.getValue()); - } - - /** - * Write a two-byte integer into the pngBytes array at a given position. - * - * @param n The integer to be written into pngBytes. - */ - protected void writeInt2(int n) { - int2[0] = (byte) ((n >> 8) & 0xff); - int2[1] = (byte) (n & 0xff); - writeBytes(int2); - } - - /** - * Write a four-byte integer into the pngBytes array at a given position. - * - * @param n The integer to be written into pngBytes. - */ - protected void writeInt4(int n) { - getInt4(n, int4); - writeBytes(int4); - } - - protected static void getInt4(int n, byte[] int4) { - int4[0] = (byte) ((n >> 24) & 0xff); - int4[1] = (byte) ((n >> 16) & 0xff); - int4[2] = (byte) ((n >> 8) & 0xff); - int4[3] = (byte) (n & 0xff); - } - - /** - * Write a single byte into the pngBytes array at a given position. - * - * @param b The byte to be written into pngBytes. - */ - protected void writeByte(int b) { - byte[] temp = { - (byte) b - }; - writeBytes(temp); - } - - /** - * Write a string into the pngBytes array at a given position. - * This uses the getBytes method, so the encoding used will - * be its default. - * - * @param s The string to be written into pngBytes. - * @see java.lang.String#getBytes() - */ - protected void writeString(String s) { - writeBytes(s.getBytes()); - } - - /** - * Write an array of bytes into the pngBytes array. - * Both dataLen and bytePos are updated. If we don't have - * enough room, this is certainly in image data writing, - * so we add just enough for CRC END CRC - * - * @param data - * The data to be written into pngBytes. - */ - protected void writeBytes(byte[] data) { - int newPos = bytePos + data.length; - dataLen = Math.max(dataLen, newPos); - if (newPos > pngBytes.length) - pngBytes = AU.arrayCopyByte(pngBytes, newPos + 16); - System.arraycopy(data, 0, pngBytes, bytePos, data.length); - bytePos = newPos; - } - -} diff --git a/src2/javajs/img/GifEncoder.java b/src2/javajs/img/GifEncoder.java deleted file mode 100644 index 287f9c3..0000000 --- a/src2/javajs/img/GifEncoder.java +++ /dev/null @@ -1,1142 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2007-06-02 12:14:13 -0500 (Sat, 02 Jun 2007) $ - * $Revision: 7831 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2000-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -// Final encoding code from http://acme.com/resources/classes/Acme/JPM/Encoders/GifEncoder.java -// -// GifEncoder - write out an image as a GIF -// -// -// Transparency handling and variable bit size courtesy of Jack Palevich. -// -// Copyright (C)1996,1998 by Jef Poskanzer . All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -// SUCH DAMAGE. -// -// Visit the ACME Labs Java page for up-to-date versions of this and other -// fine Java utilities: http://www.acme.com/java/ -// -/// Write out an image as a GIF. -//

-// Fetch the software.
-// Fetch the entire Acme package. -//

-// @see ToGif - -package javajs.img; - -import javajs.util.CU; -import javajs.util.Lst; -import javajs.util.M3; -import javajs.util.P3; - -import java.util.Hashtable; -import java.util.Map; -import java.io.IOException; - -/** - * - * GifEncoder extensively adapted for Jmol by Bob Hanson - * - * Color quantization roughly follows the GIMP method - * "dither Floyd-Steinberg (normal)" but with some twists. (For example, we - * exclude the background color.) - * - * Note that although GIMP code annotation refers to "median-cut", it is really - * using MEAN-cut. That is what I use here as well. - * - * -- commented code allows visualization of the color space using Jmol. Very - * enlightening! - * - * -- much simplified interface with ImageEncoder - * - * -- uses simple Hashtable with Integer() to catalog colors - * - * -- allows progressive production of animated GIF via Jmol CAPTURE command - * - * -- uses general purpose javajs.util.OutputChannel for byte-handling options - * such as posting to a server, writing to disk, and retrieving bytes. - * - * -- allows JavaScript port - * - * -- Bob Hanson, first try: 24 Sep 2013; final coding: 9 Nov 2014 - * - * - * @author Bob Hanson hansonr@stolaf.edu - */ - -public class GifEncoder extends ImageEncoder { - - private Map params; - private P3[] palette; - private int backgroundColor; - - private boolean interlaced; - private boolean addHeader = true; - private boolean addImage = true; - private boolean addTrailer = true; - private boolean isTransparent; - private boolean floydSteinberg = true; - private boolean capturing; - private boolean looping; - - private int delayTime100ths = -1; - private int bitsPerPixel = 1; - - private int byteCount; - - /** - * we allow for animated GIF by being able to re-enter the code with different - * parameters held in params - * - * - */ - @Override - protected void setParams(Map params) { - this.params = params; - Integer ic = (Integer) params.get("transparentColor"); - if (ic == null) { - ic = (Integer) params.get("backgroundColor"); - if (ic != null) - backgroundColor = ic.intValue(); - } else { - backgroundColor = ic.intValue(); - isTransparent = true; - } - - interlaced = (Boolean.TRUE == params.get("interlaced")); - if (params.containsKey("captureRootExt") // file0000.gif - || !params.containsKey("captureMode")) // animated gif - return; - interlaced = false; - capturing = true; - try { - byteCount = ((Integer) params.get("captureByteCount")).intValue(); - } catch (Exception e) { - // ignore - } - switch ("maec" - .indexOf(((String) params.get("captureMode")).substring(0, 1))) { - case 0: //"movie" - params.put("captureMode", "add"); - addImage = false; - addTrailer = false; - break; - case 1: // add - addHeader = false; - addTrailer = false; - int fps = Math.abs(((Integer) params.get("captureFps")).intValue()); - delayTime100ths = (fps == 0 ? 0 : 100 / fps); - looping = (Boolean.FALSE != params.get("captureLooping")); - break; - case 2: // end - addHeader = false; - addImage = false; - break; - case 3: // cancel - addHeader = false; - addImage = false; - out.cancel(); - break; - } - } - - @Override - protected void generate() throws IOException { - if (addHeader) - writeHeader(); - addHeader = false; // only one header - if (addImage) { - createPalette(); - writeGraphicControlExtension(); - if (delayTime100ths >= 0 && looping) - writeNetscapeLoopExtension(); - writeImage(); - } - } - - @Override - protected void close() { - if (addTrailer) { - writeTrailer(); - } else { - doClose = false; - } - if (capturing) - params.put("captureByteCount", Integer.valueOf(byteCount)); - } - - ////////////// 256-color quantization ////////////// - - /** - * a color point in normalized L*a*b space with a flag indicating whether it - * is the background color - */ - private class ColorItem extends P3 { - /** - * - */ - protected boolean isBackground; - - ColorItem(int rgb, boolean isBackground) { - this.isBackground = isBackground; - setT(toLABnorm(rgb)); - } - } - - /** - * A list of normalized L*a*b points with an index and a center and volume - * - */ - private class ColorCell extends Lst { - - /** - * - */ - private static final long serialVersionUID = 1L; - protected int index; - protected P3 center; - - private float volume; - - ColorCell(int index) { - this.index = index; - } - - /** - * @param doVisualize - * debugging only - * @return volume in normalized L*a*b space - */ - public float getVolume(boolean doVisualize) { - if (volume != 0) - return volume; - if (size() < 2) - return -1; - //if (true) - //return lst.size(); - //float d; - float maxx = -Integer.MAX_VALUE; - float minx = Integer.MAX_VALUE; - float maxy = -Integer.MAX_VALUE; - float miny = Integer.MAX_VALUE; - float maxz = -Integer.MAX_VALUE; - float minz = Integer.MAX_VALUE; - int n = size(); - for (int i = n; --i >= 0;) { - P3 xyz = get(i); - if (xyz.x < minx) - minx = xyz.x; - if (xyz.y < miny) - miny = xyz.y; - if (xyz.z < minz) - minz = xyz.z; - if (xyz.x > maxx) - maxx = xyz.x; - if (xyz.y > maxy) - maxy = xyz.y; - if (xyz.z > maxz) - maxz = xyz.z; - } - float dx = (maxx - minx); - float dy = (maxy - miny); - float dz = (maxz - minz); - // Jmol visualization only - // if (doVisualize) { - // P3 ptRGB = toRGB(center); - // drawPt(index, -size(), ptRGB); - // //for (int i = n; --i >= 0;) - // //drawPt(index, i, toRGB(get(i))); - // P3 pt0 = toRGB(P3.new3(Math.max(minx, 0), Math.max(miny, 0), - // Math.max(minz, 0))); - // P3 pt1 = toRGB(P3.new3(Math.min(maxx, 100), Math.min(maxy, 100), - // Math.min(maxz, 100))); - // rgbToXyz(pt0, pt0); - // xyzToLab(pt0, pt0); - // rgbToXyz(pt1, pt1); - // xyzToLab(pt1, pt1); - // System.out.println("boundbox corners " + pt0 + " " + pt1); - // System.out.println("draw d" + index + " boundbox color " + ptRGB - // + " mesh nofill"); - // } - return volume = dx * dx + dy * dy + dz * dz; - } - - // // Jmol visualization only - // private void drawPt(int index, int i, P3 rgb) { - // boolean isMain = (i < 0); - // P3 lab = rgbToXyz(rgb, null); - // xyzToLab(lab, lab); - // System.out.println("draw d" + index + (isMain ? "_" : "_" + i) + " width " - // + (isMain ? 1.0 : 0.2) + " " + lab - // + " color " + rgb + (isMain ? " '" + -i + "'" : "")); - // } - - /** - * Set the average normalized L*a*b value for this cell and return its RGB point - * - * @return RGB point - * - */ - protected P3 setColor() { - int count = size(); - center = new P3(); - for (int i = count; --i >= 0;) - center.add(get(i)); - center.scale(1f / count); - // Jmol visualization only - //volume = 0; - //getVolume(true); - return toRGB(center); - } - - /** - * use median_cut algorithm to split the cell, creating a doubly linked - * list. - * - * Paul Heckbert, MIT thesis COLOR IMAGE QUANTIZATION FOR FRAME BUFFER - * DISPLAY https://www.cs.cmu.edu/~ph/ciq_thesis - * - * except, as in GIMP, we use center (not median) here. - * - * @param cells - * @return true if split - */ - protected boolean splitCell(Lst cells) { - int n = size(); - if (n < 2) - return false; - int newIndex = cells.size(); - ColorCell newCell = new ColorCell(newIndex); - cells.addLast(newCell); - float[][] ranges = new float[3][3]; - for (int ic = 0; ic < 3; ic++) { - float low = Float.MAX_VALUE; - float high = -Float.MAX_VALUE; - for (int i = n; --i >= 0;) { - P3 lab = get(i); - float v = (ic == 0 ? lab.x : ic == 1 ? lab.y : lab.z); - if (low > v) - low = v; - if (high < v) - high = v; - } - ranges[0][ic] = low; - ranges[1][ic] = high; - ranges[2][ic] = high - low; - } - float[] r = ranges[2]; - int mode = (r[0] >= r[1] ? (r[0] >= r[2] ? 0 : 2) : r[1] >= r[2] ? 1 : 2); - float val = ranges[0][mode] + ranges[2][mode] / 2; - volume = 0; // recalculate volume if needed - switch (mode) { - case 0: - for (int i = n; --i >= 0;) - if (get(i).x >= val) - newCell.addLast(removeItemAt(i)); - break; - case 1: - for (int i = n; --i >= 0;) - if (get(i).y >= val) - newCell.addLast(removeItemAt(i)); - break; - case 2: - for (int i = size(); --i >= 0;) - if (get(i).z >= val) - newCell.addLast(removeItemAt(i)); - break; - } - return true; - } - } - - /** - * Quantize all colors and create the final palette; - * replace pixels[] with an array of color indices. - * - */ - private void createPalette() { - - // catalog all pixel colors - - Lst tempColors = new Lst(); - Map ciHash = new Hashtable(); - for (int i = 0, n = pixels.length; i < n; i++) { - int rgb = pixels[i]; - Integer key = Integer.valueOf(rgb); - ColorItem item = ciHash.get(key); - if (item == null) { - item = new ColorItem(rgb, rgb == backgroundColor); - ciHash.put(key, item); - tempColors.addLast(item); - } - } - int nColors = tempColors.size(); - System.out.println("GIF total image colors: " + nColors); - ciHash = null; - - // create a set of <= 256 color cells - - Lst cells = quantizeColors(tempColors); - nColors = cells.size(); - System.out.println("GIF final color count: " + nColors); - - // generate the palette and map each cell's rgb color to itself - - Map colorMap = new Hashtable(); - bitsPerPixel = (nColors <= 2 ? 1 : nColors <= 4 ? 2 : nColors <= 16 ? 4 : 8); - palette = new P3[1 << bitsPerPixel]; - for (int i = 0; i < nColors; i++) { - ColorCell c = cells.get(i); - colorMap.put( - Integer.valueOf(CU.colorPtToFFRGB(palette[i] = c.setColor())), c); - } - - // index all pixels to a pallete color - - pixels = indexPixels(cells, colorMap); - } - - /** - * Quantize colors by generating a set of cells in normalized L*a*b space - * containing all colors. Start with just two cells -- fixed background color - * and all others. Keep splitting cells while there are fewer than 256 and - * some with multiple colors in them. - * - * It is possible that we will end up with fewer than 256 colors. - * - * @param tempColors - * @return final list of colors - */ - private Lst quantizeColors(Lst tempColors) { - int n = tempColors.size(); - Lst cells = new Lst(); - ColorCell cc = new ColorCell(0); - cc.addLast(new ColorItem(backgroundColor, true)); - cells.addLast(cc); - cc = new ColorCell(1); - if (n > 256) - cells.addLast(cc); - for (int i = 0; i < n; i++) { - ColorItem c = tempColors.get(i); - if (c.isBackground) - continue; - cc.addLast(c); - if (n <= 256) { - cells.addLast(cc); - cc = new ColorCell(cells.size()); - } - } - tempColors.clear(); - if (n > 256) - while ((n = cells.size()) < 256) { - float maxVol = 0; - ColorCell maxCell = null; - for (int i = n; --i >= 1;) { - ColorCell c = cells.get(i); - float v = c.getVolume(false); - if (v > maxVol) { - maxVol = v; - maxCell = c; - } - } - if (maxCell == null || !maxCell.splitCell(cells)) - break; - } - return cells; - } - - /** - * - * Assign all colors to their closest approximation and return an array of - * color indexes. - * - * Uses Floyd-Steinberg dithering, finding the closest known color and then - * spreading out the error over four leading pixels. Limits error to +/- 75 - * percent in normalized L*a*b space. - * - * @param cells - * quantized color cells - * @param colorMap - * map of quantized rgb to its cell - * @return array of color indexes, one for each pixel - * - */ - private int[] indexPixels(Lst cells, - Map colorMap) { - // We need a strip only width+2 wide to process all the errors. - // Errors are added to the next pixel and the next row's pixels - // only through p + width + 1: - // p +1 - // +w-1 +w +w+1 - // so including p as well, we need a total of width + 2 errors. - // - // as p moves through the pixels, we just use mod to cycle through - // this strip. - // - int w2 = width + 2; - P3[] errors = new P3[w2]; - // We should replace, not overwrite, pixels - // as this may be the raw canvas.buf32. - int[] newPixels = new int[pixels.length]; - P3 err = new P3(); - P3 lab; - int rgb; - Map nearestCell = new Hashtable(); - for (int i = 0, p = 0; i < height; ++i) { - boolean notLastRow = (i != height - 1); - for (int j = 0; j < width; ++j, p++) { - if (pixels[p] == backgroundColor) { - // leave as 0 - continue; - } - P3 pe = errors[p % w2]; - if (pe == null || pe.x == Float.MAX_VALUE) { - lab = null; - rgb = pixels[p]; - } else { - lab = toLABnorm(pixels[p]); - err = pe; - // important not to round the clamp here -- full floating precision - err.x = clamp(err.x, -75, 75); - err.y = clamp(err.y, -75, 75); - err.z = clamp(err.z, -75, 75); - lab.add(err); - rgb = CU.colorPtToFFRGB(toRGB(lab)); - } - Integer key = Integer.valueOf(rgb); - ColorCell cell = colorMap.get(key); - if (cell == null) { - // critical to generate normalized L*a*b from RGB here for nearestCell mapping. - // otherwise future RGB keys may match the wrong cell - lab = toLABnorm(rgb); - cell = nearestCell.get(key); - if (cell == null) { - // find nearest cell - float maxerr = Float.MAX_VALUE; - // skip 0 0 0 - for (int ib = cells.size(); --ib >= 1;) { - ColorCell c = cells.get(ib); - err.sub2(lab, c.center); - float d = err.lengthSquared(); - if (d < maxerr) { - maxerr = d; - cell = c; - } - } - nearestCell.put(key, cell); - } - if (floydSteinberg) { - // dither - err.sub2(lab, cell.center); - boolean notLastCol = (j < width - 1); - if (notLastCol) - addError(err, 7, errors, p + 1, w2); - if (notLastRow) { - if (j > 0) - addError(err, 3, errors, p + width - 1, w2); - addError(err, 5, errors, p + width, w2); - if (notLastCol) - addError(err, 1, errors, p + width + 1, w2); - } - } - err.x = Float.MAX_VALUE; // used; flag for resetting to 0 - } - newPixels[p] = cell.index; - } - } - return newPixels; - } - - private void addError(P3 err, int f, P3[] errors, int p, int w2) { - // GIMP will allow changing the background color. - if (pixels[p] == backgroundColor) - return; - p %= w2; - P3 errp = errors[p]; - if (errp == null) - errp = errors[p] = new P3(); - else if (errp.x == Float.MAX_VALUE) // reuse - errp.set(0, 0, 0); - errp.scaleAdd2(f / 16f, err, errp); - } - - ///////////////////////// CIE L*a*b / XYZ / sRGB conversion methods ///////// - - // these could be static, but that just makes for more JavaScript code - - protected P3 toLABnorm(int rgb) { - P3 lab = CU.colorPtFromInt(rgb, null); - rgbToXyz(lab, lab); - xyzToLab(lab, lab); - // normalize to 0-100 - lab.y = (lab.y + 86.185f) / (98.254f + 86.185f) * 100f; - lab.z = (lab.z + 107.863f) / (94.482f + 107.863f) * 100f; - return lab; - } - - protected P3 toRGB(P3 lab) { - P3 xyz = P3.newP(lab); - // normalized to 0-100 - xyz.y = xyz.y / 100f * (98.254f + 86.185f) - 86.185f; - xyz.z = xyz.z / 100f * (94.482f + 107.863f) - 107.863f; - labToXyz(xyz, xyz); - return xyzToRgb(xyz, xyz); - } - - private static M3 xyz2rgb; - private static M3 rgb2xyz; - - static { - rgb2xyz = M3.newA9(new float[] { 0.4124f, 0.3576f, 0.1805f, 0.2126f, - 0.7152f, 0.0722f, 0.0193f, 0.1192f, 0.9505f }); - - xyz2rgb = M3.newA9(new float[] { 3.2406f, -1.5372f, -0.4986f, -0.9689f, - 1.8758f, 0.0415f, 0.0557f, -0.2040f, 1.0570f }); - } - - public P3 rgbToXyz(P3 rgb, P3 xyz) { - // http://en.wikipedia.org/wiki/CIE_1931_color_space - // http://rsb.info.nih.gov/ij/plugins/download/Color_Space_Converter.java - if (xyz == null) - xyz = new P3(); - xyz.x = sxyz(rgb.x); - xyz.y = sxyz(rgb.y); - xyz.z = sxyz(rgb.z); - rgb2xyz.rotate(xyz); - return xyz; - } - - private float sxyz(float x) { - x /= 255; - return (float) (x <= 0.04045 ? x / 12.92 : Math.pow(((x + 0.055) / 1.055), - 2.4)) * 100; - } - - public P3 xyzToRgb(P3 xyz, P3 rgb) { - // http://en.wikipedia.org/wiki/CIE_1931_color_space - // http://rsb.info.nih.gov/ij/plugins/download/Color_Space_Converter.java - if (rgb == null) - rgb = new P3(); - rgb.setT(xyz); - rgb.scale(0.01f); - xyz2rgb.rotate(rgb); - rgb.x = clamp(srgb(rgb.x), 0, 255); - rgb.y = clamp(srgb(rgb.y), 0, 255); - rgb.z = clamp(srgb(rgb.z), 0, 255); - return rgb; - } - - private float srgb(float x) { - return (float) (x > 0.0031308f ? (1.055 * Math.pow(x, 1.0 / 2.4)) - 0.055 - : x * 12.92) * 255; - } - - public P3 xyzToLab(P3 xyz, P3 lab) { - // http://en.wikipedia.org/wiki/Lab_color_space - // http://rsb.info.nih.gov/ij/plugins/download/Color_Space_Converter.java - // Lab([0..100], [-86.185..98.254], [-107.863..94.482]) - // XYZn = D65 = {95.0429, 100.0, 108.8900}; - if (lab == null) - lab = new P3(); - float x = flab(xyz.x / 95.0429f); - float y = flab(xyz.y / 100); - float z = flab(xyz.z / 108.89f); - lab.x = (116 * y) - 16; - lab.y = 500 * (x - y); - lab.z = 200 * (y - z); - return lab; - } - - private float flab(float t) { - return (float) (t > 8.85645168E-3 /* (24/116)^3 */? Math.pow(t, - 0.333333333) : 7.78703704 /* 1/3*116/24*116/24 */* t + 0.137931034 /* 16/116 */ - ); - } - - public P3 labToXyz(P3 lab, P3 xyz) { - // http://en.wikipedia.org/wiki/Lab_color_space - // http://rsb.info.nih.gov/ij/plugins/download/Color_Space_Converter.java - // XYZn = D65 = {95.0429, 100.0, 108.8900}; - if (xyz == null) - xyz = new P3(); - - xyz.setT(lab); - float y = (xyz.x + 16) / 116; - float x = xyz.y / 500 + y; - float z = y - xyz.z / 200; - xyz.x = fxyz(x) * 95.0429f; - xyz.y = fxyz(y) * 100; - xyz.z = fxyz(z) * 108.89f; - - return xyz; - } - - private float fxyz(float t) { - return (float) (t > 0.206896552 /* (24/116) */? t * t * t - : 0.128418549 /* 3*24/116*24/116 */* (t - 0.137931034 /* 16/116 */)); - } - - private float clamp(float c, float min, float max) { - c = (c < min ? min : c > max ? max : c); - return (min == 0 ? Math.round(c) : c); - } - - ///////////////////////// GifEncoder writing methods //////////////////////// - - /** - * includes logical screen descriptor - * - * @throws IOException - */ - private void writeHeader() throws IOException { - putString("GIF89a"); - putWord(width); - putWord(height); - putByte(0); // no global color table -- using local instead - putByte(0); // no background - putByte(0); // no pixel aspect ratio given - } - - private void writeGraphicControlExtension() { - if (isTransparent || delayTime100ths >= 0) { - putByte(0x21); // graphic control extension - putByte(0xf9); // graphic control label - putByte(4); // block size - putByte((isTransparent ? 9 : 0) | (delayTime100ths > 0 ? 2 : 0)); // packed bytes - putWord(delayTime100ths > 0 ? delayTime100ths : 0); - putByte(0); // transparent index - putByte(0); // end-of-block - } - } - - // see http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension - // +---------------+ - // 0 | 0x21 | Extension Label - // +---------------+ - // 1 | 0xFF | Application Extension Label - // +---------------+ - // 2 | 0x0B | Block Size - // +---------------+ - // 3 | | - // +- -+ - // 4 | | - // +- -+ - // 5 | | - // +- -+ - // 6 | | - // +- NETSCAPE -+ Application Identifier (8 bytes) - // 7 | | - // +- -+ - // 8 | | - // +- -+ - // 9 | | - // +- -+ - // 10 | | - // +---------------+ - // 11 | | - // +- -+ - // 12 | 2.0 | Application Authentication Code (3 bytes) - // +- -+ - // 13 | | - // +===============+ --+ - // 14 | 0x03 | Sub-block Data Size | - // +---------------+ | - // 15 | 0x01 | Sub-block ID | - // +---------------+ | Application Data Sub-block - // 16 | | | - // +- -+ Loop Count (2 bytes) | - // 17 | | | - // +===============+ --+ - // 18 | 0x00 | Block Terminator - // +---------------+ - - private void writeNetscapeLoopExtension() { - putByte(0x21); // graphic control extension - putByte(0xff); // netscape loop extension - putByte(0x0B); // block size - putString("NETSCAPE2.0"); - putByte(3); - putByte(1); - putWord(0); // loop indefinitely - putByte(0); // end-of-block - - } - - private int initCodeSize; - private int curpt; - - private void writeImage() { - putByte(0x2C); - putWord(0); //left - putWord(0); //top - putWord(width); - putWord(height); - - // = LISx xZZZ - - // L Local Color Table Flag - // I Interlace Flag - // S Sort Flag - // x Reserved - // ZZZ Size of Local Color Table - - int packedFields = 0x80 | (interlaced ? 0x40 : 0) | (bitsPerPixel - 1); - putByte(packedFields); - int colorMapSize = 1 << bitsPerPixel; - P3 p = new P3(); - for (int i = 0; i < colorMapSize; i++) { - if (palette[i] != null) - p = palette[i]; - putByte((int) p.x); - putByte((int) p.y); - putByte((int) p.z); - } - putByte(initCodeSize = (bitsPerPixel <= 1 ? 2 : bitsPerPixel)); - compress(); - putByte(0); - } - - private void writeTrailer() { - // Write the GIF file terminator - putByte(0x3B); - } - - ///// compression routines ///// - - private static final int EOF = -1; - - // Return the next pixel from the image - private int nextPixel() { - if (countDown-- == 0) - return EOF; - int colorIndex = pixels[curpt]; - // Bump the current X position - ++curx; - if (curx == width) { - // If we are at the end of a scan line, set curx back to the beginning - // If we are interlaced, bump the cury to the appropriate spot, - // otherwise, just increment it. - curx = 0; - if (interlaced) - updateY(INTERLACE_PARAMS[pass], INTERLACE_PARAMS[pass + 4]); - else - ++cury; - } - curpt = cury * width + curx; - return colorIndex & 0xff; - } - - private static final int[] INTERLACE_PARAMS = { 8, 8, 4, 2, 4, 2, 1, 0 }; - - /** - * - * Group 1 : Every 8th. row, starting with row 0. (Pass 1) - * - * Group 2 : Every 8th. row, starting with row 4. (Pass 2) - * - * Group 3 : Every 4th. row, starting with row 2. (Pass 3) - * - * Group 4 : Every 2nd. row, starting with row 1. (Pass 4) - * - * @param yNext - * @param yNew - */ - private void updateY(int yNext, int yNew) { - cury += yNext; - if (yNew >= 0 && cury >= height) { - cury = yNew; - ++pass; - } - } - - // Write out a word to the GIF file - private void putWord(int w) { - putByte(w); - putByte(w >> 8); - } - - // GIFCOMPR.C - GIF Image compression routines - // - // Lempel-Ziv compression based on 'compress'. GIF modifications by - // David Rowley (mgardi@watdcsu.waterloo.edu) - - // General DEFINEs - - private static final int BITS = 12; - - private static final int HSIZE = 5003; // 80% occupancy - - // GIF Image compression - modified 'compress' - // - // Based on: compress.c - File compression ala IEEE Computer, June 1984. - // - // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) - // Jim McKie (decvax!mcvax!jim) - // Steve Davies (decvax!vax135!petsd!peora!srd) - // Ken Turkowski (decvax!decwrl!turtlevax!ken) - // James A. Woods (decvax!ihnp4!ames!jaw) - // Joe Orost (decvax!vax135!petsd!joe) - - private int nBits; // number of bits/code - private int maxbits = BITS; // user settable max # bits/code - private int maxcode; // maximum code, given n_bits - private int maxmaxcode = 1 << BITS; // should NEVER generate this code - - private final static int MAXCODE(int nBits) { - return (1 << nBits) - 1; - } - - private int[] htab = new int[HSIZE]; - private int[] codetab = new int[HSIZE]; - - private int hsize = HSIZE; // for dynamic table sizing - - private int freeEnt = 0; // first unused entry - - // block compression parameters -- after all codes are used up, - // and compression rate changes, start over. - private boolean clearFlag = false; - - // Algorithm: use open addressing double hashing (no chaining) on the - // prefix code / next character combination. We do a variant of Knuth's - // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime - // secondary probe. Here, the modular division first probe is gives way - // to a faster exclusive-or manipulation. Also do block compression with - // an adaptive reset, whereby the code table is cleared when the compression - // ratio decreases, but after the table fills. The variable-length output - // codes are re-sized at this point, and a special CLEAR code is generated - // for the decompressor. Late addition: construct the table according to - // file size for noticeable speed improvement on small files. Please direct - // questions about this implementation to ames!jaw. - - private int clearCode; - private int EOFCode; - - private int countDown; - private int pass = 0; - private int curx, cury; - - private void compress() { - - // Calculate number of bits we are expecting - countDown = width * height; - - // Indicate which pass we are on (if interlace) - pass = 0; - // Set up the current x and y position - curx = 0; - cury = 0; - - // Set up the necessary values - clearFlag = false; - nBits = initCodeSize + 1; - maxcode = MAXCODE(nBits); - - clearCode = 1 << initCodeSize; - EOFCode = clearCode + 1; - freeEnt = clearCode + 2; - - // Set up the 'byte output' routine - bufPt = 0; - - int ent = nextPixel(); - - int hshift = 0; - int fcode; - for (fcode = hsize; fcode < 65536; fcode *= 2) - ++hshift; - hshift = 8 - hshift; // set hash code range bound - - int hsizeReg = hsize; - clearHash(hsizeReg); // clear hash table - - output(clearCode); - - int c; - outer_loop: while ((c = nextPixel()) != EOF) { - fcode = (c << maxbits) + ent; - int i = (c << hshift) ^ ent; // xor hashing - - if (htab[i] == fcode) { - ent = codetab[i]; - continue; - } else if (htab[i] >= 0) // non-empty slot - { - int disp = hsizeReg - i; // secondary hash (after G. Knott) - if (i == 0) - disp = 1; - do { - if ((i -= disp) < 0) - i += hsizeReg; - - if (htab[i] == fcode) { - ent = codetab[i]; - continue outer_loop; - } - } while (htab[i] >= 0); - } - output(ent); - ent = c; - if (freeEnt < maxmaxcode) { - codetab[i] = freeEnt++; // code -> hashtable - htab[i] = fcode; - } else { - clearBlock(); - } - } - // Put out the final code. - output(ent); - output(EOFCode); - } - - // output - // - // Output the given code. - // Inputs: - // code: A n_bits-bit integer. If == -1, then EOF. This assumes - // that n_bits =< wordsize - 1. - // Outputs: - // Outputs code to the file. - // Assumptions: - // Chars are 8 bits long. - // Algorithm: - // Maintain a BITS character long buffer (so that 8 codes will - // fit in it exactly). Use the VAX insv instruction to insert each - // code in turn. When the buffer fills up empty it and start over. - - private int curAccum = 0; - private int curBits = 0; - - private int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, - 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, - 0x7FFF, 0xFFFF }; - - private void output(int code) { - curAccum &= masks[curBits]; - - if (curBits > 0) - curAccum |= (code << curBits); - else - curAccum = code; - - curBits += nBits; - - while (curBits >= 8) { - byteOut((byte) (curAccum & 0xff)); - curAccum >>= 8; - curBits -= 8; - } - - // If the next entry is going to be too big for the code size, - // then increase it, if possible. - if (freeEnt > maxcode || clearFlag) { - if (clearFlag) { - maxcode = MAXCODE(nBits = initCodeSize + 1); - clearFlag = false; - } else { - ++nBits; - if (nBits == maxbits) - maxcode = maxmaxcode; - else - maxcode = MAXCODE(nBits); - } - } - - if (code == EOFCode) { - // At EOF, write the rest of the buffer. - while (curBits > 0) { - byteOut((byte) (curAccum & 0xff)); - curAccum >>= 8; - curBits -= 8; - } - flushBytes(); - } - } - - // Clear out the hash table - - // table clear for block compress - private void clearBlock() { - clearHash(hsize); - freeEnt = clearCode + 2; - clearFlag = true; - - output(clearCode); - } - - // reset code table - private void clearHash(int hsize) { - for (int i = 0; i < hsize; ++i) - htab[i] = -1; - } - - // GIF-specific routines (byte array buffer) - - // Number of bytes so far in this 'packet' - private int bufPt; - - // Define the storage for the packet accumulator - final private byte[] buf = new byte[256]; - - // Add a byte to the end of the current packet, and if it is 254 - // byte, flush the packet to disk. - private void byteOut(byte c) { - buf[bufPt++] = c; - if (bufPt >= 254) - flushBytes(); - } - - // Flush the packet to disk, and reset the accumulator - protected void flushBytes() { - if (bufPt > 0) { - putByte(bufPt); - out.write(buf, 0, bufPt); - byteCount += bufPt; - bufPt = 0; - } - } - -} diff --git a/src2/javajs/img/ImageEncoder.java b/src2/javajs/img/ImageEncoder.java deleted file mode 100644 index 7781202..0000000 --- a/src2/javajs/img/ImageEncoder.java +++ /dev/null @@ -1,127 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2007-06-02 12:14:13 -0500 (Sat, 02 Jun 2007) $ - * $Revision: 7831 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2000-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -// ImageEncoder - abstract class for writing out an image -// -// Copyright (C) 1996 by Jef Poskanzer . All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -// SUCH DAMAGE. -// -// Visit the ACME Labs Java page for up-to-date versions of this and other -// fine Java utilities: http://www.acme.com/java/ - -package javajs.img; - -import java.util.Map; - -import javajs.api.GenericImageEncoder; -import javajs.util.OC; - - - -/** - * Generic abstract image creator: - * - * (1) set parameters - * - * (2) encode the image bytes, if necessary - * - * (3) generate the image - * @author Bob Hanson hansonr@stolaf.edu - */ - -public abstract class ImageEncoder implements GenericImageEncoder { - - protected OC out; - - protected int width = -1; - protected int height = -1; - protected int quality = -1; - protected String date; - protected boolean logging; - protected boolean doClose = true; - - /** - * @param type - * @param out - * @param params - */ - @Override - public boolean createImage(String type, OC out, Map params) - throws Exception { - this.out = out; - logging = (Boolean.TRUE == params.get("logging")); - width = ((Integer) params.get("imageWidth")).intValue(); - height = ((Integer) params.get("imageHeight")).intValue(); - pixels = (int[]) params.get("imagePixels"); - date = (String) params.get("date"); - Integer q = (Integer) params.get("quality"); - quality = (q == null ? -1 : q.intValue()); - setParams(params); - generate(); - close(); // GIF will override this and not close - return doClose; - } - - abstract protected void setParams(Map params); - abstract protected void generate() throws Exception; - - protected int[] pixels; - - protected void putString(String s) { - byte[] b = s.getBytes(); - out.write(b, 0, b.length); - } - - protected void putByte(int b) { - out.writeByteAsInt(b); - } - - protected void close() { - // your responsibility to close the output channel - } - -} diff --git a/src2/javajs/img/Jpg64Encoder.java b/src2/javajs/img/Jpg64Encoder.java deleted file mode 100644 index 796972f..0000000 --- a/src2/javajs/img/Jpg64Encoder.java +++ /dev/null @@ -1,64 +0,0 @@ -// Version 1.0a -// Copyright (C) 1998, James R. Weeks and BioElectroMech. -// Visit BioElectroMech at www.obrador.com. Email James@obrador.com. - -// See license.txt for details about the allowed used of this software. -// This software is based in part on the work of the Independent JPEG Group. -// See IJGreadme.txt for details about the Independent JPEG Group's license. - -// This encoder is inspired by the Java Jpeg encoder by Florian Raemy, -// studwww.eurecom.fr/~raemy. -// It borrows a great deal of code and structure from the Independent -// Jpeg Group's Jpeg 6a library, Copyright Thomas G. Lane. -// See license.txt for details - -/* - * JpegEncoder and its associated classes are Copyright (c) 1998, James R. Weeks and BioElectroMech - * see(Jmol/src/com/obrador/license.txt) - * - * javajs.img.JpegEncoder.java was adapted by Bob Hanson - * for Jmol in the following ways: - * - * 1) minor coding efficiencies were made in some for() loops. - * 2) methods not used by Jmol were commented out - * 3) method and variable signatures were modified to provide - * more appropriate method privacy. - * 4) additions for Java2Script compatibility - * - * Original files are maintained in the Jmol.src.com.obrador package, but - * these original files are not distributed with Jmol. - * -*/ - -package javajs.img; - -import java.io.IOException; -import java.util.Map; - -import javajs.util.Base64; -import javajs.util.OC; - - -public class Jpg64Encoder extends JpgEncoder { - - private OC outTemp; - - @Override - protected void setParams(Map params) { - defaultQuality = 75; - outTemp = (OC) params.remove("outputChannelTemp"); - super.setParams(params); - } - - @Override - protected void generate() throws IOException { - OC out0 = out; - out = outTemp; - super.generate(); - byte[] bytes = Base64.getBytes64(out.toByteArray()); - outTemp = null; - out = out0; - out.write(bytes, 0, bytes.length); - } - -} diff --git a/src2/javajs/img/JpgEncoder.java b/src2/javajs/img/JpgEncoder.java deleted file mode 100644 index 4e49718..0000000 --- a/src2/javajs/img/JpgEncoder.java +++ /dev/null @@ -1,1208 +0,0 @@ -// Version 1.0a -// Copyright (C) 1998, James R. Weeks and BioElectroMech. -// Visit BioElectroMech at www.obrador.com. Email James@obrador.com. - -// See license.txt for details about the allowed used of this software. -// This software is based in part on the work of the Independent JPEG Group. -// See IJGreadme.txt for details about the Independent JPEG Group's license. - -// This encoder is inspired by the Java Jpeg encoder by Florian Raemy, -// studwww.eurecom.fr/~raemy. -// It borrows a great deal of code and structure from the Independent -// Jpeg Group's Jpeg 6a library, Copyright Thomas G. Lane. -// See license.txt for details - -/* - * JpegEncoder and its associated classes are Copyright (c) 1998, James R. Weeks and BioElectroMech - * see(Jmol/src/com/obrador/license.txt) - * - * javjs.img.JpegEncoder.java was adapted by Bob Hanson - * - * for Jmol in the following ways: - * - * 1) minor coding efficiencies were made in some for() loops. - * 2) methods not used by Jmol were commented out - * 3) method and variable signatures were modified to provide - * more appropriate method privacy. - * 4) additions for Java2Script compatibility - * - * Original files are maintained in the Jmol.src.com.obrador package, but - * these original files are not distributed with Jmol. - * -*/ - -package javajs.img; - -import java.io.IOException; -import java.util.Map; - -import javajs.img.ImageEncoder; -import javajs.util.AU; -import javajs.util.OC; - -/** - * JpegEncoder - The JPEG main program which performs a jpeg compression of an - * image. - * - * A system to allow the full Jmol state -- regardless of length -- - * to be encoded in a set of APP1 (FFE1) tags. - * But we have to be careful about line ends for backward compatibility. - * This solution is not 100% effective, because some data lines may in principle be - * Very large and may not contain new lines for more than 65500 characters, - * But that would be very unusual. Perhaps a huge data set loaded from a - * string. Introduced in Jmol 12.1.36. Bob Hanson - * - * See org.com.obrador.license.txt - * - */ - -public class JpgEncoder extends ImageEncoder { - - // this string will GENERALLY appear at the end of lines and be escaped - private static final int CONTINUE_MAX = 65500; // some room to spare here. - private static final int CONTINUE_MAX_BUFFER = CONTINUE_MAX + 10; // never break up last 10 bytes - - private JpegObj jpegObj; - private Huffman huf; - private DCT dct; - protected int defaultQuality = 100; - private String applicationTag; - - public JpgEncoder() { - - } - - @Override - protected void setParams(Map params) { - if (quality <= 0) - quality = (params.containsKey("qualityJPG") ? ((Integer) params.get("qualityJPG")).intValue() : defaultQuality); - jpegObj = new JpegObj(); - jpegObj.comment = (String) params.get("comment"); - applicationTag = (String) params.get("jpgAppTag"); - } - - @Override - protected void generate() throws IOException { - jpegObj.imageWidth = width; - jpegObj.imageHeight = height; - dct = new DCT(quality); - huf = new Huffman(width, height); - if (jpegObj == null) - return; - jpegObj.getYCCArray(pixels); - String longState = writeHeaders(jpegObj, dct); - writeCompressedData(jpegObj, dct, huf); - writeMarker(eoi); - if (longState != null) { - byte[] b = longState.getBytes(); - out.write(b, 0, b.length); - } - } - - private void writeCompressedData(JpegObj jpegObj, DCT dct, Huffman huf) { - int i, j, r, c, a, b; - int comp, xpos, ypos, xblockoffset, yblockoffset; - float inputArray[][]; - float dctArray1[][] = new float[8][8]; - double dctArray2[][] = new double[8][8]; - int dctArray3[] = new int[8 * 8]; - - /* - * This method controls the compression of the image. - * Starting at the upper left of the image, it compresses 8x8 blocks - * of data until the entire image has been compressed. - */ - - int lastDCvalue[] = new int[jpegObj.numberOfComponents]; - //int zeroArray[] = new int[64]; // initialized to hold all zeros - //int Width = 0, Height = 0; - //int nothing = 0, not; - int minBlockWidth, minBlockHeight; - // This initial setting of MinBlockWidth and MinBlockHeight is done to - // ensure they start with values larger than will actually be the case. - minBlockWidth = ((huf.imageWidth % 8 != 0) ? (int) (Math - .floor(huf.imageWidth / 8.0) + 1) * 8 : huf.imageWidth); - minBlockHeight = ((huf.imageHeight % 8 != 0) ? (int) (Math - .floor(huf.imageHeight / 8.0) + 1) * 8 : huf.imageHeight); - for (comp = 0; comp < jpegObj.numberOfComponents; comp++) { - minBlockWidth = Math.min(minBlockWidth, jpegObj.blockWidth[comp]); - minBlockHeight = Math.min(minBlockHeight, jpegObj.blockHeight[comp]); - } - xpos = 0; - for (r = 0; r < minBlockHeight; r++) { - for (c = 0; c < minBlockWidth; c++) { - xpos = c * 8; - ypos = r * 8; - for (comp = 0; comp < jpegObj.numberOfComponents; comp++) { - //Width = JpegObj.BlockWidth[comp]; - //Height = JpegObj.BlockHeight[comp]; - inputArray = jpegObj.components[comp]; - int vsampF = jpegObj.vsampFactor[comp]; - int hsampF = jpegObj.hsampFactor[comp]; - int qNumber = jpegObj.qtableNumber[comp]; - int dcNumber = jpegObj.dctableNumber[comp]; - int acNumber = jpegObj.actableNumber[comp]; - - for (i = 0; i < vsampF; i++) { - for (j = 0; j < hsampF; j++) { - xblockoffset = j * 8; - yblockoffset = i * 8; - for (a = 0; a < 8; a++) { - for (b = 0; b < 8; b++) { - - // I believe this is where the dirty line at the bottom of - // the image is coming from. - // I need to do a check here to make sure I'm not reading past - // image data. - // This seems to not be a big issue right now. (04/04/98) - - dctArray1[a][b] = inputArray[ypos + yblockoffset + a][xpos - + xblockoffset + b]; - } - } - // The following code commented out because on some images this technique - // results in poor right and bottom borders. - // if ((!JpegObj.lastColumnIsDummy[comp] || c < Width - 1) && - // (!JpegObj.lastRowIsDummy[comp] || r < Height - 1)) { - dctArray2 = DCT.forwardDCT(dctArray1); - dctArray3 = DCT.quantizeBlock(dctArray2, dct.divisors[qNumber]); - // } - // else { - // zeroArray[0] = dctArray3[0]; - // zeroArray[0] = lastDCvalue[comp]; - // dctArray3 = zeroArray; - // } - huf.HuffmanBlockEncoder(out, dctArray3, lastDCvalue[comp], - dcNumber, acNumber); - lastDCvalue[comp] = dctArray3[0]; - } - } - } - } - } - huf.flushBuffer(out); - } - - private static byte[] eoi = { (byte) 0xFF, (byte) 0xD9 }; - - private static byte[] jfif = new byte[] { - /* JFIF[0] =*/(byte) 0xff, - /* JFIF[1] =*/(byte) 0xe0, - /* JFIF[2] =*/0, - /* JFIF[3] =*/16, - /* JFIF[4] =*/(byte) 0x4a, //'J' - /* JFIF[5] =*/(byte) 0x46, //'F' - /* JFIF[6] =*/(byte) 0x49, //'I' - /* JFIF[7] =*/(byte) 0x46, //'F' - /* JFIF[8] =*/0, - /* JFIF[9] =*/1, - /* JFIF[10] =*/0, - /* JFIF[11] =*/0, - /* JFIF[12] =*/0, - /* JFIF[13] =*/1, - /* JFIF[14] =*/0, - /* JFIF[15] =*/1, - /* JFIF[16] =*/0, - /* JFIF[17] =*/0 }; - - private static byte[] soi = { (byte) 0xFF, (byte) 0xD8 }; - - private String writeHeaders(JpegObj jpegObj, DCT dct) { - int i, j, index, offset; - int tempArray[]; - - // the SOI marker - writeMarker(soi); - - // The order of the following headers is quite inconsequential. - // the JFIF header - writeArray(jfif); - - // Comment Header - String comment = null; - if (jpegObj.comment != null && jpegObj.comment.length() > 0) - writeString(jpegObj.comment, (byte) 0xE1); // App data 1 - writeString( - "JPEG Encoder Copyright 1998, James R. Weeks and BioElectroMech.\n\n", - (byte) 0xFE); - - // The DQT header - // 0 is the luminance index and 1 is the chrominance index - byte dqt[] = new byte[134]; - dqt[0] = (byte) 0xFF; - dqt[1] = (byte) 0xDB; - dqt[2] = 0; - dqt[3] = (byte) 132; - offset = 4; - for (i = 0; i < 2; i++) { - dqt[offset++] = (byte) ((0 << 4) + i); - tempArray = dct.quantum[i]; - for (j = 0; j < 64; j++) { - dqt[offset++] = (byte) tempArray[Huffman.jpegNaturalOrder[j]]; - } - } - writeArray(dqt); - - // Start of Frame Header - byte sof[] = new byte[19]; - sof[0] = (byte) 0xFF; - sof[1] = (byte) 0xC0; - sof[2] = 0; - sof[3] = 17; - sof[4] = (byte) jpegObj.precision; - sof[5] = (byte) ((jpegObj.imageHeight >> 8) & 0xFF); - sof[6] = (byte) ((jpegObj.imageHeight) & 0xFF); - sof[7] = (byte) ((jpegObj.imageWidth >> 8) & 0xFF); - sof[8] = (byte) ((jpegObj.imageWidth) & 0xFF); - sof[9] = (byte) jpegObj.numberOfComponents; - index = 10; - for (i = 0; i < sof[9]; i++) { - sof[index++] = (byte) jpegObj.compID[i]; - sof[index++] = (byte) ((jpegObj.hsampFactor[i] << 4) + jpegObj.vsampFactor[i]); - sof[index++] = (byte) jpegObj.qtableNumber[i]; - } - writeArray(sof); - - WriteDHTHeader(Huffman.bitsDCluminance, Huffman.valDCluminance); - WriteDHTHeader(Huffman.bitsACluminance, Huffman.valACluminance); - WriteDHTHeader(Huffman.bitsDCchrominance, Huffman.valDCchrominance); - WriteDHTHeader(Huffman.bitsACchrominance, Huffman.valACchrominance); - - // Start of Scan Header - byte sos[] = new byte[14]; - sos[0] = (byte) 0xFF; - sos[1] = (byte) 0xDA; - sos[2] = 0; - sos[3] = 12; - sos[4] = (byte) jpegObj.numberOfComponents; - index = 5; - for (i = 0; i < sos[4]; i++) { - sos[index++] = (byte) jpegObj.compID[i]; - sos[index++] = (byte) ((jpegObj.dctableNumber[i] << 4) + jpegObj.actableNumber[i]); - } - sos[index++] = (byte) jpegObj.ss; - sos[index++] = (byte) jpegObj.se; - sos[index++] = (byte) ((jpegObj.ah << 4) + jpegObj.al); - writeArray(sos); - return comment; - } - - private void writeString(String s, byte id) { - int len = s.length(); - int i0 = 0; - String suffix = applicationTag; - while (i0 < len) { - int nBytes = len - i0; - if (nBytes > CONTINUE_MAX_BUFFER) { - nBytes = CONTINUE_MAX; - // but break only at line breaks - int pt = s.lastIndexOf('\n', i0 + nBytes); - if (pt > i0 + 1) - nBytes = pt - i0; - } - if (i0 + nBytes == len) - suffix = ""; - writeTag(nBytes + suffix.length(), id); - writeArray(s.substring(i0, i0 + nBytes).getBytes()); - if (suffix.length() > 0) - writeArray(suffix.getBytes()); - i0 += nBytes; - } - } - - private void writeTag(int length, byte id) { - length += 2; - byte com[] = new byte[4]; - com[0] = (byte) 0xFF; - com[1] = id; - com[2] = (byte) ((length >> 8) & 0xFF); - com[3] = (byte) (length & 0xFF); - writeArray(com); - } - - void WriteDHTHeader(int[] bits, int[] val) { - // hansonr@stolaf.edu: simplified code. - byte[] dht; - int bytes = 0; - for (int j = 1; j < 17; j++) - bytes += bits[j]; - dht = new byte[21 + bytes]; - dht[0] = (byte) 0xFF; - dht[1] = (byte) 0xC4; - int index = 4; - for (int j = 0; j < 17; j++) - dht[index++] = (byte) bits[j]; - for (int j = 0; j < bytes; j++) - dht[index++] = (byte) val[j]; - dht[2] = (byte) (((index - 2) >> 8) & 0xFF); - dht[3] = (byte) ((index - 2) & 0xFF); - writeArray(dht); - } - - void writeMarker(byte[] data) { - out.write(data, 0, 2); - } - - void writeArray(byte[] data) { - out.write(data, 0, data.length); - } - -} - -// This class incorporates quality scaling as implemented in the JPEG-6a -// library. - -/* - * DCT - A Java implementation of the Discreet Cosine Transform - */ - -class DCT { - - /** - * DCT Block Size - default 8 - */ - private final static int N = 8; - private final static int NN = N * N; - - /** - * Image Quality (0-100) - default 80 (good image / good compression) - */ - //public int QUALITY = 80; - - int[][] quantum = AU.newInt2(2); - double[][] divisors = AU.newDouble2(2); - - /** - * Quantitization Matrix for luminace. - */ - private int quantum_luminance[] = new int[NN]; - private double DivisorsLuminance[] = new double[NN]; - - /** - * Quantitization Matrix for chrominance. - */ - private int quantum_chrominance[] = new int[NN]; - private double DivisorsChrominance[] = new double[NN]; - - /** - * Constructs a new DCT object. Initializes the cosine transform matrix these - * are used when computing the DCT and it's inverse. This also initializes the - * run length counters and the ZigZag sequence. Note that the image quality - * can be worse than 25 however the image will be extemely pixelated, usually - * to a block size of N. - * - * @param quality - * The quality of the image (0 worst - 100 best) - * - */ - DCT(int quality) { - initMatrix(quality); - } - - /* - * This method sets up the quantization matrix for luminance and - * chrominance using the Quality parameter. - */ - private void initMatrix(int quality) { - // converting quality setting to that specified in the jpeg_quality_scaling - // method in the IJG Jpeg-6a C libraries - - quality = (quality < 1 ? 1 : quality > 100 ? 100 : quality); - quality = (quality < 50 ? 5000 / quality : 200 - quality * 2); - - // Creating the luminance matrix - - quantum_luminance[0] = 16; - quantum_luminance[1] = 11; - quantum_luminance[2] = 10; - quantum_luminance[3] = 16; - quantum_luminance[4] = 24; - quantum_luminance[5] = 40; - quantum_luminance[6] = 51; - quantum_luminance[7] = 61; - quantum_luminance[8] = 12; - quantum_luminance[9] = 12; - quantum_luminance[10] = 14; - quantum_luminance[11] = 19; - quantum_luminance[12] = 26; - quantum_luminance[13] = 58; - quantum_luminance[14] = 60; - quantum_luminance[15] = 55; - quantum_luminance[16] = 14; - quantum_luminance[17] = 13; - quantum_luminance[18] = 16; - quantum_luminance[19] = 24; - quantum_luminance[20] = 40; - quantum_luminance[21] = 57; - quantum_luminance[22] = 69; - quantum_luminance[23] = 56; - quantum_luminance[24] = 14; - quantum_luminance[25] = 17; - quantum_luminance[26] = 22; - quantum_luminance[27] = 29; - quantum_luminance[28] = 51; - quantum_luminance[29] = 87; - quantum_luminance[30] = 80; - quantum_luminance[31] = 62; - quantum_luminance[32] = 18; - quantum_luminance[33] = 22; - quantum_luminance[34] = 37; - quantum_luminance[35] = 56; - quantum_luminance[36] = 68; - quantum_luminance[37] = 109; - quantum_luminance[38] = 103; - quantum_luminance[39] = 77; - quantum_luminance[40] = 24; - quantum_luminance[41] = 35; - quantum_luminance[42] = 55; - quantum_luminance[43] = 64; - quantum_luminance[44] = 81; - quantum_luminance[45] = 104; - quantum_luminance[46] = 113; - quantum_luminance[47] = 92; - quantum_luminance[48] = 49; - quantum_luminance[49] = 64; - quantum_luminance[50] = 78; - quantum_luminance[51] = 87; - quantum_luminance[52] = 103; - quantum_luminance[53] = 121; - quantum_luminance[54] = 120; - quantum_luminance[55] = 101; - quantum_luminance[56] = 72; - quantum_luminance[57] = 92; - quantum_luminance[58] = 95; - quantum_luminance[59] = 98; - quantum_luminance[60] = 112; - quantum_luminance[61] = 100; - quantum_luminance[62] = 103; - quantum_luminance[63] = 99; - - AANscale(DivisorsLuminance, quantum_luminance, quality); - - // Creating the chrominance matrix - - for (int i = 4; i < 64; i++) - quantum_chrominance[i] = 99; - - quantum_chrominance[0] = 17; - quantum_chrominance[1] = 18; - quantum_chrominance[2] = 24; - quantum_chrominance[3] = 47; - - quantum_chrominance[8] = 18; - quantum_chrominance[9] = 21; - quantum_chrominance[10] = 26; - quantum_chrominance[11] = 66; - - quantum_chrominance[16] = 24; - quantum_chrominance[17] = 26; - quantum_chrominance[18] = 56; - - quantum_chrominance[24] = 47; - quantum_chrominance[25] = 66; - - AANscale(DivisorsChrominance, quantum_chrominance, quality); - - // quantum and Divisors are objects used to hold the appropriate matices - - quantum[0] = quantum_luminance; - quantum[1] = quantum_chrominance; - - divisors[0] = DivisorsLuminance; - divisors[1] = DivisorsChrominance; - - } - - private final static double[] AANscaleFactor = { 1.0, 1.387039845, - 1.306562965, 1.175875602, 1.0, 0.785694958, 0.541196100, 0.275899379 }; - - static private void AANscale(double[] divisors, int[] values, int quality) { - - for (int j = 0; j < 64; j++) { - int temp = (values[j] * quality + 50) / 100; - values[j] = (temp < 1 ? 1 : temp > 255 ? 255 : temp); - } - - for (int i = 0, index = 0; i < 8; i++) - for (int j = 0; j < 8; j++, index++) - // The divisors for the LL&M method (the slow integer method used in - // jpeg 6a library). This method is currently (04/04/98) incompletely - // implemented. - // DivisorsLuminance[index] = ((double) quantum_luminance[index]) << 3; - // The divisors for the AAN method (the float method used in jpeg 6a library. - divisors[index] = (0.125 / (values[index] * AANscaleFactor[i] * AANscaleFactor[j])); - } - - /* - * This method preforms forward DCT on a block of image data using - * the literal method specified for a 2-D Discrete Cosine Transform. - * It is included as a curiosity and can give you an idea of the - * difference in the compression result (the resulting image quality) - * by comparing its output to the output of the AAN method below. - * It is ridiculously inefficient. - */ - - // For now the final output is unusable. The associated quantization step - // needs some tweaking. If you get this part working, please let me know. - /* - public double[][] forwardDCTExtreme(float input[][]) - { - double output[][] = new double[N][N]; - int v, u, x, y; - for (v = 0; v < 8; v++) { - for (u = 0; u < 8; u++) { - for (x = 0; x < 8; x++) { - for (y = 0; y < 8; y++) { - output[v][u] += input[x][y] * - Math.cos(((double)(2*x + 1)*(double)u*Math.PI)/16)* - Math.cos(((double)(2*y + 1)*(double)v*Math.PI)/16); - } - } - output[v][u] *= (0.25)*((u == 0) ? (1.0/Math.sqrt(2)) : (double) 1.0)*((v == 0) ? (1.0/Math.sqrt(2)) : (double) 1.0); - } - } - return output; - } - - */ - /* - * This method preforms a DCT on a block of image data using the AAN - * method as implemented in the IJG Jpeg-6a library. - */ - static double[][] forwardDCT(float input[][]) { - double output[][] = new double[N][N]; - double tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - double tmp10, tmp11, tmp12, tmp13; - double z1, z2, z3, z4, z5, z11, z13; - // Subtracts 128 from the input values - for (int i = 0; i < 8; i++) - for (int j = 0; j < 8; j++) - output[i][j] = (input[i][j] - 128.0); - // input[i][j] -= 128; - - for (int i = 0; i < 8; i++) { - tmp0 = output[i][0] + output[i][7]; - tmp7 = output[i][0] - output[i][7]; - tmp1 = output[i][1] + output[i][6]; - tmp6 = output[i][1] - output[i][6]; - tmp2 = output[i][2] + output[i][5]; - tmp5 = output[i][2] - output[i][5]; - tmp3 = output[i][3] + output[i][4]; - tmp4 = output[i][3] - output[i][4]; - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - output[i][0] = tmp10 + tmp11; - output[i][4] = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * 0.707106781; - output[i][2] = tmp13 + z1; - output[i][6] = tmp13 - z1; - - tmp10 = tmp4 + tmp5; - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - z5 = (tmp10 - tmp12) * 0.382683433; - z2 = 0.541196100 * tmp10 + z5; - z4 = 1.306562965 * tmp12 + z5; - z3 = tmp11 * 0.707106781; - - z11 = tmp7 + z3; - z13 = tmp7 - z3; - - output[i][5] = z13 + z2; - output[i][3] = z13 - z2; - output[i][1] = z11 + z4; - output[i][7] = z11 - z4; - } - - for (int i = 0; i < 8; i++) { - tmp0 = output[0][i] + output[7][i]; - tmp7 = output[0][i] - output[7][i]; - tmp1 = output[1][i] + output[6][i]; - tmp6 = output[1][i] - output[6][i]; - tmp2 = output[2][i] + output[5][i]; - tmp5 = output[2][i] - output[5][i]; - tmp3 = output[3][i] + output[4][i]; - tmp4 = output[3][i] - output[4][i]; - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - output[0][i] = tmp10 + tmp11; - output[4][i] = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * 0.707106781; - output[2][i] = tmp13 + z1; - output[6][i] = tmp13 - z1; - - tmp10 = tmp4 + tmp5; - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - z5 = (tmp10 - tmp12) * 0.382683433; - z2 = 0.541196100 * tmp10 + z5; - z4 = 1.306562965 * tmp12 + z5; - z3 = tmp11 * 0.707106781; - - z11 = tmp7 + z3; - z13 = tmp7 - z3; - - output[5][i] = z13 + z2; - output[3][i] = z13 - z2; - output[1][i] = z11 + z4; - output[7][i] = z11 - z4; - } - - return output; - } - - /* - * This method quantitizes data and rounds it to the nearest integer. - */ - static int[] quantizeBlock(double inputData[][], double[] divisorsCode) { - int outputData[] = new int[NN]; - for (int i = 0, index = 0; i < 8; i++) - for (int j = 0; j < 8; j++, index++) - // The second line results in significantly better compression. - outputData[index] = (int) (Math.round(inputData[i][j] - * divisorsCode[index])); - // outputData[index] = (int)(((inputData[i][j] * (((double[]) (Divisors[code]))[index])) + 16384.5) -16384); - return outputData; - } - - /* - * This is the method for quantizing a block DCT'ed with forwardDCTExtreme - * This method quantitizes data and rounds it to the nearest integer. - */ - - /* - - public double[][] forwardDCTExtreme(float input[][]) - { - double output[][] = new double[N][N]; - int v, u, x, y; - for (v = 0; v < 8; v++) { - for (u = 0; u < 8; u++) { - for (x = 0; x < 8; x++) { - for (y = 0; y < 8; y++) { - output[v][u] += input[x][y] * - Math.cos(((double)(2*x + 1)*(double)u*Math.PI)/16)* - Math.cos(((double)(2*y + 1)*(double)v*Math.PI)/16); - } - } - output[v][u] *= (0.25)*((u == 0) ? (1.0/Math.sqrt(2)) : (double) 1.0)*((v == 0) ? (1.0/Math.sqrt(2)) : (double) 1.0); - } - } - return output; - } - - */ - /* - public int[] quantizeBlockExtreme(double inputData[][], int code) - { - int outputData[] = new int[NN]; - int i, j; - int index; - index = 0; - for (i = 0; i < 8; i++) { - for (j = 0; j < 8; j++) { - outputData[index] = (int)(Math.round(inputData[i][j] / (((int[]) (quantum[code]))[index]))); - index++; - } - } - - return outputData; - } - */ -} - -// This class was modified by James R. Weeks on 3/27/98. -// It now incorporates Huffman table derivation as in the C jpeg library -// from the IJG, Jpeg-6a. - -class Huffman { - private int bufferPutBits, bufferPutBuffer; - int imageHeight; - int imageWidth; - private int dc_matrix0[][]; - private int ac_matrix0[][]; - private int dc_matrix1[][]; - private int ac_matrix1[][]; - private int[][][] dc_matrix; - private int[][][] ac_matrix; - //private int code; - int numOfDCTables; - int numOfACTables; - final static int[] bitsDCluminance = { 0x00, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0 }; - final static int[] valDCluminance = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - final static int[] bitsDCchrominance = { 0x01, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0 }; - final static int[] valDCchrominance = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - final static int[] bitsACluminance = { 0x10, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, - 4, 0, 0, 1, 0x7d }; - final static int[] valACluminance = { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, - 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, - 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, - 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, - 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, - 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, - 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, - 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, - 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, - 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; - final static int[] bitsACchrominance = { 0x11, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, - 4, 4, 0, 1, 2, 0x77 }; - final static int[] valACchrominance = { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, - 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, - 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, - 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, - 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, - 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, - 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, - 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, - 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, - 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, - 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; - - /* - * jpegNaturalOrder[i] is the natural-order position of the i'th element - * of zigzag order. - */ - final static int[] jpegNaturalOrder = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, - 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, - 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, }; - - Huffman(int width, int height) { - initHuf(); - imageWidth = width; - imageHeight = height; - - } - - /** - * HuffmanBlockEncoder run length encodes and Huffman encodes the quantized - * data. - * - * @param out - * @param zigzag - * @param prec - * @param dcCode - * @param acCode - **/ - - void HuffmanBlockEncoder(OC out, int zigzag[], int prec, - int dcCode, int acCode) { - int temp, temp2, nbits, k, r, i; - - numOfDCTables = 2; - numOfACTables = 2; - - int[][] matrixDC = dc_matrix[dcCode]; - int[][] matrixAC = ac_matrix[acCode]; - - // The DC portion - - temp = temp2 = zigzag[0] - prec; - if (temp < 0) { - temp = -temp; - temp2--; - } - nbits = 0; - while (temp != 0) { - nbits++; - temp >>= 1; - } - // if (nbits > 11) nbits = 11; - bufferIt(out, matrixDC[nbits][0], matrixDC[nbits][1]); - // The arguments in bufferIt are code and size. - if (nbits != 0) { - bufferIt(out, temp2, nbits); - } - - // The AC portion - - r = 0; - - for (k = 1; k < 64; k++) { - if ((temp = zigzag[jpegNaturalOrder[k]]) == 0) { - r++; - } else { - while (r > 15) { - bufferIt(out, matrixAC[0xF0][0], matrixAC[0xF0][1]); - r -= 16; - } - temp2 = temp; - if (temp < 0) { - temp = -temp; - temp2--; - } - nbits = 1; - while ((temp >>= 1) != 0) { - nbits++; - } - i = (r << 4) + nbits; - bufferIt(out, matrixAC[i][0], matrixAC[i][1]); - bufferIt(out, temp2, nbits); - - r = 0; - } - } - - if (r > 0) { - bufferIt(out, matrixAC[0][0], matrixAC[0][1]); - } - - } - - // Uses an integer long (32 bits) buffer to store the Huffman encoded bits - // and sends them to out by the byte. - - void bufferIt(OC out, int code, int size) { - int putBuffer = code; - int putBits = bufferPutBits; - - putBuffer &= (1 << size) - 1; - putBits += size; - putBuffer <<= 24 - putBits; - putBuffer |= bufferPutBuffer; - - while (putBits >= 8) { - int c = ((putBuffer >> 16) & 0xFF); - out.writeByteAsInt(c); - if (c == 0xFF) { - out.writeByteAsInt(0); - } - putBuffer <<= 8; - putBits -= 8; - } - bufferPutBuffer = putBuffer; - bufferPutBits = putBits; - - } - - void flushBuffer(OC out) { - int putBuffer = bufferPutBuffer; - int putBits = bufferPutBits; - while (putBits >= 8) { - int c = ((putBuffer >> 16) & 0xFF); - out.writeByteAsInt(c); - if (c == 0xFF) { - out.writeByteAsInt(0); - } - putBuffer <<= 8; - putBits -= 8; - } - if (putBits > 0) { - int c = ((putBuffer >> 16) & 0xFF); - out.writeByteAsInt(c); - } - } - - /* - * Initialisation of the Huffman codes for Luminance and Chrominance. - * This code results in the same tables created in the IJG Jpeg-6a - * library. - */ - - private void initHuf() { - dc_matrix0 = new int[12][2]; - dc_matrix1 = new int[12][2]; - ac_matrix0 = new int[255][2]; - ac_matrix1 = new int[255][2]; - dc_matrix = AU.newInt3(2, -1); - ac_matrix = AU.newInt3(2, -1); - int p, l, i, lastp, si, code; - int[] huffsize = new int[257]; - int[] huffcode = new int[257]; - - /* - * init of the DC values for the chrominance - * [][0] is the code [][1] is the number of bit - */ - - p = 0; - for (l = 1; l <= 16; l++) { - // for (i = 1; i <= bitsDCchrominance[l]; i++) - for (i = bitsDCchrominance[l]; --i >= 0;) { - huffsize[p++] = l; //that's an "el", not a "one" - } - } - huffsize[p] = 0; - lastp = p; - - code = 0; - si = huffsize[0]; - p = 0; - while (huffsize[p] != 0) { - while (huffsize[p] == si) { - huffcode[p++] = code; - code++; - } - code <<= 1; - si++; - } - - for (p = 0; p < lastp; p++) { - dc_matrix1[valDCchrominance[p]][0] = huffcode[p]; - dc_matrix1[valDCchrominance[p]][1] = huffsize[p]; - } - - /* - * Init of the AC huffman code for the chrominance - * matrix [][][0] is the code & matrix[][][1] is the number of bit needed - */ - - p = 0; - for (l = 1; l <= 16; l++) { - for (i = bitsACchrominance[l]; --i >= 0;) - // for (i = 1; i <= bitsACchrominance[l]; i++) - { - huffsize[p++] = l; - } - } - huffsize[p] = 0; - lastp = p; - - code = 0; - si = huffsize[0]; - p = 0; - while (huffsize[p] != 0) { - while (huffsize[p] == si) { - huffcode[p++] = code; - code++; - } - code <<= 1; - si++; - } - - for (p = 0; p < lastp; p++) { - ac_matrix1[valACchrominance[p]][0] = huffcode[p]; - ac_matrix1[valACchrominance[p]][1] = huffsize[p]; - } - - /* - * init of the DC values for the luminance - * [][0] is the code [][1] is the number of bit - */ - p = 0; - for (l = 1; l <= 16; l++) { - // for (i = 1; i <= bitsDCluminance[l]; i++) - for (i = bitsDCluminance[l]; --i >= 0;) { - huffsize[p++] = l; - } - } - huffsize[p] = 0; - lastp = p; - - code = 0; - si = huffsize[0]; - p = 0; - while (huffsize[p] != 0) { - while (huffsize[p] == si) { - huffcode[p++] = code; - code++; - } - code <<= 1; - si++; - } - - for (p = 0; p < lastp; p++) { - dc_matrix0[valDCluminance[p]][0] = huffcode[p]; - dc_matrix0[valDCluminance[p]][1] = huffsize[p]; - } - - /* - * Init of the AC huffman code for luminance - * matrix [][][0] is the code & matrix[][][1] is the number of bit - */ - - p = 0; - for (l = 1; l <= 16; l++) { - // for (i = 1; i <= bitsACluminance[l]; i++) - for (i = bitsACluminance[l]; --i >= 0;) { - huffsize[p++] = l; - } - } - huffsize[p] = 0; - lastp = p; - - code = 0; - si = huffsize[0]; - p = 0; - while (huffsize[p] != 0) { - while (huffsize[p] == si) { - huffcode[p++] = code; - code++; - } - code <<= 1; - si++; - } - for (int q = 0; q < lastp; q++) { - ac_matrix0[valACluminance[q]][0] = huffcode[q]; - ac_matrix0[valACluminance[q]][1] = huffsize[q]; - } - - dc_matrix[0] = dc_matrix0; - dc_matrix[1] = dc_matrix1; - ac_matrix[0] = ac_matrix0; - ac_matrix[1] = ac_matrix1; - } - -} - -/* - * JpegInfo - Given an image, sets default information about it and divides - * it into its constituant components, downsizing those that need to be. - */ - -class JpegObj { - String comment; - int imageHeight; - int imageWidth; - int blockWidth[]; - int blockHeight[]; - - int precision = 8; - int numberOfComponents = 3; - float[][][] components; - int[] compID = { 1, 2, 3 }; - int[] hsampFactor = { 1, 1, 1 }; - int[] vsampFactor = { 1, 1, 1 }; - int[] qtableNumber = { 0, 1, 1 }; - int[] dctableNumber = { 0, 1, 1 }; - int[] actableNumber = { 0, 1, 1 }; - private boolean[] lastColumnIsDummy = { false, false, false }; - private boolean[] lastRowIsDummy = { false, false, false }; - int ss = 0; - int se = 63; - int ah = 0; - int al = 0; - private int compWidth[]; - private int compHeight[]; - private int maxHsampFactor; - private int maxVsampFactor; - - public JpegObj() { - components = AU.newFloat3(numberOfComponents, -1); - compWidth = new int[numberOfComponents]; - compHeight = new int[numberOfComponents]; - blockWidth = new int[numberOfComponents]; - blockHeight = new int[numberOfComponents]; - } - - /* - * This method creates and fills three arrays, Y, Cb, and Cr using the - * input image. - */ - - void getYCCArray(int[] pixels) { - // In order to minimize the chance that grabPixels will throw an exception - // it may be necessary to grab some pixels every few scanlines and process - // those before going for more. The time expense may be prohibitive. - // However, for a situation where memory overhead is a concern, this may be - // the only choice. - maxHsampFactor = 1; - maxVsampFactor = 1; - for (int y = 0; y < numberOfComponents; y++) { - maxHsampFactor = Math.max(maxHsampFactor, hsampFactor[y]); - maxVsampFactor = Math.max(maxVsampFactor, vsampFactor[y]); - } - for (int y = 0; y < numberOfComponents; y++) { - compWidth[y] = (((imageWidth % 8 != 0) ? ((int) Math - .ceil(imageWidth / 8.0)) * 8 : imageWidth) / maxHsampFactor) - * hsampFactor[y]; - if (compWidth[y] != ((imageWidth / maxHsampFactor) * hsampFactor[y])) { - lastColumnIsDummy[y] = true; - } - // results in a multiple of 8 for compWidth - // this will make the rest of the program fail for the unlikely - // event that someone tries to compress an 16 x 16 pixel image - // which would of course be worse than pointless - blockWidth[y] = (int) Math.ceil(compWidth[y] / 8.0); - compHeight[y] = (((imageHeight % 8 != 0) ? ((int) Math - .ceil(imageHeight / 8.0)) * 8 : imageHeight) / maxVsampFactor) - * vsampFactor[y]; - if (compHeight[y] != ((imageHeight / maxVsampFactor) * vsampFactor[y])) { - lastRowIsDummy[y] = true; - } - blockHeight[y] = (int) Math.ceil(compHeight[y] / 8.0); - } - float Y[][] = new float[compHeight[0]][compWidth[0]]; - float Cr1[][] = new float[compHeight[0]][compWidth[0]]; - float Cb1[][] = new float[compHeight[0]][compWidth[0]]; - //float Cb2[][] = new float[compHeight[1]][compWidth[1]]; - //float Cr2[][] = new float[compHeight[2]][compWidth[2]]; - for (int pt = 0, y = 0; y < imageHeight; ++y) { - for (int x = 0; x < imageWidth; ++x, pt++) { - int p = pixels[pt]; - int r = ((p >> 16) & 0xff); - int g = ((p >> 8) & 0xff); - int b = (p & 0xff); - // The following three lines are a more correct color conversion but - // the current conversion technique is sufficient and results in a higher - // compression rate. - // Y[y][x] = 16 + (float)(0.8588*(0.299 * (float)r + 0.587 * (float)g + 0.114 * (float)b )); - // Cb1[y][x] = 128 + (float)(0.8784*(-0.16874 * (float)r - 0.33126 * (float)g + 0.5 * (float)b)); - // Cr1[y][x] = 128 + (float)(0.8784*(0.5 * (float)r - 0.41869 * (float)g - 0.08131 * (float)b)); - Y[y][x] = (float) ((0.299 * r + 0.587 * g + 0.114 * b)); - Cb1[y][x] = 128 + (float) ((-0.16874 * r - 0.33126 * g + 0.5 * b)); - Cr1[y][x] = 128 + (float) ((0.5 * r - 0.41869 * g - 0.08131 * b)); - } - } - - // Need a way to set the H and V sample factors before allowing downsampling. - // For now (04/04/98) downsampling must be hard coded. - // Until a better downsampler is implemented, this will not be done. - // Downsampling is currently supported. The downsampling method here - // is a simple box filter. - - components[0] = Y; - // Cb2 = DownSample(Cb1, 1); - components[1] = Cb1; - // Cr2 = DownSample(Cr1, 2); - components[2] = Cr1; - } - /* - float[][] DownSample(float[][] C, int comp) - { - int inrow, incol; - int outrow, outcol; - float output[][]; - int bias; - inrow = 0; - incol = 0; - int cHeight = compHeight[comp]; - int cWidth = compWidth[comp]; - output = new float[cHeight][cWidth]; - - for (outrow = 0; outrow < cHeight; outrow++) { - bias = 1; - for (outcol = 0; outcol < cWidth; outcol++) { - output[outrow][outcol] = (C[inrow][incol++] + C[inrow++][incol--] - + C[inrow][incol++] + C[inrow--][incol++] + bias)/(float)4.0; - bias ^= 3; - } - inrow += 2; - incol = 0; - } - return output; - } - */ - -} diff --git a/src2/javajs/img/PdfEncoder.java b/src2/javajs/img/PdfEncoder.java deleted file mode 100644 index 7dfd4b8..0000000 --- a/src2/javajs/img/PdfEncoder.java +++ /dev/null @@ -1,108 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2009-06-30 18:58:33 -0500 (Tue, 30 Jun 2009) $ - * $Revision: 11158 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2002-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.img; - -import java.util.Hashtable; -import java.util.Map; - -import javajs.export.PDFCreator; - -/** - * A relatively primitive PDF generator that just makes a document with an image - * in it. - * - */ -public class PdfEncoder extends ImageEncoder { - - private boolean isLandscape; - private PDFCreator pdf; - private String comment; - - public PdfEncoder() { - // for Class.forName - } - - @Override - protected void setParams(Map params) { - isLandscape = (quality > 1); - comment = "Jmol " + (String) params.get("comment"); - } - - @Override - protected void generate() throws Exception { - pdf = new PDFCreator(); - int pageWidth = 8 * 72; - int pageHeight = 11 * 72; - pdf.setOutputStream(out); - pdf.newDocument(pageWidth, pageHeight, isLandscape); // A4 or Letter - addMyImage(pageWidth, pageHeight); - Map ht = new Hashtable(); - if (comment != null) - ht.put("Producer", comment); - ht.put("Author", "JMol"); - ht.put("CreationDate", date); - pdf.addInfo(ht); - pdf.closeDocument(); - } - - - /** - * centered on the page - * - * @param pageWidth - * @param pageHeight - */ - private void addMyImage(int pageWidth, int pageHeight) { - pdf.addImageResource("img1", width, height, pixels, true); - int w = (isLandscape ? pageHeight : pageWidth); - int h = (isLandscape ? pageWidth : pageHeight); - int iw = width; - int ih = height; - if (iw > 0.9 * w) { - ih = (int) (ih * 0.9 * w / iw); - iw = (int) (w * 0.9); - } - if (ih > 0.9 * h) { - iw = (int) (iw * 0.9 * h / ih); - ih = (int) (h * 0.9); - } - int x = 0; - int y = 0; - int x1 = iw; - int y1 = ih; - if (w > iw) { - x = (w - iw) / 2; - x1 = iw + x; - } - if (h > ih) { - y = (h - ih) / 2; - y1 = ih + y; - } - pdf.drawImage("img1", x, y, x1, y1, 0, 0, width, height); - } - -} diff --git a/src2/javajs/img/PngEncoder.java b/src2/javajs/img/PngEncoder.java deleted file mode 100644 index 2dc8485..0000000 --- a/src2/javajs/img/PngEncoder.java +++ /dev/null @@ -1,480 +0,0 @@ -/* $RCSfile$ - * $Author: nicove $ - * $Date: 2007-03-30 12:26:16 -0500 (Fri, 30 Mar 2007) $ - * $Revision: 7275 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2002-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.img; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Map; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; - - - -/** - * - * Modified by Bob Hanson hansonr@stolaf.edu to be a subclass of ImageEncoder - * and to use javajs.util.OutputChannel instead of just returning bytes. Also includes: - * - * -- JavaScript-compatible image processing - * - * -- transparent background option - * - * -- more efficient calculation of needs for pngBytes - * - * -- option to use pre-created PNGJ image data (3/19/14; Jmol 14.1.12) - * - * -- PNGJ format: - * - * // IHDR chunk - * - * // tEXt chunk "Jmol type - <0000000pt>+<000000len>" - * - * // tEXt chunk "Software - Jmol " - * - * // tEXt chunk "Creation Time - " - * - * // tRNS chunk transparent color, if desired - * - * // IDAT chunk (image data) - * - * // IEND chunk - * - * // [JMOL ZIP FILE APPENDIX] - * - * Original Comment: - * - * PngEncoder takes a Java Image object and creates a byte string which can be - * saved as a PNG file. The Image is presumed to use the DirectColorModel. - * - * Thanks to Jay Denny at KeyPoint Software http://www.keypoint.com/ who let me - * develop this code on company time. - * - * You may contact me with (probably very-much-needed) improvements, comments, - * and bug fixes at: - * - * david@catcode.com - * - * @author J. David Eisenberg - * @author http://catcode.com/pngencoder/ - * @author Christian Ribeaud (christian.ribeaud@genedata.com) - * @author Bob Hanson (hansonr@stolaf.edu) - * - * @version 1.4, 31 March 2000 - */ -public class PngEncoder extends CRCEncoder { - - /** Constants for filters */ - public static final int FILTER_NONE = 0; - public static final int FILTER_SUB = 1; - public static final int FILTER_UP = 2; - public static final int FILTER_LAST = 2; - - private static final int PT_FIRST_TAG = 37; - - private boolean encodeAlpha; - private int filter = FILTER_NONE; - private int bytesPerPixel; - private int compressionLevel; - private String type; - private Integer transparentColor; - - private byte[] appData; - private String appPrefix; - private String comment; - private byte[] bytes; - - - public PngEncoder() { - super(); - } - - @Override - protected void setParams(Map params) { - if (quality < 0) - quality = (params.containsKey("qualityPNG") ? ((Integer) params - .get("qualityPNG")).intValue() : 2); - if (quality > 9) - quality = 9; - encodeAlpha = false; - filter = FILTER_NONE; - compressionLevel = quality; - transparentColor = (Integer) params.get("transparentColor"); - comment = (String) params.get("comment"); - type = (params.get("type") + "0000").substring(0, 4); - bytes = (byte[]) params.get("pngImgData"); - appData = (byte[]) params.get("pngAppData"); - appPrefix = (String) params.get("pngAppPrefix"); - } - - - - @Override - protected void generate() throws IOException { - if (bytes == null) { - if (!pngEncode()) { - out.cancel(); - return; - } - bytes = getBytes(); - } else { - dataLen = bytes.length; - } - int len = dataLen; - if (appData != null) { - setJmolTypeText(appPrefix, bytes, len, appData.length, - type); - out.write(bytes, 0, len); - len = (bytes = appData).length; - } - out.write(bytes, 0, len); - } - - - /** - * Creates an array of bytes that is the PNG equivalent of the current image, - * specifying whether to encode alpha or not. - * - * @return true if successful - * - */ - private boolean pngEncode() { - - byte[] pngIdBytes = { -119, 80, 78, 71, 13, 10, 26, 10 }; - - writeBytes(pngIdBytes); - //hdrPos = bytePos; - writeHeader(); - writeText(getApplicationText(appPrefix, type, 0, 0)); - - writeText("Software\0" + comment); - writeText("Creation Time\0" + date); - - if (!encodeAlpha && transparentColor != null) - writeTransparentColor(transparentColor.intValue()); - //dataPos = bytePos; - return writeImageData(); - } - - /** - * Fill in the Jmol type text area with number of bytes of PNG data and number - * of bytes of Jmol state data and fix checksum. - * - * If we do not do this, then the checksum will be wrong, and Jmol and some - * other programs may not be able to read the PNG image. - * - * This was corrected for Jmol 12.3.30. Between 12.3.7 and 12.3.29, PNG files - * created by Jmol have incorrect checksums. - * - * @param prefix - * - * @param b - * @param nPNG - * @param nState - * @param type - */ - private static void setJmolTypeText(String prefix, byte[] b, int nPNG, int nState, String type) { - String s = "tEXt" + getApplicationText(prefix, type, nPNG, nState); - CRCEncoder encoder = new PngEncoder(); - byte[] test = s.substring(0, 4 + prefix.length()).getBytes(); - for (int i = test.length; -- i >= 0;) - if (b[i + PT_FIRST_TAG] != test[i]) { - System.out.println("image is not of the right form; appending data, but not adding tEXt tag."); - return; - } - encoder.setData(b, PT_FIRST_TAG); - encoder.writeString(s); - encoder.writeCRC(); - } - - /** - * Generate the PNGJ directory identifier: - * - * xxxxxxxxx\0ttttiiiiiiiii+ddddddddd - * - * where - * - * xxxxxxxxx is a unique 9-character software identifier - * tttt is a four-byte software-specific type indicator (PNG0, PNGJ, PNGT, etc.) - * iiiiiiiii is the file pointer to the start of app data - * ddddddddd is the length of the app data - * - * @param prefix up to 9 characters to allow software to recognize itself - * @param type PNGx, where x is J or T for Jmol; original type "PNG" is now "PNG0" - * @param nPNG - * @param nData - * @return - */ - private static String getApplicationText(String prefix, String type, - int nPNG, int nData) { - String sPNG = "000000000" + nPNG; - sPNG = sPNG.substring(sPNG.length() - 9); - String sData = "000000000" + nData; - sData = sData.substring(sData.length() - 9); - if (prefix == null) - prefix = "#SwingJS."; - if (prefix.length() < 9) - prefix = (prefix + "........."); - if (prefix.length() > 9) - prefix = prefix.substring(0, 9); - return prefix + "\0" + type + sPNG + "+" + sData; - } - - // /** - // * Set the filter to use - // * - // * @param whichFilter from constant list - // */ - // public void setFilter(int whichFilter) { - // this.filter = (whichFilter <= FILTER_LAST ? whichFilter : FILTER_NONE); - // } - - // /** - // * Retrieve filtering scheme - // * - // * @return int (see constant list) - // */ - // public int getFilter() { - // return filter; - // } - - // /** - // * Set the compression level to use - // * - // * @param level 0 through 9 - // */ - // public void setCompressionLevel(int level) { - // if ((level >= 0) && (level <= 9)) { - // this.compressionLevel = level; - // } - // } - - // /** - // * Retrieve compression level - // * - // * @return int in range 0-9 - // */ - // public int getCompressionLevel() { - // return compressionLevel; - // } - - /** - * Write a PNG "IHDR" chunk into the pngBytes array. - */ - private void writeHeader() { - - writeInt4(13); - startPos = bytePos; - writeString("IHDR"); - writeInt4(width); - writeInt4(height); - writeByte(8); // bit depth - writeByte(encodeAlpha ? 6 : 2); // color type or direct model - writeByte(0); // compression method - writeByte(0); // filter method - writeByte(0); // no interlace - writeCRC(); - } - - private void writeText(String msg) { - writeInt4(msg.length()); - startPos = bytePos; - writeString("tEXt" + msg); - writeCRC(); - } - - /** - * Write a PNG "tRNS" chunk into the pngBytes array. - * - * @param icolor - */ - private void writeTransparentColor(int icolor) { - - writeInt4(6); - startPos = bytePos; - writeString("tRNS"); - writeInt2((icolor >> 16) & 0xFF); - writeInt2((icolor >> 8) & 0xFF); - writeInt2(icolor & 0xFF); - writeCRC(); - } - - private byte[] scanLines; // the scan lines to be compressed - private int byteWidth; // width * bytesPerPixel - - //private int hdrPos, dataPos, endPos; - //private byte[] priorRow; - //private byte[] leftBytes; - - - /** - * Write the image data into the pngBytes array. This will write one or more - * PNG "IDAT" chunks. In order to conserve memory, this method grabs as many - * rows as will fit into 32K bytes, or the whole image; whichever is less. - * - * - * @return true if no errors; false if error grabbing pixels - */ - private boolean writeImageData() { - - bytesPerPixel = (encodeAlpha ? 4 : 3); - byteWidth = width * bytesPerPixel; - - int scanWidth = byteWidth + 1; // the added 1 is for the filter byte - - //boolean doFilter = (filter != FILTER_NONE); - - int rowsLeft = height; // number of rows remaining to write - //int startRow = 0; // starting row to process this time through - int nRows; // how many rows to grab at a time - - int scanPos; // where we are in the scan lines - - Deflater deflater = new Deflater(compressionLevel); - ByteArrayOutputStream outBytes = new ByteArrayOutputStream(1024); - - DeflaterOutputStream compBytes = new DeflaterOutputStream(outBytes, - deflater); - - int pt = 0; // overall image byte pointer - - // Jmol note: The entire image has been stored in pixels[] already - - try { - while (rowsLeft > 0) { - nRows = Math.max(1, Math.min(32767 / scanWidth, rowsLeft)); - scanLines = new byte[scanWidth * nRows]; - // if (doFilter) - // switch (filter) { - // case FILTER_SUB: - // leftBytes = new byte[16]; - // break; - // case FILTER_UP: - // priorRow = new byte[scanWidth - 1]; - // break; - // } - int nPixels = width * nRows; - scanPos = 0; - //startPos = 1; - for (int i = 0; i < nPixels; i++, pt++) { - if (i % width == 0) { - scanLines[scanPos++] = (byte) filter; - //startPos = scanPos; - } - scanLines[scanPos++] = (byte) ((pixels[pt] >> 16) & 0xff); - scanLines[scanPos++] = (byte) ((pixels[pt] >> 8) & 0xff); - scanLines[scanPos++] = (byte) ((pixels[pt]) & 0xff); - if (encodeAlpha) { - scanLines[scanPos++] = (byte) ((pixels[pt] >> 24) & 0xff); - } - // if (doFilter && i % width == width - 1) { - // switch (filter) { - // case FILTER_SUB: - // filterSub(); - // break; - // case FILTER_UP: - // filterUp(); - // break; - // } - // } - } - - /* - * Write these lines to the output area - */ - compBytes.write(scanLines, 0, scanPos); - - //startRow += nRows; - rowsLeft -= nRows; - } - compBytes.close(); - - /* - * Write the compressed bytes - */ - byte[] compressedLines = outBytes.toByteArray(); - writeInt4(compressedLines.length); - startPos = bytePos; - writeString("IDAT"); - writeBytes(compressedLines); - writeCRC(); - writeEnd(); - deflater.finish(); - return true; - } catch (IOException e) { - System.err.println(e.toString()); - return false; - } - } - - /** - * Write a PNG "IEND" chunk into the pngBytes array. - */ - private void writeEnd() { - writeInt4(0); - startPos = bytePos; - writeString("IEND"); - writeCRC(); - } - - ///** - //* Perform "sub" filtering on the given row. - //* Uses temporary array leftBytes to store the original values - //* of the previous pixels. The array is 16 bytes long, which - //* will easily hold two-byte samples plus two-byte alpha. - //* - //*/ - //private void filterSub() { - // int offset = bytesPerPixel; - // int actualStart = startPos + offset; - // int leftInsert = offset; - // int leftExtract = 0; - // //byte current_byte; - // - // for (int i = actualStart; i < startPos + byteWidth; i++) { - // leftBytes[leftInsert] = scanLines[i]; - // scanLines[i] = (byte) ((scanLines[i] - leftBytes[leftExtract]) % 256); - // leftInsert = (leftInsert + 1) % 0x0f; - // leftExtract = (leftExtract + 1) % 0x0f; - // } - //} - // - ///** - //* Perform "up" filtering on the given row. Side effect: refills the prior row - //* with current row - //* - //*/ - //private void filterUp() { - // int nBytes = width * bytesPerPixel; - // for (int i = 0; i < nBytes; i++) { - // int pt = startPos + i; - // byte b = scanLines[pt]; - // scanLines[pt] = (byte) ((scanLines[pt] - priorRow[i]) % 256); - // priorRow[i] = b; - // } - //} - -} diff --git a/src2/javajs/img/PpmEncoder.java b/src2/javajs/img/PpmEncoder.java deleted file mode 100644 index 4bdc980..0000000 --- a/src2/javajs/img/PpmEncoder.java +++ /dev/null @@ -1,60 +0,0 @@ -// PpmEncoder - write out an image as a PPM -// -// Copyright (C)1996,1998 by Jef Poskanzer . All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -// SUCH DAMAGE. -// -// Visit the ACME Labs Java page for up-to-date versions of this and other -// fine Java utilities: http://www.acme.com/java/ - -package javajs.img; - -import java.util.Map; - - -/** - * see http://netpbm.sourceforge.net/doc/ppm.html - */ -public class PpmEncoder extends ImageEncoder { - - @Override - protected void setParams(Map params) { - // no params - } - - @Override - protected void generate() { - putString("P6\n"); - putString(width + " " + height + "\n"); - putString("255\n"); - byte[] ppmPixels = new byte[width * 3]; - for (int pt = 0, row = 0; row < height; ++row) { - for (int col = 0, j = 0; col < width; ++col, pt++) { - int p = pixels[pt]; - ppmPixels[j++] = (byte) ((p >> 16) & 0xff); - ppmPixels[j++] = (byte) ((p >> 8) & 0xff); - ppmPixels[j++] = (byte) (p & 0xff); - } - out.write(ppmPixels, 0, ppmPixels.length); - } - } -} diff --git a/src2/javajs/util/A4.java b/src2/javajs/util/A4.java deleted file mode 100644 index d20b6c2..0000000 --- a/src2/javajs/util/A4.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - -import java.io.Serializable; - -import javajs.api.JSONEncodable; -import javajs.util.T3; - - - -/** - * A 4 element axis angle represented by single precision floating point - * x,y,z,angle components. An axis angle is a rotation of angle (radians) about - * the vector (x,y,z). - * - * @version specification 1.1, implementation $Revision: 1.9 $, $Date: - * 2006/07/28 17:01:32 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 - * for unique constructor and method names - * for the optimization of compiled JavaScript using Java2Script - */ -public class A4 implements JSONEncodable, Serializable { - - /* - * I assumed that the length of the axis vector is not significant. - */ - - /** - * The x coordinate. - */ - public float x; - - /** - * The y coordinate. - */ - public float y; - - /** - * The z coordinate. - */ - public float z; - - /** - * The angle. - */ - public float angle; - - /** - * Constructs and initializes a AxisAngle4f to (0,0,1,0). - */ - public A4() { - z = 1.0f; - } - - /** - * Constructs and initializes an AxisAngle4f from the specified x, y, z, and - * angle. - * - * @param x - * the x coordinate - * @param y - * the y coordinate - * @param z - * the z coordinate - * @param angle - * the angle. - * @return a - */ - public static A4 new4(float x, float y, float z, float angle) { - A4 a = new A4(); - a.set4(x, y, z, angle); - return a; - } - - /** - * Constructs and initializes a AxisAngle4f from the specified AxisAngle4f. - * - * @param a1 - * the AxisAngle4f containing the initialization x y z angle data - * @return a - */ - public static A4 newAA(A4 a1) { - A4 a = new A4(); - a.set4(a1.x, a1.y, a1.z, a1.angle); - return a; - } - - /** - * Constructs and initializes an AxisAngle4f from the specified axis and - * angle. - * - * @param axis - * the axis - * @param angle - * the angle - * @return a - */ - public static A4 newVA(V3 axis, float angle) { - A4 a = new A4(); - a.setVA(axis, angle); - return a; - } - - /** - * Sets the value of this AxisAngle4f to the specified axis and angle. - * - * @param axis - * the axis - * @param angle - * the angle - * @since Java 3D 1.2 - */ - public final void setVA(V3 axis, float angle) { - x = axis.x; - y = axis.y; - z = axis.z; - this.angle = angle; - } - - /** - * Sets the value of this axis angle to the specified x,y,z,angle. - * - * @param x - * the x coordinate - * @param y - * the y coordinate - * @param z - * the z coordinate - * @param angle - * the angle - */ - public final void set4(float x, float y, float z, float angle) { - this.x = x; - this.y = y; - this.z = z; - this.angle = angle; - } - - /** - * Sets the value of this axis angle to the value of axis angle t1. - * - * @param a - * the axis angle to be copied - */ - public final void setAA(A4 a) { - x = a.x; - y = a.y; - z = a.z; - angle = a.angle; - } - - - /** - * Sets the value of this axis-angle to the rotational component of the passed - * matrix. - * - * @param m1 - * the matrix3f - */ - public final void setM(M3 m1) { - setFromMat(m1.m00, m1.m01, m1.m02, m1.m10, m1.m11, m1.m12, m1.m20, m1.m21, - m1.m22); - } - - // helper method - private void setFromMat(double m00, double m01, double m02, double m10, - double m11, double m12, double m20, double m21, - double m22) { - // assuming M is normalized. - - double cos = (m00 + m11 + m22 - 1.0) * 0.5; - x = (float) (m21 - m12); - y = (float) (m02 - m20); - z = (float) (m10 - m01); - double sin = 0.5 * Math.sqrt(x * x + y * y + z * z); - if (sin == 0 && cos == 1) { - x = y = 0; - z = 1; - angle = 0; - } else { - angle = (float) Math.atan2(sin, cos); - } - - // no need to normalize - // x /= n; - // y /= n; - // z /= n; - } - - /** - * Returns a hash number based on the data values in this object. Two - * different AxisAngle4f objects with identical data values (ie, returns true - * for equals(AxisAngle4f) ) will return the same hash number. Two vectors - * with different data members may return the same hash value, although this - * is not likely. - */ - @Override - public int hashCode() { - return T3.floatToIntBits(x) ^ T3.floatToIntBits(y) - ^ T3.floatToIntBits(z) ^ T3.floatToIntBits(angle); - } - - /** - * Returns true if the Object o is of type AxisAngle4f and all of the data - * members of o1 are equal to the corresponding data members in this - * AxisAngle4f. - * - * @param o - * the object with which the comparison is made. - * @return T/F - */ - @Override - public boolean equals(Object o) { - if (!(o instanceof A4)) - return false; - A4 a1 = (A4) o; - return x == a1.x && y == a1.y && z == a1.z && angle == a1.angle; - } - - /** - * Returns a string that contains the values of this AxisAngle4f. The form is - * (x,y,z,angle). - * - * @return the String representation - */ - @Override - public String toString() { - return "(" + x + ", " + y + ", " + z + ", " + angle + ")"; - } - - @Override - public String toJSON() { - return "[" + x + "," + y + "," + z + "," + (float) (angle * 180.0 / Math.PI) + "]"; - } -} diff --git a/src2/javajs/util/AU.java b/src2/javajs/util/AU.java deleted file mode 100644 index f873116..0000000 --- a/src2/javajs/util/AU.java +++ /dev/null @@ -1,551 +0,0 @@ -/* $RCSfile$ - * $Author: egonw $ - * $Date: 2005-11-10 09:52:44 -0600 (Thu, 10 Nov 2005) $ - * $Revision: 4255 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2003-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.util; - -// 4/23/15 BH getComponentType fix - -import java.lang.reflect.Array; - -import java.util.Arrays; -import java.util.Hashtable; -import java.util.Map; - - -final public class AU { - - /** - * Very important that this not be used with Int32Array or Float32Array, - * because it is not initialize to all zeros in MSIE 9. - * - * @param array - * @param minimumLength - * @return array - */ - public static Object ensureLength(Object array, int minimumLength) { - return (array != null && getLength(array) >= minimumLength ? array - : arrayCopyObject(array, minimumLength)); - } - - public static String[] ensureLengthS(String[] array, int minimumLength) { - return (array != null && array.length >= minimumLength ? array - : arrayCopyS(array, minimumLength)); - } - - public static float[] ensureLengthA(float[] array, int minimumLength) { - return (array != null && array.length >= minimumLength ? array: arrayCopyF(array, minimumLength)); - } - - public static int[] ensureLengthI(int[] array, int minimumLength) { - return (array != null && array.length >= minimumLength ? array : arrayCopyI(array, minimumLength)); - } - - public static short[] ensureLengthShort(short[] array, int minimumLength) { - return (array != null && array.length >= minimumLength ? array : arrayCopyShort(array, minimumLength)); - } - - public static byte[] ensureLengthByte(byte[] array, int minimumLength) { - return (array != null && array.length >= minimumLength ? array : arrayCopyByte(array, minimumLength)); - } - - /** - * Very important that this not be used with Int32Array or Float32Array, - * because it is not initialized to all zeros in MSIE 9. - * - * @param array - * @return array - */ - public static Object doubleLength(Object array) { - return arrayCopyObject(array, (array == null ? 16 : 2 * getLength(array))); - } - - public static String[] doubleLengthS(String[] array) { - return arrayCopyS(array, (array == null ? 16 : 2 * array.length)); - } - - public static float[] doubleLengthF(float[] array) { - return arrayCopyF(array, (array == null ? 16 : 2 * array.length)); - } - - public static int[] doubleLengthI(int[] array) { - return arrayCopyI(array, (array == null ? 16 : 2 * array.length)); - } - - public static short[] doubleLengthShort(short[] array) { - return arrayCopyShort(array, (array == null ? 16 : 2 * array.length)); - } - - public static byte[] doubleLengthByte(byte[] array) { - return arrayCopyByte(array, (array == null ? 16 : 2 * array.length)); - } - - public static boolean[] doubleLengthBool(boolean[] array) { - return arrayCopyBool(array, (array == null ? 16 : 2 * array.length)); - } - - public static Object deleteElements(Object array, int firstElement, - int nElements) { - if (nElements == 0 || array == null) - return array; - int oldLength = getLength(array); - if (firstElement >= oldLength) - return array; - int n = oldLength - (firstElement + nElements); - if (n < 0) - n = 0; - Object t = newInstanceO(array, firstElement + n); - if (firstElement > 0) - System.arraycopy(array, 0, t, 0, firstElement); - if (n > 0) - System.arraycopy(array, firstElement + nElements, t, firstElement, n); - return t; - } - - /** - * note -- cannot copy if array is null! does not copy if length is unchanged - * - * @param array - * @param newLength - * @return array - */ - public static Object arrayCopyObject(Object array, int newLength) { - int oldLength = (array == null ? -1 : getLength(array)); - if (newLength < 0) newLength = oldLength; - if (newLength == oldLength) - return array; - /** - * @j2sNative - * - * if (newLength < oldLength) return Clazz.array(-1, array, 0, newLength); - */ - {} - Object t = newInstanceO(array, newLength); - if (oldLength > 0) - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - return t; - - } - - /** - * Very important that this not be used with Int32Array or Float32Array, - * because those need to be initialized to all zeros in MSIE 9, and - * MSIE 9 cannot distinguish Int32Array or Float32Array from Array. - * - * @param array - * @param n - * @return array - */ - private static Object newInstanceO(Object array, int n) { - return Array.newInstance(array.getClass().getComponentType(), n); - } - - public static int getLength(Object array) { - /** - * @j2sNative - * - * return array.length - * - */ - { - return Array.getLength(array); - } - } - - public static String[] arrayCopyS(String[] array, int newLength) { - int oldLength = (array == null ? -1 : array.length); - if (newLength < 0) newLength = oldLength; - /** - * @j2sNative - * - * if (newLength < oldLength) return Clazz.array(-1, array, 0, newLength); - */ - {} - String[] t = new String[newLength]; - if (array != null) { - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - } - return t; - } - - public static int[][] arrayCopyII(int[][] array, int newLength) { - int[][] t = newInt2(newLength); - if (array != null) { - int oldLength = array.length; - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - } - return t; - } - - public static T3[] arrayCopyPt(T3[] array, int newLength) { - if (newLength < 0) - newLength = array.length; - T3[] t = new T3[newLength]; - if (array != null) { - int oldLength = array.length; - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - } - return t; - } - - public static float[] arrayCopyF(float[] array, int newLength) { - int oldLength = (array == null ? -1 : array.length); - if (newLength < 0) newLength = oldLength; - /** - * @j2sNative - * - * if (newLength < oldLength) return Clazz.array(-1, array, 0, newLength); - */ - {} - float[] t = new float[newLength]; - if (array != null) { - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - } - return t; - } - - public static int[] arrayCopyI(int[] array, int newLength) { - int oldLength = (array == null ? -1 : array.length); - if (newLength < 0) newLength = oldLength; - /** - * @j2sNative - * - * if (newLength < oldLength) return Clazz.array(-1, array, 0, newLength); - */ - {} - int[] t = new int[newLength]; - if (array != null) { - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - } - return t; - } - - /** - * a specialized method that allows copying from a starting point either - * to the end or to the middle (color schemes, especially) - * @param array - * @param i0 - * @param n - * @return array or null - */ - public static int[] arrayCopyRangeI(int[] array, int i0, int n) { - if (array == null) - return null; - int oldLength = array.length; - if (n == -1) n = oldLength; - if (n == -2) n = oldLength / 2; - /** - * @j2sNative - * - * return Clazz.array(-1, array, i0, n); - * - */ - { - } - n -= i0; - int[] t = new int[n]; - System.arraycopy(array, i0, t, 0, n); - return t; - } - - public static int[] arrayCopyRangeRevI(int[] array, int i0, int n) { - if (array == null) - return null; - /** - * @j2sNative - * - * return Clazz.array(-1, array, i0, n).reverse(); - */ - { - } - int[] t = arrayCopyRangeI(array, i0, n); - if (n < 0) - n = array.length; - for (int i = n / 2; --i >= 0;) - swapInt(t, i, n - 1 - i); - return t; - } - - public static short[] arrayCopyShort(short[] array, int newLength) { - int oldLength = (array == null ? -1 : array.length); - if (newLength < 0) newLength = oldLength; - /** - * @j2sNative - * - * if (newLength < oldLength) return Clazz.array(-1, array, 0, newLength); - */ - {} - short[] t = new short[newLength]; - if (array != null) { - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - } - return t; - } - - public static byte[] arrayCopyByte(byte[] array, int newLength) { - int oldLength = (array == null ? -1 : array.length); - if (newLength < 0) newLength = oldLength; - /** - * @j2sNative - * - * if (newLength < oldLength) return Clazz.array(-1, array, 0, newLength); - */ - {} - byte[] t = new byte[newLength]; - if (array != null) { - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - } - return t; - } - - public static boolean[] arrayCopyBool(boolean[] array, int newLength) { - int oldLength = (array == null ? -1 : array.length); - if (newLength < 0) newLength = oldLength; - /** - * @j2sNative - * - * if (newLength < oldLength) return Clazz.array(-1, array, 0, newLength); - */ - {} - boolean[] t = new boolean[newLength]; - if (array != null) { - System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength - : newLength); - } - return t; - } - - public static void swapInt(int[] array, int indexA, int indexB) { - int t = array[indexA]; - array[indexA] = array[indexB]; - array[indexB] = t; - } - - /* - public static void swap(short[] array, int indexA, int indexB) { - short t = array[indexA]; - array[indexA] = array[indexB]; - array[indexB] = t; - } - - public static void swap(float[] array, int indexA, int indexB) { - float t = array[indexA]; - array[indexA] = array[indexB]; - array[indexB] = t; - } - */ - - public static String dumpArray(String msg, float[][] A, int x1, int x2, int y1, int y2) { - String s = "dumpArray: " + msg + "\n"; - for (int x = x1; x <= x2; x++) - s += "\t*" + x + "*"; - for (int y = y2; y >= y1; y--) { - s += "\n*" + y + "*"; - for (int x = x1; x <= x2; x++) - s += "\t" + (x < A.length && y < A[x].length ? A[x][y] : Float.NaN); - } - return s; - } - - public static String dumpIntArray(int[] A, int n) { - String str = ""; - for (int i = 0; i < n; i++) - str += " " + A[i]; - return str; - } - - public static String sortedItem(Lst v, int n) { - if (v.size() == 0) - return null; - if (v.size() == 1) - return v.get(0); - String[] keys = v.toArray(new String[v.size()]); - Arrays.sort(keys); - return keys[n % keys.length]; - } - - /** - * Helper method for creating a List[] without warnings. - * - * @param Type of objects in the list. - * @param size Array size. - * @return Array of List - */ - @SuppressWarnings("unchecked") - public static Lst[] createArrayOfArrayList(int size) { - return new Lst[size]; - } - - /** - * Helper method for creating a Map[] without warnings. - * - * @param Type of object for the keys in the map. - * @param Type of object for the values in the map. - * @param size Array size. - * @return Array of Map - */ - @SuppressWarnings("unchecked") - public static Map[] createArrayOfHashtable(int size) { - return new Hashtable[size]; - } - - public static void swap(Object[] o, int i, int j) { - Object oi = o[i]; - o[i] = o[j]; - o[j] = oi; - } - - public static float[][] newFloat2(int n) { - return new float[n][]; - } - - public static boolean[][] newBool2(int n) { - return new boolean[n][]; - } - - public static int[][] newInt2(int n) { - return new int[n][]; - } - - public static int[][][] newInt3(int nx, int ny) { - return (ny < 0 ? new int[nx][][] : new int[nx][ny][]); - } - - public static float[][][] newFloat3(int nx, int ny) { - return (ny < 0 ? new float[nx][][] : new float[nx][ny][]); - } - - public static int[][][][] newInt4(int n) { - return new int[n][][][]; - } - - public static short[][] newShort2(int n) { - return new short[n][]; - } - - public static byte[][] newByte2(int n) { - return new byte[n][]; - } - - public static double[][] newDouble2(int n) { - return new double[n][]; - } - - /** - * remove all keys from a map that start with given root - * @param map - * @param root - * @return number removed - */ - public static int removeMapKeys(Map map, String root) { - Lst list = new Lst(); - for (String key: map.keySet()) - if (key.startsWith(root)) - list.addLast(key); - for (int i = list.size(); --i >= 0;) - map.remove(list.get(i)); - return list.size(); - } - - public static boolean isAS(Object x) { - return x instanceof String[]; - } - - public static boolean isASS(Object x) { - return x instanceof String[][]; - } - - public static boolean isAP(Object x) { - return x instanceof T3[]; - } - - public static boolean isAF(Object x) { - return x instanceof float[]; - } - - public static boolean isAFloat(Object x) { - return x instanceof Float[]; - } - - public static boolean isAD(Object x) { - return x instanceof double[]; - } - - public static boolean isADD(Object x) { - return x instanceof double[][]; - } - - public static boolean isAB(Object x) { - return x instanceof byte[]; - } - - public static boolean isAI(Object x) { - return x instanceof int[]; - } - - public static boolean isAII(Object x) { - return (x instanceof int[][]); - } - - public static boolean isAFF(Object x) { - return x instanceof float[][]; - } - - public static boolean isAFFF(Object x) { - return x instanceof float[][][]; - } - - /** - * Ensure that we have signed and not unsigned bytes coming out of any - * process, but particularly out of file reading. - * - * @param b - * @return b - */ - public static byte[] ensureSignedBytes(byte[] b) { - if (b != null) { - /** - * @j2sNative - * - * for (var i = b.length; --i >= 0;) { var j = b[i] & - * 0xFF; if (j >= 0x80) j -= 0x100; b[i] = j; } - * - */ - { - } - } - return b; - } - - -} diff --git a/src2/javajs/util/AjaxURLConnection.java b/src2/javajs/util/AjaxURLConnection.java deleted file mode 100644 index 0b038c3..0000000 --- a/src2/javajs/util/AjaxURLConnection.java +++ /dev/null @@ -1,120 +0,0 @@ -package javajs.util; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; - -import javajs.api.js.J2SObjectInterface; - -/** - * - * A method to allow a JavaScript Ajax - * - */ -public class AjaxURLConnection extends URLConnection { - - protected AjaxURLConnection(URL url) { - super(url); - } - - byte[] bytesOut; - String postOut = ""; - - /** - * - * doAjax() is where the synchronous call to AJAX is to happen. or at least - * where we wait for the asynchronous call to return. This method should fill - * the dataIn field with either a string or byte array, or null if you want to - * throw an error. - * - * url, bytesOut, and postOut are all available for use - * - * the method is "private", but in JavaScript that can still be overloaded. - * Just set something to org.jmol.awtjs.JmolURLConnection.prototype.doAjax - * - * - * @param isBinary - * - * @return file data as a javajs.util.SB or byte[] depending upon the file - * type. - * - * - */ - @SuppressWarnings("null") - private Object doAjax(boolean isBinary) { - J2SObjectInterface j2s = null; - /** - * @j2sNative - * - * j2s = J2S; - * - */ - { - } - return j2s._doAjax(url, postOut, bytesOut, isBinary); - } - - @Override - public void connect() throws IOException { - // not expected to be used. - } - - public void outputBytes(byte[] bytes) { - // type = "application/octet-stream;"; - bytesOut = bytes; - } - - public void outputString(String post) { - postOut = post; - // type = "application/x-www-form-urlencoded"; - } - - @Override - public InputStream getInputStream() { - BufferedInputStream is = getAttachedStreamData(url, false); - return (is == null ? attachStreamData(url, doAjax(true)) : is); - } - - /** - * J2S will attach the data (String, SB, or byte[]) to any URL that is - * retrieved using a ClassLoader. This improves performance by - * not going back to the server every time a second time, since - * the first time in Java is usually just to see if it exists. - * - * @param url - * @return String, SB, or byte[] - */ - public static BufferedInputStream getAttachedStreamData(URL url, boolean andDelete) { - - Object data = null; - /** - * @j2sNative - * - * data = url._streamData; - * if (andDelete) url._streamData = null; - */ - { - } - return (data == null ? null : Rdr.toBIS(data)); - } - - public static BufferedInputStream attachStreamData(URL url, Object o) { - /** - * @j2sNative - * - * url._streamData = o; - */ - - return (o == null ? null : Rdr.toBIS(o)); - } - - /** - * @return javajs.util.SB or byte[], depending upon the file type - */ - public Object getContents() { - return doAjax(false); - } - -} diff --git a/src2/javajs/util/AjaxURLStreamHandler.java b/src2/javajs/util/AjaxURLStreamHandler.java deleted file mode 100644 index 3d6d4d7..0000000 --- a/src2/javajs/util/AjaxURLStreamHandler.java +++ /dev/null @@ -1,53 +0,0 @@ -package javajs.util; - -import java.io.IOException; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLStreamHandler; - - - -/** - * - * A method to allow a JavaScript AJAX adapter to - * deliver web content to JSmol. This handler is just a formality. - * - */ -public class AjaxURLStreamHandler extends URLStreamHandler { - - String protocol; - - public AjaxURLStreamHandler(String protocol) { - this.protocol = protocol; - } - - @Override - protected URLConnection openConnection(URL url) throws IOException { - return new AjaxURLConnection(url); - } - - - @Override - protected String toExternalForm(URL u) { - SB result = new SB(); - result.append(u.getProtocol()); - result.append(":"); - if (u.getAuthority() != null && u.getAuthority().length() > 0) { - result.append("//"); - result.append(u.getAuthority()); - } - if (u.getPath() != null) { - result.append(u.getPath()); - } - if (u.getQuery() != null) { - result.append("?"); - result.append(u.getQuery()); - } - if (u.getRef() != null) { - result.append("#"); - result.append(u.getRef()); - } - return result.toString(); - } - -} diff --git a/src2/javajs/util/AjaxURLStreamHandlerFactory.java b/src2/javajs/util/AjaxURLStreamHandlerFactory.java deleted file mode 100644 index ef903a2..0000000 --- a/src2/javajs/util/AjaxURLStreamHandlerFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -package javajs.util; - -import java.net.URLStreamHandler; -import java.net.URLStreamHandlerFactory; -import java.util.Hashtable; -import java.util.Map; - - -/** - * - * For handling URL file IO via AJAX in JavaScript version - * - */ - -public class AjaxURLStreamHandlerFactory implements URLStreamHandlerFactory { - - Map htFactories = new Hashtable(); - - public AjaxURLStreamHandlerFactory() { - // for reflection; - } - - @Override - public URLStreamHandler createURLStreamHandler(String protocol) { - AjaxURLStreamHandler fac = htFactories.get(protocol); - if (fac == null) - htFactories.put(protocol, fac = new AjaxURLStreamHandler(protocol)); - return (fac.protocol == null ? null : fac); - } - -} diff --git a/src2/javajs/util/ArrayDataReader.java b/src2/javajs/util/ArrayDataReader.java deleted file mode 100644 index 737a6ab..0000000 --- a/src2/javajs/util/ArrayDataReader.java +++ /dev/null @@ -1,57 +0,0 @@ -package javajs.util; - -import java.io.IOException; - - - - - - -/** - * - * ArrayDataReader subclasses BufferedReader and overrides its - * read, readLine, mark, and reset methods so that JmolAdapter - * works with String[] arrays without any further adaptation. - * - */ - -public class ArrayDataReader extends DataReader { - private String[] data; - private int pt; - private int len; - - public ArrayDataReader() { - super(); - } - - @Override - public DataReader setData(Object data) { - this.data = (String[]) data; - len = this.data.length; - return this; - } - - @Override - public int read(char[] buf, int off, int len) throws IOException { - return readBuf(buf, off, len); - } - - @Override - public String readLine() { - return (pt < len ? data[pt++] : null); - } - - /** - * - * @param ptr - */ - public void mark(long ptr) { - //ignore ptr. - ptMark = pt; - } - - @Override - public void reset() { - pt = ptMark; - } -} \ No newline at end of file diff --git a/src2/javajs/util/BArray.java b/src2/javajs/util/BArray.java deleted file mode 100644 index f09d272..0000000 --- a/src2/javajs/util/BArray.java +++ /dev/null @@ -1,33 +0,0 @@ -package javajs.util; - -public class BArray { - public byte[] data; - - public BArray(byte[] data) { - this.data = data; - } - - @Override - public boolean equals(Object o) { - if (o instanceof BArray) { - byte[] d = ((BArray) o).data; - if (d.length == data.length){ - for (int i = 0; i < d.length; i++) - if (d[i] != data[i]) - return false; - return true; - } - } - return false; - } - - @Override - public int hashCode() { - return data.hashCode(); - } - - @Override - public String toString() { - return new String(data); - } -} diff --git a/src2/javajs/util/BC.java b/src2/javajs/util/BC.java deleted file mode 100644 index 5722efd..0000000 --- a/src2/javajs/util/BC.java +++ /dev/null @@ -1,186 +0,0 @@ -package javajs.util; - -/** - * byte converter - * - * - * @author Bob Hanson hansonr@stolaf.edu - * - */ -public class BC { - - public BC() { - // unnecessary to instantialize unless subclassed - } - - public static float bytesToFloat(byte[] bytes, int j, boolean isBigEndian) throws Exception { - return intToFloat(bytesToInt(bytes, j, isBigEndian)); - } - - public static int bytesToShort(byte[] bytes, int j, boolean isBigEndian) { - int n = (isBigEndian ? (bytes[j + 1] & 0xff) | (bytes[j] & 0xff) << 8 - : (bytes[j++] & 0xff) | (bytes[j++] & 0xff) << 8); - return (n > 0x7FFF ? n - 0x10000 : n); - } - - public static int bytesToInt(byte[] bytes, int j, boolean isBigEndian) { - int n = (isBigEndian ? (bytes[j + 3] & 0xff) | (bytes[j + 2] & 0xff) << 8 - | (bytes[j + 1] & 0xff) << 16 | (bytes[j] & 0xff) << 24 - : (bytes[j++] & 0xff) | (bytes[j++] & 0xff) << 8 - | (bytes[j++] & 0xff) << 16 | (bytes[j++] & 0xff) << 24); - /** - * @j2sNative - * - * return (n > 0x7FFFFFFF ? n - 0x100000000 : n); - * - */ - { - return n; - } - } - - public static int intToSignedInt(int n) { - /** - * @j2sNative - * - * return (n > 0x7FFFFFFF ? n - 0x100000000 : n); - * - */ - { - return n; - } - } - public static float intToFloat(int x) throws Exception { - /** - * see http://en.wikipedia.org/wiki/Binary32 - * - * [sign] [8 bits power] [23 bits fraction] - * 0x80000000 0x7F800000 0x7FFFFF - * - * (untested) - * - * @j2sNative - * - * if (x == 0) return 0; - * var o = javajs.util.BC; - * if (o.fracIEEE == null) - * o.setFracIEEE(); - * var m = ((x & 0x7F800000) >> 23); - * return ((x & 0x80000000) == 0 ? 1 : -1) * o.shiftIEEE$D$I((x & 0x7FFFFF) | 0x800000, m - 149); - * - */ - { - return Float.intBitsToFloat(x); - } - } - - /** - * see http://en.wikipedia.org/wiki/Binary64 - * - * not concerning ourselves with very small or very large numbers and getting - * this exactly right. Just need a float here. - * - * @param bytes - * @param j - * @param isBigEndian - * @return float - */ - public static float bytesToDoubleToFloat(byte[] bytes, int j, boolean isBigEndian) { - { - // IEEE754: sign (1 bit), exponent (11 bits), fraction (52 bits). - // seeeeeee eeeeffff ffffffff ffffffff ffffffff xxxxxxxx xxxxxxxx xxxxxxxx - // b1 b2 b3 b4 b5 ---------float ignores---- - - if (fracIEEE == null) - setFracIEEE(); - - /** - * @j2sNative - * var b1, b2, b3, b4, b5; - * - * if (isBigEndian) { - * b1 = bytes[j] & 0xFF; - * b2 = bytes[j + 1] & 0xFF; - * b3 = bytes[j + 2] & 0xFF; - * b4 = bytes[j + 3] & 0xFF; - * b5 = bytes[j + 4] & 0xFF; - * } else { - * b1 = bytes[j + 7] & 0xFF; - * b2 = bytes[j + 6] & 0xFF; - * b3 = bytes[j + 5] & 0xFF; - * b4 = bytes[j + 4] & 0xFF; - * b5 = bytes[j + 3] & 0xFF; - * } - * var s = ((b1 & 0x80) == 0 ? 1 : -1); - * var e = (((b1 & 0x7F) << 4) | (b2 >> 4)) - 1026; - * b2 = (b2 & 0xF) | 0x10; - * return s * (C$.shiftIEEE$D$I(b2, e) +C$.shiftIEEE$D$I(b3, e - 8) + C$.shiftIEEE$D$I(b4, e - 16) - * + C$.shiftIEEE$D$I(b5, e - 24)); - */ - { - double d; - - if (isBigEndian) - d = Double.longBitsToDouble((((long) bytes[j]) & 0xff) << 56 - | (((long) bytes[j + 1]) & 0xff) << 48 - | (((long) bytes[j + 2]) & 0xff) << 40 - | (((long) bytes[j + 3]) & 0xff) << 32 - | (((long) bytes[j + 4]) & 0xff) << 24 - | (((long) bytes[j + 5]) & 0xff) << 16 - | (((long) bytes[j + 6]) & 0xff) << 8 - | (((long) bytes[7]) & 0xff)); - else - d = Double.longBitsToDouble((((long) bytes[j + 7]) & 0xff) << 56 - | (((long) bytes[j + 6]) & 0xff) << 48 - | (((long) bytes[j + 5]) & 0xff) << 40 - | (((long) bytes[j + 4]) & 0xff) << 32 - | (((long) bytes[j + 3]) & 0xff) << 24 - | (((long) bytes[j + 2]) & 0xff) << 16 - | (((long) bytes[j + 1]) & 0xff) << 8 - | (((long) bytes[j]) & 0xff)); - return (float) d; - } - - } - } - - private static float[] fracIEEE; - - private static void setFracIEEE() { - fracIEEE = new float[270]; - for (int i = 0; i < 270; i++) - fracIEEE[i] = (float) Math.pow(2, i - 141); - // System.out.println(fracIEEE[0] + " " + Parser.FLOAT_MIN_SAFE); - // System.out.println(fracIEEE[269] + " " + Float.MAX_VALUE); - } - - /** - * only concerned about reasonable float values here -- private but not designated; called by JavaScript - * - * @param f - * @param i - * @return f * 2^i - */ - static double shiftIEEE(double f, int i) { - if (f == 0 || i < -140) - return 0; - if (i > 128) - return Float.MAX_VALUE; - return f * fracIEEE[i + 140]; - } - -// static { -// setFracIEEE(); -// for (int i = -50; i < 50; i++) { -// float f = i * (float) (Math.random() * Math.pow(2, Math.random() * 100 - 50)); -// int x = Float.floatToIntBits(f); -// int m = ((x & 0x7F800000) >> 23); -// float f1 = (float) (f == 0 ? 0 : ((x & 0x80000000) == 0 ? 1 : -1) * shiftIEEE((x & 0x7FFFFF) | 0x800000, m - 149)); -// System.out.println(f + " " + f1); -// } -// System.out.println("binarydo"); -// } - - - -} diff --git a/src2/javajs/util/BS.java b/src2/javajs/util/BS.java deleted file mode 100644 index 1f3aaa4..0000000 --- a/src2/javajs/util/BS.java +++ /dev/null @@ -1,960 +0,0 @@ -/* - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package javajs.util; - -import javajs.api.JSONEncodable; - - - -/** - * - * a fast 32-bit BitSet optimized for Java2Script -- about 25 times faster than - * java.util.BitSet - * - * @author Bob Hanson hansonr@stolaf.edu - * - * Additions by Bob Hanson to allow for JavaScript mix of int/long Note - * that Firefox (Sept 2012) does not really treat "Int32Array" as such, - * because any element can be pushed into being a 64-bit number, which - * really isn't because the last 8 bits are not usable. - * - * This class implements a vector of bits that grows as needed. Each - * component of the bit set has a {@code boolean} value. The bits of a - * {@code BitSet} are indexed by nonnegative integers. Individual - * indexed bits can be examined, set, or cleared. One {@code BitSet} may - * be used to modify the contents of another {@code BitSet} through - * logical AND, logical inclusive OR, and logical exclusive OR - * operations. - * - *

- * By default, all bits in the set initially have the value {@code - * false}. - * - *

- * Every bit set has a current size, which is the number of bits of - * space currently in use by the bit set. Note that the size is related - * to the implementation of a bit set, so it may change with - * implementation. The length of a bit set relates to logical length of - * a bit set and is defined independently of implementation. - * - *

- * Unless otherwise noted, passing a null parameter to any of the - * methods in a {@code BitSet} will result in a {@code - * NullPointerException}. - * - *

- * A {@code BitSet} is not safe for multithreaded use without external - * synchronization. - * - * @author Arthur van Hoff - * @author Michael McCloskey - * @author Martin Buchholz - * @since JDK1.0 - */ -public class BS implements Cloneable, JSONEncodable { - /* - * BitSets are packed into arrays of "words." - * - * An int, which consists of 32 bits, requiring 5 address bits, is used for - * the JavaScript port. - */ - private final static int ADDRESS_BITS_PER_WORD = 5; - private final static int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD; - protected final static int BIT_INDEX_MASK = BITS_PER_WORD - 1; - - /* Used to shift left or right for a partial word mask */ - protected static final int WORD_MASK = 0xffffffff; - - - /** - * The internal field corresponding to the serialField "bits". - */ - protected int[] words; - - /** - * The number of words in the logical size of this BitSet. - */ - protected transient int wordsInUse = 0; - - /** - * Whether the size of "words" is user-specified. If so, we assume the user - * knows what he's doing and try harder to preserve it. - */ - private transient boolean sizeIsSticky = false; - - /* use serialVersionUID from JDK 1.0.2 for interoperability */ - //private static final long serialVersionUID = 7997698588986878753L; - - /** - * Given a bit index, return word index containing it. - * @param bitIndex - * @return b - */ - protected static int wordIndex(int bitIndex) { - return bitIndex >> ADDRESS_BITS_PER_WORD; - } - - /** - * Sets the field wordsInUse to the logical size in words of the bit set. - * WARNING:This method assumes that the number of words actually in use is - * less than or equal to the current value of wordsInUse! - */ - protected void recalculateWordsInUse() { - // Traverse the bitset until a used word is found - int i; - for (i = wordsInUse - 1; i >= 0; i--) - if (words[i] != 0) - break; - - wordsInUse = i + 1; // The new logical size - } - - /** - * Creates a new bit set. All bits are initially {@code false}. - */ - public BS() { - initWords(BITS_PER_WORD); - sizeIsSticky = false; - } - - /** - * Creates a bit set whose initial size is large enough to explicitly - * represent bits with indices in the range {@code 0} through {@code nbits-1}. - * All bits are initially {@code false}. - * - * @param nbits - * the initial size of the bit set - * @return bs - * @throws NegativeArraySizeException - * if the specified initial size is negative - */ - public static BS newN(int nbits) { - BS bs = new BS(); - bs.init(nbits); - return bs; - } - - protected void init(int nbits) { - // nbits can't be negative; size 0 is OK - if (nbits < 0) - throw new NegativeArraySizeException("nbits < 0: " + nbits); - initWords(nbits); - sizeIsSticky = true; - } - - private void initWords(int nbits) { - words = new int[wordIndex(nbits - 1) + 1]; - } - - /** - * Ensures that the BitSet can hold enough words. - * - * @param wordsRequired - * the minimum acceptable number of words. - */ - private void ensureCapacity(int wordsRequired) { - if (words.length < wordsRequired) { - // Allocate larger of doubled size or required size - int request = Math.max(2 * words.length, wordsRequired); - setLength(request); - sizeIsSticky = false; - } - } - - /** - * Ensures that the BitSet can accommodate a given wordIndex, temporarily - * violating the invariants. The caller must restore the invariants before - * returning to the user, possibly using recalculateWordsInUse(). - * - * @param wordIndex - * the index to be accommodated. - */ - protected void expandTo(int wordIndex) { - int wordsRequired = wordIndex + 1; - if (wordsInUse < wordsRequired) { - ensureCapacity(wordsRequired); - wordsInUse = wordsRequired; - } - } - - - /** - * Sets the bit at the specified index to {@code true}. - * - * @param bitIndex - * a bit index - * @throws IndexOutOfBoundsException - * if the specified index is negative - * @since JDK1.0 - */ - public void set(int bitIndex) { - if (bitIndex < 0) - throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex); - - int wordIndex = wordIndex(bitIndex); - expandTo(wordIndex); - - words[wordIndex] |= (1 << bitIndex); // Restores invariants - - } - - /** - * Sets the bit at the specified index to the specified value. - * - * @param bitIndex - * a bit index - * @param value - * a boolean value to set - * @throws IndexOutOfBoundsException - * if the specified index is negative - * @since 1.4 - */ - public void setBitTo(int bitIndex, boolean value) { - if (value) - set(bitIndex); - else - clear(bitIndex); - } - - /** - * Sets the bits from the specified {@code fromIndex} (inclusive) to the - * specified {@code toIndex} (exclusive) to {@code true}. - * - * @param fromIndex - * index of the first bit to be set - * @param toIndex - * index after the last bit to be set - * @throws IndexOutOfBoundsException - * if {@code fromIndex} is negative, or {@code toIndex} is negative, - * or {@code fromIndex} is larger than {@code toIndex} - * @since 1.4 - */ - public void setBits(int fromIndex, int toIndex) { - - if (fromIndex == toIndex) - return; - - // Increase capacity if necessary - int startWordIndex = wordIndex(fromIndex); - int endWordIndex = wordIndex(toIndex - 1); - expandTo(endWordIndex); - - int firstWordMask = WORD_MASK << fromIndex; - int lastWordMask = WORD_MASK >>> -toIndex; - if (startWordIndex == endWordIndex) { - // Case 1: One word - words[startWordIndex] |= (firstWordMask & lastWordMask); - } else { - // Case 2: Multiple words - // Handle first word - words[startWordIndex] |= firstWordMask; - - // Handle intermediate words, if any - for (int i = startWordIndex + 1; i < endWordIndex; i++) - words[i] = WORD_MASK; - - // Handle last word (restores invariants) - words[endWordIndex] |= lastWordMask; - } - } - - /** - * Sets the bit specified by the index to {@code false}. - * - * @param bitIndex - * the index of the bit to be cleared - * @throws IndexOutOfBoundsException - * if the specified index is negative - * @since JDK1.0 - */ - public void clear(int bitIndex) { - if (bitIndex < 0) - throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex); - - int wordIndex = wordIndex(bitIndex); - if (wordIndex >= wordsInUse) - return; - - words[wordIndex] &= ~(1 << bitIndex); - - recalculateWordsInUse(); - } - - /** - * Sets the bits from the specified {@code fromIndex} (inclusive) to the - * specified {@code toIndex} (exclusive) to {@code false}. - * - * @param fromIndex - * index of the first bit to be cleared - * @param toIndex - * index after the last bit to be cleared - * @throws IndexOutOfBoundsException - * if {@code fromIndex} is negative, or {@code toIndex} is negative, - * or {@code fromIndex} is larger than {@code toIndex} - * @since 1.4 - */ - public void clearBits(int fromIndex, int toIndex) { - if (fromIndex == toIndex) - return; - - int startWordIndex = wordIndex(fromIndex); - if (startWordIndex >= wordsInUse) - return; - - int endWordIndex = wordIndex(toIndex - 1); - if (endWordIndex >= wordsInUse) { - toIndex = length(); - endWordIndex = wordsInUse - 1; - } - - int firstWordMask = WORD_MASK << fromIndex; - int lastWordMask = WORD_MASK >>> -toIndex; - if (startWordIndex == endWordIndex) { - // Case 1: One word - words[startWordIndex] &= ~(firstWordMask & lastWordMask); - } else { - // Case 2: Multiple words - // Handle first word - words[startWordIndex] &= ~firstWordMask; - - // Handle intermediate words, if any - for (int i = startWordIndex + 1; i < endWordIndex; i++) - words[i] = 0; - - // Handle last word - words[endWordIndex] &= ~lastWordMask; - } - - recalculateWordsInUse(); - } - - /** - * Sets all of the bits in this BitSet to {@code false}. - * - * @since 1.4 - */ - public void clearAll() { - while (wordsInUse > 0) - words[--wordsInUse] = 0; - } - - /** - * Returns the value of the bit with the specified index. The value is {@code - * true} if the bit with the index {@code bitIndex} is currently set in this - * {@code BitSet}; otherwise, the result is {@code false}. - * - * @param bitIndex - * the bit index - * @return the value of the bit with the specified index - * @throws IndexOutOfBoundsException - * if the specified index is negative - */ - public boolean get(int bitIndex) { - if (bitIndex < 0) - throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex); - - int wordIndex = wordIndex(bitIndex); - return (wordIndex < wordsInUse) - && ((words[wordIndex] & (1 << bitIndex)) != 0); - } - - /** - * Returns the index of the first bit that is set to {@code true} that occurs - * on or after the specified starting index. If no such bit exists then - * {@code -1} is returned. - * - *

- * To iterate over the {@code true} bits in a {@code BitSet}, use the - * following loop: - * - *

-   * @code
-   * for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
-   *     // operate on index i here
-   * }}
-   * 
- * - * @param fromIndex - * the index to start checking from (inclusive) - * @return the index of the next set bit, or {@code -1} if there is no such - * bit - * @throws IndexOutOfBoundsException - * if the specified index is negative - * @since 1.4 - */ - public int nextSetBit(int fromIndex) { - if (fromIndex < 0) - throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex); - - int u = wordIndex(fromIndex); - if (u >= wordsInUse) - return -1; - - int word = words[u] & (WORD_MASK << fromIndex); - - while (true) { - if (word != 0) - return (u * BITS_PER_WORD) + Integer.numberOfTrailingZeros(word); - if (++u == wordsInUse) - return -1; - word = words[u]; - } - } - - /** - * Returns the index of the first bit that is set to {@code false} that occurs - * on or after the specified starting index. - * - * @param fromIndex - * the index to start checking from (inclusive) - * @return the index of the next clear bit - * @throws IndexOutOfBoundsException - * if the specified index is negative - * @since 1.4 - */ - public int nextClearBit(int fromIndex) { - // Neither spec nor implementation handle bitsets of maximal length. - // See 4816253. - if (fromIndex < 0) - throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex); - - int u = wordIndex(fromIndex); - if (u >= wordsInUse) - return fromIndex; - - int word = ~words[u] & (WORD_MASK << fromIndex); - - while (true) { - if (word != 0) - return (u * BITS_PER_WORD) + Integer.numberOfTrailingZeros(word); - if (++u == wordsInUse) - return wordsInUse * BITS_PER_WORD; - word = ~words[u]; - } - } - - /** - * Returns the "logical size" of this {@code BitSet}: the index of the highest - * set bit in the {@code BitSet} plus one. Returns zero if the {@code BitSet} - * contains no set bits. - * - * @return the logical size of this {@code BitSet} - * @since 1.2 - */ - public int length() { - if (wordsInUse == 0) - return 0; - - return BITS_PER_WORD * (wordsInUse - 1) - + (BITS_PER_WORD - Integer.numberOfLeadingZeros(words[wordsInUse - 1])); - } - - /** - * Returns true if this {@code BitSet} contains no bits that are set to - * {@code true}. - * - * @return boolean indicating whether this {@code BitSet} is empty - * @since 1.4 - */ - public boolean isEmpty() { - return wordsInUse == 0; - } - - /** - * Returns true if the specified {@code BitSet} has any bits set to {@code - * true} that are also set to {@code true} in this {@code BitSet}. - * - * @param set - * {@code BitSet} to intersect with - * @return boolean indicating whether this {@code BitSet} intersects the - * specified {@code BitSet} - * @since 1.4 - */ - public boolean intersects(BS set) { - for (int i = Math.min(wordsInUse, set.wordsInUse) - 1; i >= 0; i--) - if ((words[i] & set.words[i]) != 0) - return true; - return false; - } - - /** - * Returns the number of bits set to {@code true} in this {@code BitSet}. - * - * @return the number of bits set to {@code true} in this {@code BitSet} - * @since 1.4 - */ - public int cardinality() { - int sum = 0; - for (int i = 0; i < wordsInUse; i++) - sum += Integer.bitCount(words[i]); - return sum; - } - - /** - * Performs a logical AND of this target bit set with the argument bit - * set. This bit set is modified so that each bit in it has the value {@code - * true} if and only if it both initially had the value {@code true} and the - * corresponding bit in the bit set argument also had the value {@code true}. - * - * @param set - * a bit set - */ - public void and(BS set) { - if (this == set) - return; - - while (wordsInUse > set.wordsInUse) - words[--wordsInUse] = 0; - - // Perform logical AND on words in common - for (int i = 0; i < wordsInUse; i++) - words[i] &= set.words[i]; - - recalculateWordsInUse(); - } - - /** - * Performs a logical OR of this bit set with the bit set argument. - * This bit set is modified so that a bit in it has the value {@code true} if - * and only if it either already had the value {@code true} or the - * corresponding bit in the bit set argument has the value {@code true}. - * - * @param set - * a bit set - */ - public void or(BS set) { - if (this == set) - return; - - int wordsInCommon = Math.min(wordsInUse, set.wordsInUse); - - if (wordsInUse < set.wordsInUse) { - ensureCapacity(set.wordsInUse); - wordsInUse = set.wordsInUse; - } - - // Perform logical OR on words in common - for (int i = 0; i < wordsInCommon; i++) - words[i] |= set.words[i]; - - // Copy any remaining words - if (wordsInCommon < set.wordsInUse) - System.arraycopy(set.words, wordsInCommon, words, wordsInCommon, - wordsInUse - wordsInCommon); - - } - - /** - * Performs a logical XOR of this bit set with the bit set argument. - * This bit set is modified so that a bit in it has the value {@code true} if - * and only if one of the following statements holds: - *
    - *
  • The bit initially has the value {@code true}, and the corresponding bit - * in the argument has the value {@code false}. - *
  • The bit initially has the value {@code false}, and the corresponding - * bit in the argument has the value {@code true}. - *
- * - * @param set - * a bit set - */ - public void xor(BS set) { - int wordsInCommon = Math.min(wordsInUse, set.wordsInUse); - - if (wordsInUse < set.wordsInUse) { - ensureCapacity(set.wordsInUse); - wordsInUse = set.wordsInUse; - } - - // Perform logical XOR on words in common - for (int i = 0; i < wordsInCommon; i++) - words[i] ^= set.words[i]; - - // Copy any remaining words - if (wordsInCommon < set.wordsInUse) - System.arraycopy(set.words, wordsInCommon, words, wordsInCommon, - set.wordsInUse - wordsInCommon); - - recalculateWordsInUse(); - } - - /** - * Clears all of the bits in this {@code BitSet} whose corresponding bit is - * set in the specified {@code BitSet}. - * - * @param set - * the {@code BitSet} with which to mask this {@code BitSet} - * @since 1.2 - */ - public void andNot(BS set) { - // Perform logical (a & !b) on words in common - for (int i = Math.min(wordsInUse, set.wordsInUse) - 1; i >= 0; i--) - words[i] &= ~set.words[i]; - - recalculateWordsInUse(); - } - - /** - * Returns a hash code value for this bit set. The hash code depends only on - * which bits have been set within this BitSet. The algorithm - * used to compute it may be described as follows. - *

- * Suppose the bits in the BitSet were to be stored in an array - * of long integers called, say, words, in such a - * manner that bit k is set in the BitSet (for - * nonnegative values of k) if and only if the expression - * - *

-   * ((k >> 6) < words.length) && ((words[k >> 6] & (1 << (bit & 0x3F))) != 0)
-   * 
- * - * is true. Then the following definition of the hashCode method - * would be a correct implementation of the actual algorithm: - * - *
-   * public int hashCode() {
-   *  long h = 1234;
-   *  for (int i = words.length; --i >= 0;) {
-   *    h ˆ= words[i] * (i + 1);
-   *  }
-   *  return (int) ((h >> 32) ˆ h);
-   * }
-   * 
- * - * Note that the hash code values change if the set of bits is altered. - *

- * Overrides the hashCode method of Object. - * - * @return a hash code value for this bit set. - */ - @Override - public int hashCode() { - long h = 1234; - for (int i = wordsInUse; --i >= 0;) - h ^= words[i] * (i + 1); - - return (int) ((h >> 32) ^ h); - } - - /** - * Returns the number of bits of space actually in use by this {@code BitSet} - * to represent bit values. The maximum element in the set is the size - 1st - * element. - * - * @return the number of bits currently in this bit set - */ - public int size() { - return words.length * BITS_PER_WORD; - } - - /** - * Compares this object against the specified object. The result is {@code - * true} if and only if the argument is not {@code null} and is a {@code - * Bitset} object that has exactly the same set of bits set to {@code true} as - * this bit set. That is, for every nonnegative {@code int} index {@code k}, - * - *

-   * ((BitSet) obj).get(k) == this.get(k)
-   * 
- * - * must be true. The current sizes of the two bit sets are not compared. - * - * @param obj - * the object to compare with - * @return {@code true} if the objects are the same; {@code false} otherwise - * @see #size() - */ - @Override - public boolean equals(Object obj) { - if (!(obj instanceof BS)) - return false; - if (this == obj) - return true; - - BS set = (BS) obj; - - if (wordsInUse != set.wordsInUse) - return false; - - // Check words in use by both BitSets - for (int i = 0; i < wordsInUse; i++) - if (words[i] != set.words[i]) - return false; - - return true; - } - - /** - * Cloning this {@code BitSet} produces a new {@code BitSet} that is equal to - * it. The clone of the bit set is another bit set that has exactly the same - * bits set to {@code true} as this bit set. - * - * @return a clone of this bit set - * @see #size() - */ - @Override - public Object clone() { - if (!sizeIsSticky && wordsInUse != words.length) - setLength(wordsInUse); - return copy(this); - } - - /** - * Attempts to reduce internal storage used for the bits in this bit set. - * Calling this method may, but is not required to, affect the value returned - * by a subsequent call to the {@link #size()} method. - * @param n - */ - private void setLength(int n) { - /** - * @j2sNative - * if (n == this.words.length) return; - * if (n == this.wordsInUse) { - * this.words = Clazz.array(-1, this.words, 0, n); - * return; - * } - */ - {} - int[] a = new int[n]; - System.arraycopy(words, 0, a, 0, wordsInUse); - words = a; - } - - /** - * Returns a string representation of this bit set. For every index for which - * this {@code BitSet} contains a bit in the set state, the decimal - * representation of that index is included in the result. Such indices are - * listed in order from lowest to highest, separated by ", " (a comma and - * a space) and surrounded by braces, resulting in the usual mathematical - * notation for a set of integers. - * - *

- * Example: - * - *

-   * BitSet drPepper = new BitSet();
-   * 
- * - * Now {@code drPepper.toString()} returns "{}". - *

- * - *

-   * drPepper.set(2);
-   * 
- * - * Now {@code drPepper.toString()} returns "{2}". - *

- * - *

-   * drPepper.set(4);
-   * drPepper.set(10);
-   * 
- * - * Now {@code drPepper.toString()} returns "{2, 4, 10}". - * - * @return a string representation of this bit set - */ - @Override - public String toString() { - return escape(this, '(', ')'); - } - - private final static int[] emptyBitmap = new int[0]; - - /** - * fast copy - * - * @param bitsetToCopy - * @return bs - */ - public static BS copy(BS bitsetToCopy) { - BS bs; - /** - * Clazz.clone will copy wordsInUse and sizeIsSticky, - * but just a pointer to the words array. - * - * @j2sNative - * - * bs = Clazz.clone(bitsetToCopy); - * - */ - { - bs = new BS(); - } - int wordCount = bitsetToCopy.wordsInUse; - if (wordCount == 0) { - bs.words = emptyBitmap; - } else { - - /** - * Clazz.clone will copy wordsInUse and sizeIsSticky, - * but just a pointer to the words array. - * - * @j2sNative - * - * bs.words = Clazz.array(-1, bitsetToCopy.words, 0, bs.wordsInUse = wordCount); - * - */ - { - bs.words = new int[bs.wordsInUse = wordCount]; - System.arraycopy(bitsetToCopy.words, 0, bs.words, 0, wordCount); - } - - } - return bs; - } - - /** - * - * @param max - * @return n bits below max - */ - public int cardinalityN(int max) { - int n = cardinality(); - for (int i = length(); --i >= max;) - if (get(i)) - n--; - return n; - } - - @Override - public String toJSON() { - - int numBits = (wordsInUse > 128 ? cardinality() : wordsInUse - * BITS_PER_WORD); - SB b = SB.newN(6 * numBits + 2); - b.appendC('['); - - int i = nextSetBit(0); - if (i != -1) { - b.appendI(i); - for (i = nextSetBit(i + 1); i >= 0; i = nextSetBit(i + 1)) { - int endOfRun = nextClearBit(i); - do { - b.append(", ").appendI(i); - } while (++i < endOfRun); - } - } - - b.appendC(']'); - return b.toString(); - } - - public static String escape(BS bs, char chOpen, char chClose) { - if (bs == null) - return chOpen + "{}" + chClose; - SB s = new SB(); - s.append(chOpen + "{"); - int imax = bs.length(); - int iLast = -1; - int iFirst = -2; - int i = -1; - while (++i <= imax) { - boolean isSet = bs.get(i); - if (i == imax || iLast >= 0 && !isSet) { - if (iLast >= 0 && iFirst != iLast) - s.append((iFirst == iLast - 1 ? " " : ":") + iLast); - if (i == imax) - break; - iLast = -1; - } - if (bs.get(i)) { - if (iLast < 0) { - s.append((iFirst == -2 ? "" : " ") + i); - iFirst = i; - } - iLast = i; - } - } - s.append("}").appendC(chClose); - return s.toString(); - } - - public static BS unescape(String str) { - char ch; - int len; - if (str == null || (len = (str = str.trim()).length()) < 4 - || str.equalsIgnoreCase("({null})") - || (ch = str.charAt(0)) != '(' && ch != '[' - || str.charAt(len - 1) != (ch == '(' ? ')' : ']') - || str.charAt(1) != '{' || str.indexOf('}') != len - 2) - return null; - len -= 2; - for (int i = len; --i >= 2;) - if (((ch = str.charAt(i)) < 48 || ch > 57) && ch != ' ' && ch != '\t' - && ch != ':') - return null; - int lastN = len; - while (48 <= (ch = str.charAt(--lastN)) && ch <= 57) { - // loop - } - if (++lastN == len) - lastN = 0; - else - try { - lastN = Integer.parseInt(str.substring(lastN, len)); - } catch (NumberFormatException e) { - return null; - } - BS bs = BS.newN(lastN); - lastN = -1; - int iPrev = -1; - int iThis = -2; - for (int i = 2; i <= len; i++) { - switch (ch = str.charAt(i)) { - case '\t': - case ' ': - case '}': - if (iThis < 0) - break; - if (iThis < lastN) - return null; - lastN = iThis; - if (iPrev < 0) - iPrev = iThis; - bs.setBits(iPrev, iThis + 1); - iPrev = -1; - iThis = -2; - break; - case ':': - iPrev = lastN = iThis; - iThis = -2; - break; - default: - if (48 <= ch && ch <= 57) { - if (iThis < 0) - iThis = 0; - iThis = (iThis * 10) + (ch - 48); - } - } - } - return (iPrev >= 0 ? null : bs); - } - -} diff --git a/src2/javajs/util/Base64.java b/src2/javajs/util/Base64.java deleted file mode 100644 index a7ac3a9..0000000 --- a/src2/javajs/util/Base64.java +++ /dev/null @@ -1,120 +0,0 @@ -// Version 1.0a -// Copyright (C) 1998, James R. Weeks and BioElectroMech. -// Visit BioElectroMech at www.obrador.com. Email James@obrador.com. - -// See license.txt for details about the allowed used of this software. -// This software is based in part on the work of the Independent JPEG Group. -// See IJGreadme.txt for details about the Independent JPEG Group's license. - -// This encoder is inspired by the Java Jpeg encoder by Florian Raemy, -// studwww.eurecom.fr/~raemy. -// It borrows a great deal of code and structure from the Independent -// Jpeg Group's Jpeg 6a library, Copyright Thomas G. Lane. -// See license.txt for details. - -package javajs.util; - - -public class Base64 { - - // 0 1 2 3 4 5 6 - // 0123456789012345678901234567890123456789012345678901234567890123 - private static String base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - // 41----------------------5A - // 61----------------------7A - // 30------39 - // 2B - // 2F - // alternative "URL-SAFE" 2D and 5F -_ - - private static int[] decode64 = new int[] { - 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, //0x00-0x0F - 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, //0x10-0x1F - 0,0,0,0, 0,0,0,0, 0,0,0,62, 0,62,0,63, //0x20-0x2F - 52,53,54,55, 56,57,58,59, 60,61,0,0, 0,0,0,0, //0x30-0x3F - 0,0,1,2, 3,4,5,6, 7,8,9,10, 11,12,13,14, //0x40-0x4F - 15,16,17,18, 19,20,21,22, 23,24,25,0, 0,0,0,63, //0x50-0x5F - 0,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, //0x60-0x6F - 41,42,43,44, 45,46,47,48, 49,50,51,0, 0,0,0,0, //0x70-0x7F - }; - -// public static void write(byte[] bytes, OutputChannel out) { -// SB sb = getBase64(bytes); -// int len = sb.length(); -// byte[] b = new byte[1]; -// for (int i = 0; i < len; i++) { -// b[0] = (byte) sb.charAt(i); -// out.write(b, 0, 1); -// } -// } - - public static byte[] getBytes64(byte[] bytes) { - return getBase64(bytes).toBytes(0, -1); - } - - /** - * - * @param bytes - * @return BASE64-encoded string, without ";base64," - */ - public static SB getBase64(byte[] bytes) { - long nBytes = bytes.length; - SB sout = new SB(); - if (nBytes == 0) - return sout; - for (int i = 0, nPad = 0; i < nBytes && nPad == 0;) { - if (i % 75 == 0 && i != 0) - sout.append("\r\n"); - nPad = (i + 2 == nBytes ? 1 : i + 1 == nBytes ? 2 : 0); - int outbytes = ((bytes[i++] << 16) & 0xFF0000) - | ((nPad == 2 ? 0 : bytes[i++] << 8) & 0x00FF00) - | ((nPad >= 1 ? 0 : (int) bytes[i++]) & 0x0000FF); - //System.out.println(Integer.toHexString(outbytes)); - sout.appendC(base64.charAt((outbytes >> 18) & 0x3F)); - sout.appendC(base64.charAt((outbytes >> 12) & 0x3F)); - sout.appendC(nPad == 2 ? '=' : base64.charAt((outbytes >> 6) & 0x3F)); - sout.appendC(nPad >= 1 ? '=' : base64.charAt(outbytes & 0x3F)); - } - return sout; - } - - //Note: Just a simple decoder here. Nothing fancy at all - // Because of the 0s in decode64, this is not a VERIFIER - // Rather, it may decode even bad Base64-encoded data - // - // Bob Hanson 4/2007 - - public static byte[] decodeBase64(String strBase64) { - int nBytes = 0; - int ch; - int pt0 = strBase64.indexOf(";base64,") + 1; - if (pt0 > 0) - pt0 += 7; - char[] chars64 = strBase64.toCharArray(); - int len64 = chars64.length; - if (len64 == 0) - return new byte[0]; - for (int i = len64; --i >= pt0;) - nBytes += ((ch = chars64[i] & 0x7F) == 'A' || decode64[ch] > 0 ? 3 : 0); - nBytes = nBytes >> 2; - byte[] bytes = new byte[nBytes]; - int offset = 18; - for (int i = pt0, pt = 0, b = 0; i < len64; i++) { - if (decode64[ch = chars64[i] & 0x7F] > 0 || ch == 'A' || ch == '=') { - b |= decode64[ch] << offset; - //System.out.println(chars64[i] + " " + decode64[ch] + " " + offset + " " + Integer.toHexString(b)); - offset -= 6; - if (offset < 0) { - bytes[pt++] = (byte) ((b & 0xFF0000) >> 16); - if (pt < nBytes) - bytes[pt++] = (byte) ((b & 0xFF00) >> 8); - if (pt < nBytes) - bytes[pt++] = (byte) (b & 0xFF); - offset = 18; - b = 0; - } - } - } - return bytes; - } -} \ No newline at end of file diff --git a/src2/javajs/util/BinaryDocument.java b/src2/javajs/util/BinaryDocument.java deleted file mode 100644 index 73ec57b..0000000 --- a/src2/javajs/util/BinaryDocument.java +++ /dev/null @@ -1,356 +0,0 @@ -/* $RCSfile$ - * $Date: 2006-03-18 15:59:33 -0600 (Sat, 18 Mar 2006) $ - * $Revision: 4652 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2003-2005 Miguel, Jmol Development, www.jmol.org - * - * Contact: hansonr@stolaf.edu - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.util; - - -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.util.Map; - -import javajs.api.GenericBinaryDocument; -import javajs.api.GenericOutputChannel; - -/* a basic binary file reader (extended by CompoundDocument). - * - * Note that YOU are responsible for determining whether a file - * is bigEndian or littleEndian; the default is bigEndian. - * - * JavaScript note: readShort() malfunctioned because (short) (xx << 8) - * isn't the same as (int) (xx << 8); same problem in java.io.DataStream - * - * - */ - -public class BinaryDocument extends BC implements GenericBinaryDocument { - - public BinaryDocument() { - } - - - // called by reflection - - protected DataInputStream stream; - protected boolean isRandom = false; - protected boolean isBigEndian = true; - protected BufferedInputStream bis; - protected long nBytes; - protected GenericOutputChannel out; - - - @Override - public void close() { - if (stream != null) - try { - stream.close(); - } catch (IOException e) { - // ignore - } - if (out != null) - out.closeChannel(); - } - - @Override - public BinaryDocument setStream(BufferedInputStream bis, boolean isBigEndian) { - this.bis = bis; - if (bis != null) { - stream = new DataInputStream(bis); - } - this.isBigEndian = isBigEndian; - return this; - } - - @Override - public BufferedInputStream getInputStream() { - return bis; - } - - @Override - public void setStreamData(DataInputStream stream, boolean isBigEndian) { - if (stream != null) - this.stream = stream; - this.isBigEndian = isBigEndian; - } - - @Override - public void setOutputChannel(GenericOutputChannel out) { - this.out = out; - } - - public void setRandom(boolean TF) { - isRandom = TF; - //CANNOT be random for web - } - - @Override - public byte readByte() throws IOException { - nBytes++; - return ioReadByte(); - } - - @Override - public int readUInt8() throws IOException { - nBytes++; - int b = stream.readUnsignedByte(); - if (out != null) - out.writeByteAsInt(b); - return b; - } - - private byte ioReadByte() throws IOException { - byte b = stream.readByte(); - if (out != null) - out.writeByteAsInt(b); - return b; - } - - @Override - public byte[] readBytes(int n) throws IOException { - byte[] b = new byte[n]; - readByteArray(b, 0, n); - return b; - } - - @Override - public int readByteArray(byte[] b, int off, int len) throws IOException { - int n = ioRead(b, off, len); - nBytes += n; - return n; - } - - private int ioRead(byte[] b, int off, int len) throws IOException { - int m = 0; - while (len > 0) { - int n = stream.read(b, off, len); - m += n; - if (n > 0 && out != null) - out.write(b, off, n); - if (n >= len) - break; - off += n; - len -= n; - } - return m; - } - - @Override - public String readString(int nChar) throws IOException { - byte[] temp = new byte[nChar]; - int n = readByteArray(temp, 0, nChar); - return new String(temp, 0, n, "UTF-8"); - } - - @Override - public short readShort() throws IOException { - nBytes += 2; - short n = (isBigEndian ? ioReadShort() - : (short) ((ioReadByte() & 0xff) - | (ioReadByte() & 0xff) << 8)); - /** - * @j2sNative - * - * return (n > 0x7FFF ? n - 0x10000 : n); - */ - { - return n; - } - } - - private short ioReadShort() throws IOException { - short b = stream.readShort(); - if (out != null) - out.writeShort(b); - return b; - } - - - @Override - public int readIntLE() throws IOException { - nBytes += 4; - return readLEInt(); - } - - @Override - public int readInt() throws IOException { - nBytes += 4; - return (isBigEndian ? ioReadInt() : readLEInt()); - } - - private int ioReadInt() throws IOException { - int i = stream.readInt(); - if (out != null) - out.writeInt(i); - return i; - } - - @Override - public int swapBytesI(int n) { - return (((n >> 24) & 0xff) - | ((n >> 16) & 0xff) << 8 - | ((n >> 8) & 0xff) << 16 - | (n & 0xff) << 24); - } - - @Override - public short swapBytesS(short n) { - return (short) ((((n >> 8) & 0xff) - | (n & 0xff) << 8)); - } - - - @Override - public int readUnsignedShort() throws IOException { - nBytes += 2; - int a = (ioReadByte() & 0xff); - int b = (ioReadByte() & 0xff); - return (isBigEndian ? (a << 8) + b : (b << 8) + a); - } - - @Override - public long readLong() throws IOException { - nBytes += 8; - return (isBigEndian ? ioReadLong() - : ((((long) ioReadByte()) & 0xff) - | (((long) ioReadByte()) & 0xff) << 8 - | (((long) ioReadByte()) & 0xff) << 16 - | (((long) ioReadByte()) & 0xff) << 24 - | (((long) ioReadByte()) & 0xff) << 32 - | (((long) ioReadByte()) & 0xff) << 40 - | (((long) ioReadByte()) & 0xff) << 48 - | (((long) ioReadByte()) & 0xff) << 54)); - } - - private long ioReadLong() throws IOException { - long b = stream.readLong(); - if (out != null) - out.writeLong(b); - return b; - } - - private int readLEInt() throws IOException { - ioRead(t8, 0, 4); - return bytesToInt(t8, 0, false); - } - - byte[] t8 = new byte[8]; - - @Override - public float readFloat() throws Exception { - return intToFloat(readInt()); - } - - @SuppressWarnings("unused") - @Override - public double readDouble() throws IOException { - /** - * - * reading the float equivalent here in JavaScript - * - * @j2sNative - * - * - */ - { - nBytes += 8; - if (true) - return (isBigEndian ? ioReadDouble() - : Double.longBitsToDouble(readLELong())); - } - // this is the JavaScript-only part - this.readByteArray(this.t8, 0, 8); - return bytesToDoubleToFloat(this.t8, 0, this.isBigEndian); - } - - private double ioReadDouble() throws IOException { - double d = stream.readDouble(); - if (out != null) - out.writeLong(Double.doubleToRawLongBits(d)); - return d; - } - - private long readLELong() throws IOException { - return ((((long) ioReadByte()) & 0xff) - | (((long) ioReadByte()) & 0xff) << 8 - | (((long) ioReadByte()) & 0xff) << 16 - | (((long) ioReadByte()) & 0xff) << 24 - | (((long) ioReadByte()) & 0xff) << 32 - | (((long) ioReadByte()) & 0xff) << 40 - | (((long) ioReadByte()) & 0xff) << 48 - | (((long) ioReadByte()) & 0xff) << 56); - } - - @Override - public void seek(long offset) { - // slower, but all that is available using the applet - try { - if (offset == nBytes) - return; - if (offset < nBytes) { - stream.reset(); - if (out != null && nBytes != 0) - out.reset(); - nBytes = 0; - } else { - offset -= nBytes; - } - if (out == null) { - stream.skipBytes((int)offset); - } else { - readByteArray(new byte[(int)offset], 0, (int) offset); - } - nBytes += offset; - } catch (IOException e) { - System.out.println(e.toString()); - } - } - - @Override - public long getPosition() { - return nBytes; - } - - @Override - public SB getAllDataFiles(String binaryFileList, String firstFile) { - return null; - } - - @Override - public void getAllDataMapped(String replace, String string, - Map fileData) { - } - - -/* random access -- application only: - * - void seekFile(long offset) { - try { - file.seek(offset); - } catch (IOException e) { - System.out.println(e.getMessage()); - } - } -*/ -} diff --git a/src2/javajs/util/CU.java b/src2/javajs/util/CU.java deleted file mode 100644 index e46287e..0000000 --- a/src2/javajs/util/CU.java +++ /dev/null @@ -1,555 +0,0 @@ -package javajs.util; - -import java.util.Hashtable; -import java.util.Map; - -import javajs.api.GenericColor; - -/** - * ColorUtility - * - */ - -public class CU { - - public static String toRGBHexString(GenericColor c) { - int rgb = c.getRGB(); - if (rgb == 0) - return "000000"; - String r = "00" + Integer.toHexString((rgb >> 16) & 0xFF); - r = r.substring(r.length() - 2); - String g = "00" + Integer.toHexString((rgb >> 8) & 0xFF); - g = g.substring(g.length() - 2); - String b = "00" + Integer.toHexString(rgb & 0xFF); - b = b.substring(b.length() - 2); - return r + g + b; - } - - public static String toCSSString(GenericColor c) { - int opacity = c.getOpacity255(); - if (opacity == 255) - return "#" + toRGBHexString(c); - int rgb = c.getRGB(); - return "rgba(" + ((rgb>>16)&0xFF) + "," + ((rgb>>8)&0xff) + "," + (rgb&0xff) + "," + opacity/255f + ")"; - } - - private final static String[] colorNames = { - "black", // 000000 - "pewhite", // ffffff - "pecyan", // 00ffff - "pepurple", // d020ff - "pegreen", // 00ff00 - "peblue", // 6060ff - "peviolet", // ff80c0 - "pebrown", // a42028 - "pepink", // ffd8d8 - "peyellow", // ffff00 - "pedarkgreen", // 00c000 - "peorange", // ffb000 - "pelightblue", // b0b0ff - "pedarkcyan", // 00a0a0 - "pedarkgray", // 606060 - - "aliceblue", // F0F8FF - "antiquewhite", // FAEBD7 - "aqua", // 00FFFF - "aquamarine", // 7FFFD4 - "azure", // F0FFFF - "beige", // F5F5DC - "bisque", // FFE4C4 - "blanchedalmond", // FFEBCD - "blue", // 0000FF - "blueviolet", // 8A2BE2 - "brown", // A52A2A - "burlywood", // DEB887 - "cadetblue", // 5F9EA0 - "chartreuse", // 7FFF00 - "chocolate", // D2691E - "coral", // FF7F50 - "cornflowerblue", // 6495ED - "cornsilk", // FFF8DC - "crimson", // DC143C - "cyan", // 00FFFF - "darkblue", // 00008B - "darkcyan", // 008B8B - "darkgoldenrod", // B8860B - "darkgray", // A9A9A9 - "darkgreen", // 006400 - "darkkhaki", // BDB76B - "darkmagenta", // 8B008B - "darkolivegreen", // 556B2F - "darkorange", // FF8C00 - "darkorchid", // 9932CC - "darkred", // 8B0000 - "darksalmon", // E9967A - "darkseagreen", // 8FBC8F - "darkslateblue", // 483D8B - "darkslategray", // 2F4F4F - "darkturquoise", // 00CED1 - "darkviolet", // 9400D3 - "deeppink", // FF1493 - "deepskyblue", // 00BFFF - "dimgray", // 696969 - "dodgerblue", // 1E90FF - "firebrick", // B22222 - "floralwhite", // FFFAF0 16775920 - "forestgreen", // 228B22 - "fuchsia", // FF00FF - "gainsboro", // DCDCDC - "ghostwhite", // F8F8FF - "gold", // FFD700 - "goldenrod", // DAA520 - "gray", // 808080 - "green", // 008000 - "greenyellow", // ADFF2F - "honeydew", // F0FFF0 - "hotpink", // FF69B4 - "indianred", // CD5C5C - "indigo", // 4B0082 - "ivory", // FFFFF0 - "khaki", // F0E68C - "lavender", // E6E6FA - "lavenderblush", // FFF0F5 - "lawngreen", // 7CFC00 - "lemonchiffon", // FFFACD - "lightblue", // ADD8E6 - "lightcoral", // F08080 - "lightcyan", // E0FFFF - "lightgoldenrodyellow", // FAFAD2 - "lightgreen", // 90EE90 - "lightgrey", // D3D3D3 - "lightgray", // D3D3D3 - "lightpink", // FFB6C1 - "lightsalmon", // FFA07A - "lightseagreen", // 20B2AA - "lightskyblue", // 87CEFA - "lightslategray", // 778899 - "lightsteelblue", // B0C4DE - "lightyellow", // FFFFE0 - "lime", // 00FF00 - "limegreen", // 32CD32 - "linen", // FAF0E6 - "magenta", // FF00FF - "maroon", // 800000 - "mediumaquamarine", // 66CDAA - "mediumblue", // 0000CD - "mediumorchid", // BA55D3 - "mediumpurple", // 9370DB - "mediumseagreen", // 3CB371 - "mediumslateblue", // 7B68EE - "mediumspringgreen", // 00FA9A - "mediumturquoise", // 48D1CC - "mediumvioletred", // C71585 - "midnightblue", // 191970 - "mintcream", // F5FFFA - "mistyrose", // FFE4E1 - "moccasin", // FFE4B5 - "navajowhite", // FFDEAD - "navy", // 000080 - "oldlace", // FDF5E6 - "olive", // 808000 - "olivedrab", // 6B8E23 - "orange", // FFA500 - "orangered", // FF4500 - "orchid", // DA70D6 - "palegoldenrod", // EEE8AA - "palegreen", // 98FB98 - "paleturquoise", // AFEEEE - "palevioletred", // DB7093 - "papayawhip", // FFEFD5 - "peachpuff", // FFDAB9 - "peru", // CD853F - "pink", // FFC0CB - "plum", // DDA0DD - "powderblue", // B0E0E6 - "purple", // 800080 - "red", // FF0000 - "rosybrown", // BC8F8F - "royalblue", // 4169E1 - "saddlebrown", // 8B4513 - "salmon", // FA8072 - "sandybrown", // F4A460 - "seagreen", // 2E8B57 - "seashell", // FFF5EE - "sienna", // A0522D - "silver", // C0C0C0 - "skyblue", // 87CEEB - "slateblue", // 6A5ACD - "slategray", // 708090 - "snow", // FFFAFA 16775930 - "springgreen", // 00FF7F - "steelblue", // 4682B4 - "tan", // D2B48C - "teal", // 008080 - "thistle", // D8BFD8 - "tomato", // FF6347 - "turquoise", // 40E0D0 - "violet", // EE82EE - "wheat", // F5DEB3 - "white", // FFFFFF 16777215 - "whitesmoke", // F5F5F5 - "yellow", // FFFF00 - "yellowgreen", // 9ACD32 - // plus a few rasmol names/values - "bluetint", // AFD7FF - "greenblue", // 2E8B57 - "greentint", // 98FFB3 - "grey", // 808080 - "gray", - "pinktint", // FFABBB - "redorange", // FF4500 - "yellowtint", // F6F675 - }; - - private final static int[] colorArgbs = { - //#FFFFC3 hover - 0xFF000000, // black - // plus the PE chain colors - 0xFFffffff, // pewhite - 0xFF00ffff, // pecyan - 0xFFd020ff, // pepurple - 0xFF00ff00, // pegreen - 0xFF6060ff, // peblue - 0xFFff80c0, // peviolet - 0xFFa42028, // pebrown - 0xFFffd8d8, // pepink - 0xFFffff00, // peyellow - 0xFF00c000, // pedarkgreen - 0xFFffb000, // peorange - 0xFFb0b0ff, // pelightblue - 0xFF00a0a0, // pedarkcyan - 0xFF606060, // pedarkgray - // standard JavaScript - 0xFFF0F8FF, // aliceblue - 0xFFFAEBD7, // antiquewhite - 0xFF00FFFF, // aqua - 0xFF7FFFD4, // aquamarine - 0xFFF0FFFF, // azure - 0xFFF5F5DC, // beige - 0xFFFFE4C4, // bisque - 0xFFFFEBCD, // blanchedalmond - 0xFF0000FF, // blue - 0xFF8A2BE2, // blueviolet - 0xFFA52A2A, // brown - 0xFFDEB887, // burlywood - 0xFF5F9EA0, // cadetblue - 0xFF7FFF00, // chartreuse - 0xFFD2691E, // chocolate - 0xFFFF7F50, // coral - 0xFF6495ED, // cornflowerblue - 0xFFFFF8DC, // cornsilk - 0xFFDC143C, // crimson - 0xFF00FFFF, // cyan - 0xFF00008B, // darkblue - 0xFF008B8B, // darkcyan - 0xFFB8860B, // darkgoldenrod - 0xFFA9A9A9, // darkgray - 0xFF006400, // darkgreen - - 0xFFBDB76B, // darkkhaki - 0xFF8B008B, // darkmagenta - 0xFF556B2F, // darkolivegreen - 0xFFFF8C00, // darkorange - 0xFF9932CC, // darkorchid - 0xFF8B0000, // darkred - 0xFFE9967A, // darksalmon - 0xFF8FBC8F, // darkseagreen - 0xFF483D8B, // darkslateblue - 0xFF2F4F4F, // darkslategray - 0xFF00CED1, // darkturquoise - 0xFF9400D3, // darkviolet - 0xFFFF1493, // deeppink - 0xFF00BFFF, // deepskyblue - 0xFF696969, // dimgray - 0xFF1E90FF, // dodgerblue - 0xFFB22222, // firebrick - 0xFFFFFAF0, // floralwhite - 0xFF228B22, // forestgreen - 0xFFFF00FF, // fuchsia - 0xFFDCDCDC, // gainsboro - 0xFFF8F8FF, // ghostwhite - 0xFFFFD700, // gold - 0xFFDAA520, // goldenrod - 0xFF808080, // gray - 0xFF008000, // green - 0xFFADFF2F, // greenyellow - 0xFFF0FFF0, // honeydew - 0xFFFF69B4, // hotpink - 0xFFCD5C5C, // indianred - 0xFF4B0082, // indigo - 0xFFFFFFF0, // ivory - 0xFFF0E68C, // khaki - 0xFFE6E6FA, // lavender - 0xFFFFF0F5, // lavenderblush - 0xFF7CFC00, // lawngreen - 0xFFFFFACD, // lemonchiffon - 0xFFADD8E6, // lightblue - 0xFFF08080, // lightcoral - 0xFFE0FFFF, // lightcyan - 0xFFFAFAD2, // lightgoldenrodyellow - 0xFF90EE90, // lightgreen - 0xFFD3D3D3, // lightgrey - 0xFFD3D3D3, // lightgray - 0xFFFFB6C1, // lightpink - 0xFFFFA07A, // lightsalmon - 0xFF20B2AA, // lightseagreen - 0xFF87CEFA, // lightskyblue - 0xFF778899, // lightslategray - 0xFFB0C4DE, // lightsteelblue - 0xFFFFFFE0, // lightyellow - 0xFF00FF00, // lime - 0xFF32CD32, // limegreen - 0xFFFAF0E6, // linen - 0xFFFF00FF, // magenta - 0xFF800000, // maroon - 0xFF66CDAA, // mediumaquamarine - 0xFF0000CD, // mediumblue - 0xFFBA55D3, // mediumorchid - 0xFF9370DB, // mediumpurple - 0xFF3CB371, // mediumseagreen - 0xFF7B68EE, // mediumslateblue - 0xFF00FA9A, // mediumspringgreen - 0xFF48D1CC, // mediumturquoise - 0xFFC71585, // mediumvioletred - 0xFF191970, // midnightblue - 0xFFF5FFFA, // mintcream - 0xFFFFE4E1, // mistyrose - 0xFFFFE4B5, // moccasin - 0xFFFFDEAD, // navajowhite - 0xFF000080, // navy - 0xFFFDF5E6, // oldlace - 0xFF808000, // olive - 0xFF6B8E23, // olivedrab - 0xFFFFA500, // orange - 0xFFFF4500, // orangered - 0xFFDA70D6, // orchid - 0xFFEEE8AA, // palegoldenrod - 0xFF98FB98, // palegreen - 0xFFAFEEEE, // paleturquoise - 0xFFDB7093, // palevioletred - 0xFFFFEFD5, // papayawhip - 0xFFFFDAB9, // peachpuff - 0xFFCD853F, // peru - 0xFFFFC0CB, // pink - 0xFFDDA0DD, // plum - 0xFFB0E0E6, // powderblue - 0xFF800080, // purple - 0xFFFF0000, // red - 0xFFBC8F8F, // rosybrown - 0xFF4169E1, // royalblue - 0xFF8B4513, // saddlebrown - 0xFFFA8072, // salmon - 0xFFF4A460, // sandybrown - 0xFF2E8B57, // seagreen - 0xFFFFF5EE, // seashell - 0xFFA0522D, // sienna - 0xFFC0C0C0, // silver - 0xFF87CEEB, // skyblue - 0xFF6A5ACD, // slateblue - 0xFF708090, // slategray - 0xFFFFFAFA, // snow - 0xFF00FF7F, // springgreen - 0xFF4682B4, // steelblue - 0xFFD2B48C, // tan - 0xFF008080, // teal - 0xFFD8BFD8, // thistle - 0xFFFF6347, // tomato - 0xFF40E0D0, // turquoise - 0xFFEE82EE, // violet - 0xFFF5DEB3, // wheat - 0xFFFFFFFF, // white - 0xFFF5F5F5, // whitesmoke - 0xFFFFFF00, // yellow - 0xFF9ACD32, // yellowgreen - // plus a few rasmol names/values - 0xFFAFD7FF, // bluetint - 0xFF2E8B57, // greenblue - 0xFF98FFB3, // greentint - 0xFF808080, // grey - 0xFF808080, // gray - 0xFFFFABBB, // pinktint - 0xFFFF4500, // redorange - 0xFFF6F675, // yellowtint - }; - - private static final Map mapJavaScriptColors = new Hashtable(); - - static { - for (int i = colorNames.length; --i >= 0; ) - mapJavaScriptColors.put(colorNames[i], Integer.valueOf(colorArgbs[i])); - } - - /** - * accepts [xRRGGBB] or [0xRRGGBB] or [0xFFRRGGBB] or #RRGGBB or - * [red,green,blue] or a valid JavaScript color - * - * @param strColor - * @return 0 if invalid or integer color - */ - public static int getArgbFromString(String strColor) { - int len = 0; - if (strColor == null || (len = strColor.length()) == 0) - return 0; - strColor = strColor.toLowerCase(); - if (strColor.charAt(0) == '[' && strColor.charAt(len - 1) == ']') { - String check; - if (strColor.indexOf(",") >= 0) { - String[] tokens = PT.split(strColor.substring(1, strColor - .length() - 1), ","); - if (tokens.length != 3) - return 0; - float red = PT.parseFloat(tokens[0]); - float grn = PT.parseFloat(tokens[1]); - float blu = PT.parseFloat(tokens[2]); - return colorTriadToFFRGB(red, grn, blu); - } - switch (len) { - case 9: - check = "x"; - break; - case 10: - check = "0x"; - break; - default: - return 0; - } - if (strColor.indexOf(check) != 1) - return 0; - strColor = "#" + strColor.substring(len - 7, len - 1); - len = 7; - } - if (len == 7 && strColor.charAt(0) == '#') { - try { - return PT.parseIntRadix(strColor.substring(1, 7), 16) | 0xFF000000; - } catch (Exception e) { - return 0; - } - } - Integer boxedArgb = mapJavaScriptColors.get(strColor); - return (boxedArgb == null ? 0 : boxedArgb.intValue()); - } - - public static int colorTriadToFFRGB(float x, float y, float z) { - if (x <= 1 && y <= 1 && z <= 1) { - if (x > 0) - x = x * 256 - 1; - if (y > 0) - y = y * 256 - 1; - if (z > 0) - z = z * 256 - 1; - } - return rgb((int) x, (int) y, (int) z); - } - - public static int rgb(int red, int grn, int blu) { - return 0xFF000000 | (red << 16) | (grn << 8) | blu; - } - - public final static P3 colorPtFromString(String colorName) { - return colorPtFromInt(getArgbFromString(colorName), null); - } - - public final static P3 colorPtFromInt(int color, P3 pt) { - if (pt == null) - pt = new P3(); - pt.set((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF); - return pt; - } - - public static int colorPtToFFRGB(T3 pt) { - return colorTriadToFFRGB(pt.x, pt.y, pt.z); - } - - public static void toRGB3f(int c, float[] f) { - f[0] = ((c >> 16) & 0xFF) / 255f; // red - f[1] = ((c >> 8) & 0xFF) / 255f; - f[2] = (c & 0xFF) / 255f; - } - - /** - * Return a greyscale rgb value 0-FF using NTSC color lightness algorithm - *

- * the alpha component is set to 0xFF. If you want a value in the - * range 0-255 then & the result with 0xFF; - * - * @param rgb the rgb value - * @return a grayscale value in the range 0 - 255 decimal - */ - public static int toFFGGGfromRGB(int rgb) { - int grey = (((2989 * ((rgb >> 16) & 0xFF)) + - (5870 * ((rgb >> 8) & 0xFF)) + - (1140 * (rgb & 0xFF)) + 5000) / 10000) & 0xFFFFFF; - return rgb(grey, grey, grey); - } - - - /** - * Convert RGB values to HSL (hue/saturation/lightness) - * - * @param rgb - * range 255 255 255 - * @param doRound - * set to false when just using this for - * for RGB -- HSL -- HSL' -- RGB' conversion - * - * @return the HSL as P3 range 360 100 100 - * @author hansonr - */ - - public static P3 rgbToHSL(P3 rgb, boolean doRound) { - // adapted from http://tips4java.wordpress.com/2009/07/05/hsl-color/ - // see http://en.wikipedia.org/wiki/HSL_color_space - float r = rgb.x / 255; - float g = rgb.y / 255; - float b = rgb.z / 255; - float min = Math.min(r, Math.min(g, b)); - float max = Math.max(r, Math.max(g, b)); - - // lightness is just p * 50 - - float p = (max + min); - float q = (max - min); - - float h = (60 * ((q == 0 ? 0 : max == r ? ((g - b) / q + 6) - : max == g ? (b - r) / q + 2 : (r - g) / q + 4))) % 360; - - float s = q / (q == 0 ? 1 : p <= 1 ? p : 2 - p); - - // we round to tenths for HSL so that we can return enough - // precision to get back 1-255 in RGB - return (doRound ? P3.new3(Math.round(h*10)/10f, Math.round(s * 1000)/10f, - Math.round(p * 500)/10f) : P3.new3(h, s * 100, p * 50)); - } - - /** - * Convert HSL (hue/saturation/luninance) values to RGB - * - * @param hsl in the range 360, 100, 100 - * @return the RGB as P3 range 0 to 255 - * @author hansonr - */ - public static P3 hslToRGB(P3 hsl) { - // adapted from http://tips4java.wordpress.com/2009/07/05/hsl-color/ - // see http://en.wikipedia.org/wiki/HSL_color_space - - // highly condensed - - float h = Math.max(0, Math.min(360, hsl.x)) / 60; - float s = Math.max(0, Math.min(100, hsl.y)) / 100; - float l = Math.max(0, Math.min(100, hsl.z)) / 100; - - float p = l - (l < 0.5 ? l : 1 - l) * s; - float q = 2 * (l - p); - - float r = toRGB(p, q, h + 2); - float g = toRGB(p, q, h); - float b = toRGB(p, q, h - 2); - return P3.new3(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)); - } - - private static float toRGB(float p, float q, float h) { - return ((h = (h + (h < 0 ? 6 : h > 6 ? -6 : 0))) < 1 ? p + q * h - : h < 3 ? p + q : h < 4 ? p + q * (4 - h) : p); - } - -} diff --git a/src2/javajs/util/CifDataParser.java b/src2/javajs/util/CifDataParser.java deleted file mode 100644 index 51e969c..0000000 --- a/src2/javajs/util/CifDataParser.java +++ /dev/null @@ -1,905 +0,0 @@ -package javajs.util; - -import java.io.BufferedReader; - -import java.util.Hashtable; - -import java.util.Map; - -import javajs.api.GenericCifDataParser; -import javajs.api.GenericLineReader; - - -// BH 11/21/16 -- adds support for array grouping [...] - used in 2016-format magCIF files - -/** -* -* A CIF 1.0 tokenizer class for dealing with quoted strings in CIF files. -* -* Subclassed by org.jmol.adapters.readers.cif.Cif2DataParser -* -* Greek letters implemented in Jmol 13.3.9 and only for -* titles and space groups. All other mark ups ignored. -* -*

-* regarding the treatment of single quotes vs. primes in -* cif file, PMR wrote: -*

-*

-* * There is a formal grammar for CIF -* (see http://www.iucr.org/iucr-top/cif/index.html) -* which confirms this. The textual explanation is -*

-*

-* 14. Matching single or double quote characters (' or ") may -* be used to bound a string representing a non-simple data value -* provided the string does not extend over more than one line. -*

-*

-* 15. Because data values are invariably separated from other -* tokens in the file by white space, such a quote-delimited -* character string may contain instances of the character used -* to delimit the string provided they are not followed by white -* space. For example, the data item -* -* _example 'a dog's life' -* -* is legal; the data value is a dog's life. -*

-*

-* [PMR - the terminating character(s) are quote+whitespace. -* That would mean that: -* -* _example 'Jones' life' -* -* would be an error -*

-*

-* The CIF format was developed in that late 1980's under the aegis of the -* International Union of Crystallography (I am a consultant to the COMCIFs -* committee). It was ratified by the Union and there have been several -* workshops. mmCIF is an extension of CIF which includes a relational -* structure. The formal publications are: -*

-*

-* Hall, S. R. (1991). "The STAR File: A New Format for Electronic Data -* Transfer and Archiving", J. Chem. Inform. Comp. Sci., 31, 326-333. -* Hall, S. R., Allen, F. H. and Brown, I. D. (1991). "The Crystallographic -* Information File (CIF): A New Standard Archive File for Crystallography", -* Acta Cryst., A47, 655-685. -* Hall, S.R. & Spadaccini, N. (1994). "The STAR File: Detailed -* Specifications," J. Chem. Info. Comp. Sci., 34, 505-508. -*

-*/ - -public class CifDataParser implements GenericCifDataParser { - - protected int getVersion() { - return 1; - } - - /** - * The maximum number of columns (data keys) passed to the parser or found in the file - * for a given loop_ or category.subkey listing. - * - */ - public static final int KEY_MAX = 100; - - private GenericLineReader reader; - private BufferedReader br; - - /** - * from buffered reader - */ - protected String line; - - /** - * working string (buffer) - * - */ - protected String str; - - /** - * pointer to current character on str - */ - protected int ich; - - /** - * length of str - * - */ - protected int cch; - - /** - * whether we are processing an unquoted value or key - */ - protected boolean wasUnquoted; - - /** - * optional token terminator; in CIF 2.0 could be } or ] - */ - protected char cterm = '\0'; - - /** - * string to return for CIF data value . and ? - */ - protected String nullString = "\0"; - - /** - * A flag to create and return Java objects, not strings. - * Used only by Jmol scripting x = getProperty("cifInfo", filename). - */ - protected boolean asObject; - - - /** - * debugging flag passed from reader; unused - * - */ - protected boolean debugging; - - - /** - * private processing fields - * - */ - private Object strPeeked; - private int ichPeeked; - private int columnCount; - private String[] columnNames; - private Object[] columnData = new Object[KEY_MAX]; - private boolean isLoop; - private boolean haveData; - - /** - * comments at the top of a file, including #\#CIF_2.0, for example - */ - private SB fileHeader = new SB(); - private boolean isHeader = true; - - - /** - * Set the string value of what is returned for "." and "?" - * - * @param nullString null here returns "." and "?"; default is "\0" - * - */ - public void setNullValue(String nullString) { - this.nullString = nullString; - } - - /** - * A global, static map that contains field information. The assumption is that - * if we read a set of fields for, say, atom_site, once in a lifetime, then - * that should be good forever. Those are static lists. Or should be.... - */ - private static Map htFields = new Hashtable(); - - //////////////////////////////////////////////////////////////// - // special tokenizer class - //////////////////////////////////////////////////////////////// - - public CifDataParser() { - // for reflection - } - - @Override - public Object getColumnData(int i) { - return columnData[i]; - } - - @Override - public int getColumnCount() { - return columnCount; - } - - @Override - public String getColumnName(int i) { - return columnNames[i]; - } - - /** - * A Chemical Information File data parser. - * - * set() should be called immediately upon construction. - * - * Two options; one of reader or br should be null, or reader will be - * ignored. Just simpler this way... - * - * @param reader Anything that can deliver a line of text or null - * @param br A standard BufferedReader. - * @param debugging - * - */ - @Override - public CifDataParser set(GenericLineReader reader, BufferedReader br, boolean debugging) { - this.reader = reader; - this.br = br; - this.debugging = debugging; - return this; - } - - - /** - * - * @return commented-out section at the start of a CIF file. - * - */ - @Override - public String getFileHeader() { - return fileHeader.toString(); - } - - - /** - * Parses all CIF data for a reader defined in the constructor - * into a standard Map structure and close the BufferedReader if - * it exists. - * - * @return Hashtable of models Vector of Hashtable data - */ - @Override - public Map getAllCifData() { - line = ""; - String key; - Map data = null, data0 = null; - Map allData = new Hashtable(); - Lst> models = new Lst>(); - allData.put("models", models); - asObject = (getVersion() >= 2); - nullString = null; - Lst> saveFrames = new Lst>(); - try { - while ((key = getNextToken()) != null) { - if (key.startsWith("global_") || key.startsWith("data_")) { - models.addLast(data0 = data = new Hashtable()); - data.put("name", key); - continue; - } - if (key.startsWith("loop_")) { - getAllCifLoopData(data); - continue; - } - if (key.startsWith("save_")) { - if (key.equals("save_")) { - int n = saveFrames.size(); - if (n == 0) { - System.out.println("CIF ERROR ? save_ without corresponding save_xxxx"); - data = data0; - } else { - data = saveFrames.removeItemAt(n - 1); - } - } else { - saveFrames.addLast(data); - Map d = data; - data = new Hashtable(); - d.put(key, data); - } - continue; - } - if (key.charAt(0) != '_') { - System.out.println("CIF ERROR ? should be an underscore: " + key); - } else { - Object value = (asObject ? getNextTokenObject() : getNextToken()); - if (value == null) { - System.out.println("CIF ERROR ? end of file; data missing: " + key); - } else { - data.put(fixKey(key), value); - } - } - } - } catch (Exception e) { - // ? - } - asObject = false; - try { - if (br != null) - br.close(); - } catch (Exception e) { - // ? - } - nullString = "\0"; - return allData; - } - - /** - * create our own list of keywords and for each one create a list - * of data associated with that keyword. For example, a list of all - * x coordinates, then a list of all y coordinates, etc. - * - * @param data - * @throws Exception - */ - @SuppressWarnings("unchecked") - private void getAllCifLoopData(Map data) throws Exception { - String key; - Lst keyWords = new Lst(); - Object o; - while ((o = peekToken()) != null && o instanceof String && ((String) o).charAt(0) == '_') { - key = fixKey((String) getTokenPeeked()); - keyWords.addLast(key); - data.put(key, new Lst()); - } - columnCount = keyWords.size(); - if (columnCount == 0) - return; - isLoop = true; - while (getData()) - for (int i = 0; i < columnCount; i++) - ((Lst)data.get(keyWords.get(i))).addLast(columnData[i]); - isLoop = false; - } - - @Override - public String readLine() { - try { - line = (reader == null ? br.readLine() : reader.readNextLine()); - if (line == null) - return null; - if (isHeader) { - if (line.startsWith("#")) - fileHeader.append(line).appendC('\n'); - else - isHeader = false; - } - return line; - } catch (Exception e) { - return null; - } - } - - /** - * The work horse; a general reader for loop data. Fills colunnData with - * fieldCount fields. - * - * @return false if EOF - * @throws Exception - */ - @Override - public boolean getData() throws Exception { - // line is already present, and we leave with the next line to parse - if (isLoop) { - for (int i = 0; i < columnCount; ++i) - if ((columnData[i] = getNextDataToken()) == null) - return false; - } else if (haveData) { - haveData = false; - } else { - return false; - } - return (columnCount > 0); - } - - /** - * - * Skips all associated loop data. (Skips to next control word.) - * - * @throws Exception - */ - @Override - public String skipLoop(boolean doReport) throws Exception { - String str; - SB ret = (doReport ? new SB() : null); - int n = 0; - while ((str = (String) peekToken()) != null && str.charAt(0) == '_') { - if (ret != null) - ret.append(str).append("\n"); - getTokenPeeked(); - n++; - } - if (n == 0) - n = columnCount; // end-of-label-section skip - int m = 0; - while ((str = (String) getNextDataToken()) != null) { - if (ret == null) - continue; - ret.append(str).append(" "); - if ((++m % n) == 0) - ret.append("\n"); - } - return (ret == null ? null : ret.toString()); - } - - /** - * Get a token as a String value (for the reader) - * - * @return the next token of any kind, or null - * @throws Exception - */ - @Override - public String getNextToken() throws Exception { - wasUnquoted = true; - return (String) getNextTokenProtected(); - } - - /** - * Get the token as a Java Object - * - * @return the next token of any kind, or null - * @throws Exception - */ - public Object getNextTokenObject() throws Exception { - wasUnquoted = true; - return getNextTokenProtected(); - } - - /** - * Just makes sure - * @return String from buffer. - * @throws Exception - */ - protected Object getNextTokenProtected() throws Exception { - return (getNextLine() ? nextStrToken() : null); - } - - /** - * - * first checks to see if the next token is an unquoted - * control code, and if so, returns null - * - * @return next data token or null - * @throws Exception - */ - @Override - public Object getNextDataToken() throws Exception { - Object o = peekToken(); - if (o == null) - return null; - if (wasUnquoted && o instanceof String) { - String str = (String) o; - if (str.charAt(0) == '_' || str.startsWith("loop_") - || str.startsWith("data_") - || str.startsWith("save_") - || str.startsWith("stop_") - || str.startsWith("global_")) - return null; - } - return getTokenPeeked(); - } - - /** - * Just look at the next token. Saves it for retrieval - * using getTokenPeeked() - * - * @return next token or null if EOF - * @throws Exception - */ - @Override - public Object peekToken() throws Exception { - if (!getNextLine()) - return null; - int ich = this.ich; - strPeeked = nextStrToken(); - ichPeeked= this.ich; - this.ich = ich; - return strPeeked; - } - - /** - * grab a new line if necessary and prepare it - * if it starts with ";" - * - * @return updated this.str - * @throws Exception - */ - private boolean getNextLine() throws Exception { - while (!strHasMoreTokens()) - if (prepareNextLine() == null) - return false; - return true; - } - - /** - * - * @return the token last acquired; may be null - */ - @Override - public Object getTokenPeeked() { - ich = ichPeeked; - return strPeeked; - } - - /** - * Used especially for data that might be multi-line data that - * might have unwanted white space at start or end. - * - * @param str - * @return str without any leading/trailing white space, and no '\n' - */ - @Override - public String fullTrim(String str) { - int pt0 = -1; - int pt1 = str.length(); - while (++pt0 < pt1 && PT.isWhitespace(str.charAt(pt0))) { - } - while (--pt1 > pt0 && PT.isWhitespace(str.charAt(pt1))) { - } - return str.substring(pt0, pt1 + 1); - } - - private final static String grABC = - "ABX\u0394E\u03A6\u0393H" // ABCDEFGH - + "I_K\u039BMNO\u03A0" // I_KLMNOP - + "\u0398P\u03A3TY_\u03A9\u039E\u03A5Z"; // QRSTU_WXYZ - private final static String grabc = - "\u03B1\u03B2\u03C7\u03A4\u03A5\u03C6\u03B3\u03B7" // abcdefgh - + "\u03B9_\u03BA\u03BB\u03BC\u03BD\u03BF\u03C0" // i_klmnop - + "\u03B8\u03C1\u03C3\u03C4\u03C5_\u03C9\u03BE\u03C5\u03B6"; // qrstu_wxyz - - /** - * Only translating the basic Greek set here, not all the other stuff. See - * http://www.iucr.org/resources/cif/spec/version1.1/semantics#markup - * - * @param data - * @return cleaned string - */ - @Override - public String toUnicode(String data) { - int pt; - try { - while ((pt = data.indexOf('\\')) >= 0) { - int c = data.charAt(pt + 1); - String ch = (c >= 65 && c <= 90 ? grABC.substring(c - 65, c - 64) - : c >= 97 && c <= 122 ? grabc.substring(c - 97, c - 96) : "_"); - data = data.substring(0, pt) + ch + data.substring(pt + 2); - } - } catch (Exception e) { - // ignore - } - - return data; - } - - /** - * Process a data block, with or without a loop_. - * - * Passed an array of field names, this method fills two int[] arrays. The - * first, key2col, maps desired key values to actual order of appearance - * (column number) in the file; the second, col2key, is a reverse loop-up for - * that, mapping column numbers to desired field indices. - * - * When called within a loop_ context, this.columnData will be created but not filled. - * - * Alternatively, if fields is null, then this.fieldNames is - * filled, in order, with key data, and both key2col and col2key will be - * simply 0,1,2,... This array is used in cases such as matrices for which - * there are simply too many possibilities to list, and the key name itself - * contains information that we need. - * - * When not a loop_ context, keys are expected to be in the mmCIF form - * category.subkey and will be unique within a data block (see - * http://mmcif.wwpdb.org/docs/tutorials/mechanics/pdbx-mmcif-syntax.html). - * Keys and data will be read for all data in the same category, filling this.columnData. - * - * - * In this way, the calling class does not need to enumerate all possible - * category names, but instead can focus on just those of interest. - * - * - * @param fields - * list of normalized field names, such as - * "_pdbx_struct_assembly_gen_assembly_id" (with "_" instead of ".") - * @param key - * null to indicate a loop_ construct, otherwise the initial category.subkey - * found - * @param data - * when not loop_ the initial data read, otherwise ignored - * @param key2col - * map of desired keys to actual columns - * @param col2key - * map of actual columns to desired keys - * @throws Exception - */ - @Override - public void parseDataBlockParameters(String[] fields, String key, - String data, int[] key2col, int[] col2key) throws Exception { - isLoop = (key == null); - Object o; - String s; - if (fields == null) { - // for reading full list of keys, as for matrices - columnNames = new String[KEY_MAX]; - } else { - if (!htFields.containsKey(fields[0])) - for (int i = fields.length; --i >= 0;) - htFields.put(fields[i], Integer.valueOf(i)); - for (int i = fields.length; --i >= 0;) - key2col[i] = NONE; - } - columnCount = 0; - int pt, i; - if (isLoop) { - while (true) { - o = peekToken(); - if (o == null) { - // we are PREMATURELY done; reset - columnCount = 0; - break; - } - // end of the loop is a new token not starting with underscore - if (!(o instanceof String) || ((String) o).charAt(0) != '_') - break; - - pt = columnCount++; - s = fixKey((String) getTokenPeeked()); - if (fields == null) { - // just make a linear model, saving the list - columnNames[col2key[pt] = key2col[pt] = pt] = s; - continue; - } - Integer iField = htFields.get(s); - i = (iField == null ? NONE : iField.intValue()); - if ((col2key[pt] = i) != NONE) - key2col[i] = pt; - } - } else { - pt = key.indexOf("."); - String str0 = (pt < 0 ? key : key.substring(0, pt + 1)); - while (true) { - // end of the loop is a new token not starting with underscore - pt = columnCount++; - if (key == null) { - key = (String) getTokenPeeked(); - data = getNextToken(); - } - Integer iField = htFields.get(fixKey(key)); - i = (iField == null ? NONE : iField.intValue()); - if ((col2key[pt] = i) != NONE) - columnData[key2col[i] = pt] = data; - if ((o = peekToken()) == null || !(o instanceof String) || !((String) o).startsWith(str0)) - break; - key = null; - } - haveData = (columnCount > 0); - } - } - - @Override - public String fixKey(String key) { - // PRELIMINARY -- BilBao _magnetic - // PRELIMINARY -- Jana2006 - return ( - key.startsWith("_magnetic") ? key.substring(9) - : key.startsWith("_jana") ? key.substring(5) - : key).replace('.', '_').toLowerCase(); - } - - //////////////////// private methods //////////////////// - - - /** - * sets global str and line to be parsed from the beginning - * - * \1 .... \1 indicates an embedded fully escaped data object - * - * @param str new data string - * @return str - */ - protected String setString(String str) { - this.str = line = str; - cch = (str == null ? 0 : str.length()); - ich = 0; - return str; - } - - /* - * http://www.iucr.org/resources/cif/spec/version1.1/cifsyntax - * - * 17. The special sequence of end-of-line followed - * immediately by a semicolon in column one (denoted ";") - * may also be used as a delimiter at the beginning and end - * of a character string comprising a data value. The complete - * bounded string is called a text field, and may be used to - * convey multi-line values. The end-of-line associated with - * the closing semicolon does not form part of the data value. - * Within a multi-line text field, leading white space within - * text lines must be retained as part of the data value; trailing - * white space on a line may however be elided. - * - * 18. A text field delimited by the ; digraph may not - * include a semicolon at the start of a line of text as - * part of its value. - * - * 20. For example, the data value foo may be expressed - * equivalently as an unquoted string foo, as a quoted - * string 'foo' or as a text field - * - *;foo - *; - * - * By contrast the value of the text field - * - *; foo - * bar - *; - * - * is foo bar (where represents an end-of-line); - * the embedded space characters are significant. - * - * - * I (BH) note, however, that we sometimes have: - * - * _some_name - * ; - * the name here - * ; - * - * so this should actually be - * - * ;the name here - * ; - * - * for this, we use fullTrim(); - * - */ - - /** - * - * sets the string for parsing to be from the next line - * when the token buffer is empty, and if ';' is at the - * beginning of that line, extends the string to include - * that full multiline string. Uses \1 to indicate that - * this is a special quotation. - * - * - * - * @return the next line or null if EOF - * @throws Exception - */ - protected String prepareNextLine() throws Exception { - setString(readLine()); - if (line == null || line.length() == 0) - return line; - if (line.charAt(0) == ';') - return preprocessString(); - if (str.startsWith("###non-st#")) - ich = 10; - return line; - } - - /** - * Preprocess the string on a line starting with a semicolon - * to produce a string with a \1 ... \1 segment - * that will be picked up in the next round - * - * @return escaped part with attached extra data - * @throws Exception - */ - protected String preprocessString() throws Exception { - return setString(preprocessSemiString()); - } - - /** - * Encapsulate a multi-line ; .... ; string with \1 ... \1 - * - * CIF 1.0 and CIF 2.0 - * - * @return ecapsulated string - * @throws Exception - */ - protected String preprocessSemiString() throws Exception { - ich = 1; - String str = '\1' + line.substring(1) + '\n'; - while (readLine() != null) { - if (line.startsWith(";")) { - // remove trailing only, and attach rest of next line - str = str.substring(0, str.length() - 1) - + '\1' + line.substring(1); - break; - } - str += line + '\n'; - } - return str; - } - - /** - * @return TRUE if there are more tokens in the line buffer - * - */ - private boolean strHasMoreTokens() { - if (str == null) - return false; - char ch = '#'; - while (ich < cch && ((ch = str.charAt(ich)) == ' ' || ch == '\t')) - ++ich; - return (ich < cch && ch != '#'); - } - - /** - * assume that hasMoreTokens() has been called and that ich is pointing at a - * non-white character. Also sets boolean wasUnQuoted, because we need to know - * if we should be checking for a control keyword. 'loop_' is different from - * just loop_ without the quotes. - * - * @return null if no more tokens, "\0" if '.' or '?', or next token - */ - private Object nextStrToken() { - if (ich == cch) - return null; - char ch = str.charAt(ich); - if (isQuote(ch)) { - wasUnquoted = false; - return getQuotedStringOrObject(ch); - } - int ichStart = ich; - wasUnquoted = true; - while (ich < cch && !isTerminator(ch = str.charAt(ich))) - ++ich; - if (ich == ichStart + 1) - if (nullString != null - && (str.charAt(ichStart) == '.' || str.charAt(ichStart) == '?')) - return nullString; - String s = str.substring(ichStart, ich); - return unquoted(s); - } - - /** - * In CIF 2.0, this method turns a String into an Integer or Float - * In CIF 1.0 (here) just return the unchanged value. - * @param s unquoted string - * @return unchanged value - */ - protected Object unquoted(String s) { - return s; - } - - /** - * The token terminator is space or tab in CIF 1.0, - * but it can be quoted strings in CIF 2.0. - * - * @param c - * @return true if this character is a terminator - */ - protected boolean isTerminator(char c) { - return c == ' ' || c == '\t' || c == cterm ; - } - - /** - * CIF 1.0 only; we handle various quote types here - * @param ch - * @return true if this character is a (starting) quote - */ - protected boolean isQuote(char ch) { - switch (ch) { - case '\'': - case '\"': - case '\1': - return true; - } - return false; - } - - /** - * CIF 1.0 only. - * - * - * @param ch current character being pointed to - * @return a String data object - */ - protected Object getQuotedStringOrObject(char ch) { - int ichStart = ich; - char chClosingQuote = ch; - boolean wasQuote = false; - while (++ich < cch) { - ch = str.charAt(ich); - // CIF 1.0 rules require that the closing ' or "" be followed by space or tab or EOL - if (wasQuote && (ch == ' ' || ch == '\t')) - break; - wasQuote = (ch == chClosingQuote); - } - int pt1 = ichStart + 1; - int pt2 = ich - 1; - if (ich == cch && !wasQuote) { - // reached the end of the string without finding closing ' - // so take the whole thing. Probably a bad CIF file. - pt1--; - pt2++; - } else { - // throw away the last white character - ++ich; - } - return str.substring(pt1, pt2); - } - - -} \ No newline at end of file diff --git a/src2/javajs/util/CompoundDocDirEntry.java b/src2/javajs/util/CompoundDocDirEntry.java deleted file mode 100644 index a57f6af..0000000 --- a/src2/javajs/util/CompoundDocDirEntry.java +++ /dev/null @@ -1,101 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2011 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package javajs.util; - - -class CompoundDocDirEntry { - - private final CompoundDocument cd; - - /** - * @param compoundDocument - */ - CompoundDocDirEntry(CompoundDocument compoundDocument) { - cd = compoundDocument; - } - - // 128 bytes - //offset 0: - byte[] unicodeName64 = new byte[64]; - short nBytesUnicodeName; // twice the ascii length, including terminating 0 - byte entryType; // 0 empty; 1 storage; 2 stream; 5 root storage - //byte entryColor; // 0 red or 1 black - //int DIDchildLeft; - //int DIDchildRight; - //int DIDstorageRoot; - byte[] uniqueID16 = new byte[16]; - byte[] userflags4 = new byte[4]; - //long timeStamp1; - //long timeStamp2; - //offset 116: - int SIDfirstSector; // either SAT or SSAT - int lenStream; - byte[] unused = new byte[8]; - - // derived: - - String entryName; - boolean isStandard; - boolean isEmpty; - - final boolean readData() { - try { - cd.readByteArray(unicodeName64, 0, 64); - nBytesUnicodeName = cd.readShort(); - entryType = cd.readByte(); - /*entryColor = */cd.readByte(); - /*DIDchildLeft = */cd.readInt(); - /*DIDchildRight = */cd.readInt(); - /*DIDstorageRoot = */cd.readInt(); - cd.readByteArray(uniqueID16, 0, 16); - cd.readByteArray(userflags4, 0, 4); - /*timeStamp1 = */ cd.readByteArray(unused, 0, 8);//cd.readLong(); - /*timeStamp2 = */ cd.readByteArray(unused, 0, 8);//cd.readLong(); - //offset 116: - SIDfirstSector = cd.readInt(); - lenStream = cd.readInt(); - cd.readByteArray(unused, 0, 4); - } catch (Exception e) { - System.out.println(e.toString()); - return false; - } - entryName = ""; - for (int i = 0; i < nBytesUnicodeName - 2; i += 2) - entryName += (char) unicodeName64[i]; - isStandard = (entryType == 5 || lenStream >= cd.header.minBytesStandardStream); - isEmpty = (entryType == 0 || lenStream <= 0); - //System.out.println(entryName + " type " + entryType); - return true; - } - - @Override - public String toString() { - return entryName + " " + lenStream; - } -} \ No newline at end of file diff --git a/src2/javajs/util/CompoundDocHeader.java b/src2/javajs/util/CompoundDocHeader.java deleted file mode 100644 index 72317fe..0000000 --- a/src2/javajs/util/CompoundDocHeader.java +++ /dev/null @@ -1,115 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2011 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package javajs.util; - - -class CompoundDocHeader { - - /** - * - */ - private final CompoundDocument cd; - - /** - * @param compoundDocument - */ - CompoundDocHeader(CompoundDocument compoundDocument) { - cd = compoundDocument; - } - - //512 bytes - //offset 0: - byte[] magicNumbers = new byte[8]; // D0CF11E0A1B11AE1 - byte[] uniqueID16 = new byte[16]; - byte revNumber; // 3E = 62 - //byte unusedb1; - byte verNumber; // 3 - //byte unusedb2; - //short byteOrder; // -2 littleEndian - short sectorPower; // 2^sectorPower = sector size; 512 = 2^9 - short shortSectorPower; // 2^shortSectorPower = short sector size; 64 = 2^6 - byte[] unused = new byte[10]; - int nSATsectors; // number of sectors for sector allocation table - int SID_DIR_start; // sector identifier of start of directory sector - //offset 56: - int minBytesStandardStream; // less than this (and not DIR) will be "short" - int SID_SSAT_start; // start of short sector allocation table (SSAT) - int nSSATsectors; // number of sectors allocated to SSAT - int SID_MSAT_next; // pointer to next master sector allocation table sector - int nAdditionalMATsectors; // number of sectors allocated to more MSAT sectors - //offset 76; 436 bytes: - int[] MSAT0 = new int[109]; // beginning of master allocation table - - /* - * Sector 0 is first sector AFTER this header - * - * If sectorPower = 9, then this allows for 109 PAGES - * of sector allocation tables, with 127 pointers per - * page (plus 1 pointer to the next SAT page), each - * pointing to a sector of 512 bytes. Thus, with no additional - * MSAT pages, the header allows for 109*128*512 = 7.1 Mb file - * - */ - - final boolean readData() { - try { - cd.readByteArray(magicNumbers, 0, 8); - if ((magicNumbers[0] & 0xFF) != 0xD0 || (magicNumbers[1] & 0xFF) != 0xCF - || (magicNumbers[2] & 0xFF) != 0x11 || (magicNumbers[3] & 0xFF) != 0xE0 - || (magicNumbers[4] & 0xFF) != 0xA1 || (magicNumbers[5] & 0xFF) != 0xB1 - || (magicNumbers[6] & 0xFF) != 0x1A || (magicNumbers[7] & 0xFF) != 0xE1) - return false; - cd.readByteArray(uniqueID16, 0, 16); - revNumber = cd.readByte(); - cd.readByte(); - verNumber = cd.readByte(); - cd.readByte(); - byte b1 = cd.readByte(); - byte b2 = cd.readByte(); - cd.isBigEndian = (b1 == -1 && b2 == -2); - sectorPower = cd.readShort(); - shortSectorPower = cd.readShort(); - cd.readByteArray(unused, 0, 10); - nSATsectors = cd.readInt(); - SID_DIR_start = cd.readInt(); - cd.readByteArray(unused, 0, 4); - minBytesStandardStream = cd.readInt(); - SID_SSAT_start = cd.readInt(); - nSSATsectors = cd.readInt(); - SID_MSAT_next = cd.readInt(); - nAdditionalMATsectors = cd.readInt(); - for (int i = 0; i < 109; i++) - MSAT0[i] = cd.readInt(); - } catch (Exception e) { - System.out.println(e.toString()); - return false; - } - return true; - } -} \ No newline at end of file diff --git a/src2/javajs/util/CompoundDocument.java b/src2/javajs/util/CompoundDocument.java deleted file mode 100644 index 2e2c242..0000000 --- a/src2/javajs/util/CompoundDocument.java +++ /dev/null @@ -1,395 +0,0 @@ -/* $RCSfile$ - * $Author: egonw $ - * $Date: 2006-03-18 15:59:33 -0600 (Sat, 18 Mar 2006) $ - * $Revision: 4652 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2003-2005 Miguel, Jmol Development, www.jmol.org - * - * Contact: hansonr@stolaf.edu - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.util; - - -import java.io.DataInputStream; -import java.io.BufferedInputStream; - - -import java.util.Map; - -import javajs.api.GenericZipTools; - - - -/* a simple compound document reader. - * - * DIRECTORY STRUCTURE IS NOT REGENERATED - * - * See http://sc.openoffice.org/compdocfileformat.pdf - * - * random access file info: - * http://java.sun.com/docs/books/tutorial/essential/io/rafs.html - * - * SHOOT! random access is only for applications, not applets! - * - * With a bit more work, this could be set up to deliver binary files, but - * right now I've only implemented it for string-based data. - * - */ - -public class CompoundDocument extends BinaryDocument{ - -// RandomAccessFile file; - CompoundDocHeader header = new CompoundDocHeader(this); - Lst directory = new Lst(); - CompoundDocDirEntry rootEntry; - - protected GenericZipTools jzt; - - int[] SAT; - int[] SSAT; - int sectorSize; - int shortSectorSize; - int nShortSectorsPerStandardSector; - int nIntPerSector; - int nDirEntriesperSector; - - // called by reflection - - public CompoundDocument(){ - super(); - this.isBigEndian = true; - } - - public void setDocStream(GenericZipTools jzt, BufferedInputStream bis) { - this.jzt = jzt; - if (!isRandom) { - stream = new DataInputStream(bis); - } - stream.mark(Integer.MAX_VALUE); - if (!readHeader()) - return; - getSectorAllocationTable(); - getShortSectorAllocationTable(); - getDirectoryTable(); - } - - public Lst getDirectory() { - return directory; - } - - public String getDirectoryListing(String separator) { - SB sb = new SB(); - for (int i = 0; i < directory.size(); i++) { - CompoundDocDirEntry thisEntry = directory.get(i); - if (!thisEntry.isEmpty) - sb.append(separator).append(thisEntry.entryName) - .append("\tlen=").appendI(thisEntry.lenStream) - .append("\tSID=").appendI(thisEntry.SIDfirstSector) - .append(thisEntry.isStandard ? "\tfileOffset=" - + getOffset(thisEntry.SIDfirstSector) : ""); - } - return sb.toString(); - } - - public SB getAllData() { - return getAllDataFiles(null, null); - } - - /** - * reads a compound document directory and saves all data in a Hashtable - * so that the files may be organized later in a different order. Also adds - * a #Directory_Listing entry. - * - * Files are bracketed by BEGIN Directory Entry and END Directory Entry lines, - * similar to ZipUtil.getAllData. - * - * @param prefix - * @param binaryFileList |-separated list of files that should be saved - * as xx xx xx hex byte strings. The directory listing - * is appended with ":asBinaryString" - * @param fileData - */ - @Override - public void getAllDataMapped(String prefix, - String binaryFileList, Map fileData) { - fileData.put("#Directory_Listing", getDirectoryListing("|")); - binaryFileList = "|" + binaryFileList + "|"; - for (int i = 0; i < directory.size(); i++) { - CompoundDocDirEntry thisEntry = directory.get(i); - if (!thisEntry.isEmpty && thisEntry.entryType != 5) { - String name = thisEntry.entryName; - System.out.println("CompoundDocument file " + name); - boolean isBinary = (binaryFileList.indexOf("|" + name + "|") >= 0); - if (isBinary) - name += ":asBinaryString"; - fileData.put(prefix + "/" + name, appendData(new SB(), name, thisEntry, isBinary).toString()); - } - } - close(); - } - - @Override - public SB getAllDataFiles(String binaryFileList, String firstFile) { -// firstFile is now ignored -// if (firstFile != null) { -// for (int i = 0; i < directory.size(); i++) { -// CompoundDocDirEntry thisEntry = directory.get(i); -// if (thisEntry.entryName.equals(firstFile)) { -// directory.remove(i); -// directory.add(1, thisEntry); // after ROOT_ENTRY -// break; -// } -// } -// } - SB data = new SB(); - data.append("Compound Document File Directory: "); - data.append(getDirectoryListing("|")); - data.append("\n"); - CompoundDocDirEntry thisEntry; - binaryFileList = "|" + binaryFileList + "|"; - for (int i = 0, n = directory.size(); i < n; i++) { - thisEntry = directory.get(i); - //System.out.println("CompoundDocument reading " + thisEntry.entryName); - String name = thisEntry.entryName; - switch (thisEntry.entryType) { - case 5: // root - break; - case 1: // user storage (dir) - data.append("NEW Directory ").append(name).append("\n"); - break; - case 2: // user stream (file) - if (name.endsWith(".gz")) - name = name.substring(0, name.length() - 3); - appendData(data, name, thisEntry, binaryFileList.indexOf("|" + thisEntry.entryName + "|") >= 0); - break; - } - } - close(); - return data; - } - - private SB appendData(SB data, String name, CompoundDocDirEntry thisEntry, - boolean isBinary) { - data.append("BEGIN Directory Entry ").append(name).append("\n"); - data.appendSB(getEntryAsString(thisEntry, isBinary)); - data.append("\nEND Directory Entry ").append(name).append("\n"); - return data; - } - - public SB getFileAsString(String entryName) { - for (int i = 0; i < directory.size(); i++) { - CompoundDocDirEntry thisEntry = directory.get(i); - if (thisEntry.entryName.equals(entryName)) - return getEntryAsString(thisEntry, false); - } - return new SB(); - } - - private long getOffset(int SID) { - return (SID + 1) * sectorSize; - } - - private void gotoSector(int SID) { - seek(getOffset(SID)); - } - - private boolean readHeader() { - if (!header.readData()) - return false; - sectorSize = 1 << header.sectorPower; - shortSectorSize = 1 << header.shortSectorPower; - nShortSectorsPerStandardSector = sectorSize / shortSectorSize; // e.g. 512 / 64 = 8 - nIntPerSector = sectorSize / 4; // e.g. 512 / 4 = 128 - nDirEntriesperSector = sectorSize / 128; // e.g. 512 / 128 = 4 -// System.out.println( -// "compound document: revNum=" + header.revNumber + -// " verNum=" + header.verNumber + " isBigEndian=" + isBigEndian + -// " bytes per standard/short sector=" + sectorSize + "/" + shortSectorSize); - return true; - } - - private void getSectorAllocationTable() { - int nSID = 0; - int thisSID; - SAT = new int[header.nSATsectors * nIntPerSector + 109]; - - try { - for (int i = 0; i < 109; i++) { - thisSID = header.MSAT0[i]; - if (thisSID < 0) - break; - gotoSector(thisSID); - for (int j = 0; j < nIntPerSector; j++) { - SAT[nSID++] = readInt(); - //Logger.debug(thisSID+"."+j + "/" + (nSID - 1) + " : " + SAT[nSID - 1]); - } - } - int nMaster = header.nAdditionalMATsectors; - thisSID = header.SID_MSAT_next; - int[] MSAT = new int[nIntPerSector]; - out: while (nMaster-- > 0 && thisSID >= 0) { - // read a page of sector identifiers pointing to SAT sectors - gotoSector(thisSID); - for (int i = 0; i < nIntPerSector; i++) - MSAT[i] = readInt(); - // read each page of SAT sector identifiers - // last entry is pointer to next master sector allocation table page - for (int i = 0; i < nIntPerSector - 1; i++) { - thisSID = MSAT[i]; - if (thisSID < 0) - break out; - gotoSector(thisSID); - for (int j = nIntPerSector; --j >= 0;) - SAT[nSID++] = readInt(); - } - thisSID = MSAT[nIntPerSector - 1]; - } - } catch (Exception e) { - System.out.println(e.toString()); - } - } - - private void getShortSectorAllocationTable() { - int nSSID = 0; - int thisSID = header.SID_SSAT_start; - int nMax = header.nSSATsectors * nIntPerSector; - SSAT = new int[nMax]; - try { - while (thisSID > 0 && nSSID < nMax) { - gotoSector(thisSID); - for (int j = 0; j < nIntPerSector; j++) { - SSAT[nSSID++] = readInt(); - //System.out.println("short: " + thisSID+"."+j+" SSID=" +(nSSID-1)+" "+SSAT[nSSID-1]); - } - thisSID = SAT[thisSID]; - } - } catch (Exception e) { - System.out.println(e.toString()); - } - } - - private void getDirectoryTable() { - int thisSID = header.SID_DIR_start; - CompoundDocDirEntry thisEntry; - rootEntry = null; - try { - while (thisSID > 0) { - gotoSector(thisSID); - for (int j = nDirEntriesperSector; --j >= 0;) { - thisEntry = new CompoundDocDirEntry(this); - thisEntry.readData(); - directory.addLast(thisEntry); - if (thisEntry.entryType == 5) - rootEntry = thisEntry; - } - thisSID = SAT[thisSID]; - } - } catch (Exception e) { - System.out.println(e.toString()); - } -// System.out.println("CompoundDocument directory entry: \n" -// + getDirectoryListing("\n")); - } - - private SB getEntryAsString(CompoundDocDirEntry thisEntry, boolean asBinaryString) { - if(thisEntry.isEmpty) - return new SB(); - //System.out.println(thisEntry.entryName + " " + thisEntry.entryType + " " + thisEntry.lenStream + " " + thisEntry.isStandard + " " + thisEntry.SIDfirstSector); - return (thisEntry.isStandard ? getStandardStringData( - thisEntry.SIDfirstSector, thisEntry.lenStream, asBinaryString) - : getShortStringData(thisEntry.SIDfirstSector, thisEntry.lenStream, asBinaryString)); - } - private SB getStandardStringData(int thisSID, int nBytes, - boolean asBinaryString) { - SB data = new SB(); - byte[] byteBuf = new byte[sectorSize]; - ZipData gzipData = new ZipData(nBytes); - try { - while (thisSID > 0 && nBytes > 0) { - gotoSector(thisSID); - nBytes = getSectorData(data, byteBuf, sectorSize, nBytes, asBinaryString, gzipData); - thisSID = SAT[thisSID]; - } - if (nBytes == -9999) - return new SB(); - } catch (Exception e) { - System.out.println(e.toString()); - } - if (gzipData.isEnabled) - gzipData.addTo(jzt, data); - return data; - } - - private int getSectorData(SB data, byte[] byteBuf, - int nSectorBytes, int nBytes, - boolean asBinaryString, ZipData gzipData) - throws Exception { - readByteArray(byteBuf, 0, byteBuf.length); - int n = gzipData.addBytes(byteBuf, nSectorBytes, nBytes); - if (n >= 0) - return n; - if (asBinaryString) { - for (int i = 0; i < nSectorBytes; i++) { - data.append(Integer.toHexString(byteBuf[i] & 0xFF)).appendC(' '); - if (--nBytes < 1) - break; - } - } else { - for (int i = 0; i < nSectorBytes; i++) { - if (byteBuf[i] == 0) - return -9999; // don't allow binary data - data.appendC((char) byteBuf[i]); - if (--nBytes < 1) - break; - } - } - return nBytes; - } - - private SB getShortStringData(int shortSID, int nBytes, boolean asBinaryString) { - SB data = new SB(); - if (rootEntry == null) - return data; - int thisSID = rootEntry.SIDfirstSector; - int ptShort = 0; - byte[] byteBuf = new byte[shortSectorSize]; - ZipData gzipData = new ZipData(nBytes); - try { - //System.out.println("CD shortSID=" + shortSID); - // point to correct short data sector, 512/64 = 4 per page - while (thisSID >= 0 && shortSID >= 0 && nBytes > 0) { - while (shortSID - ptShort >= nShortSectorsPerStandardSector) { - ptShort += nShortSectorsPerStandardSector; - thisSID = SAT[thisSID]; - } - seek(getOffset(thisSID) + (shortSID - ptShort) * shortSectorSize); - nBytes = getSectorData(data, byteBuf, shortSectorSize, nBytes, asBinaryString, gzipData); - shortSID = SSAT[shortSID]; - //System.out.println("CD shortSID=" + shortSID); - } - } catch (Exception e) { - System.out.println(data.toString()); - System.out.println("reader error in CompoundDocument " + e.toString()); - } - if (gzipData.isEnabled) - gzipData.addTo(jzt, data); - return data; - } -} diff --git a/src2/javajs/util/DF.java b/src2/javajs/util/DF.java deleted file mode 100644 index b5c8717..0000000 --- a/src2/javajs/util/DF.java +++ /dev/null @@ -1,174 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2007-04-26 16:57:51 -0500 (Thu, 26 Apr 2007) $ - * $Revision: 7502 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package javajs.util; - -/** - * created to remove ambiguities and make a simpler DecimalFormat - */ -public class DF { - - private final static String[] formattingStrings = { "0", "0.0", "0.00", - "0.000", "0.0000", "0.00000", "0.000000", "0.0000000", "0.00000000", - "0.000000000" }; - private final static String zeros = "0000000000000000000000000000000000000000"; - - private final static float[] formatAdds = { 0.5f, 0.05f, 0.005f, 0.0005f, - 0.00005f, 0.000005f, 0.0000005f, 0.00000005f, 0.000000005f, 0.0000000005f }; - - private final static Boolean[] useNumberLocalization = new Boolean[] { Boolean.TRUE }; - - public static void setUseNumberLocalization(boolean TF) { - useNumberLocalization[0] = (TF ? Boolean.TRUE : Boolean.FALSE); - } - - public static String formatDecimalDbl(double value, int decimalDigits) { - if (decimalDigits == Integer.MAX_VALUE - || value == Double.NEGATIVE_INFINITY - || value == Double.POSITIVE_INFINITY - || Double.isNaN(value)) - return "" + value; - return DF.formatDecimal((float) value, decimalDigits); - } - - /** - * a simple alternative to DecimalFormat (which Java2Script does not have - * and which is quite too complex for our use here.) - * - * @param value - * @param decimalDigits - * @return formatted decimal - */ - public static String formatDecimal(float value, int decimalDigits) { - if (decimalDigits == Integer.MAX_VALUE - || value == Float.NEGATIVE_INFINITY || value == Float.POSITIVE_INFINITY || Float.isNaN(value)) - return "" + value; - int n; - if (decimalDigits < 0) { - decimalDigits = -decimalDigits; - if (decimalDigits > formattingStrings.length) - decimalDigits = formattingStrings.length; - if (value == 0) - return formattingStrings[decimalDigits - 1] + "E+0"; - //scientific notation - n = 0; - double d; - if (Math.abs(value) < 1) { - n = 10; - d = value * 1e-10; - } else { - n = -10; - d = value * 1e10; - } - String s = ("" + d).toUpperCase(); - int i = s.indexOf("E"); - n = PT.parseInt(s.substring(i + 1)) + n; - String sf; - if (i < 0) { - sf = "" + value; - } else { - float f = PT.parseFloat(s.substring(0, i)); - if (f == 10 || f == -10) { - //d = 9.99999997465; n = -6 --> 10.00000E-5 - f /= 10; - n += (n < 0 ? 1 : -1); - } - sf = formatDecimal(f, decimalDigits - 1); - } - return sf + "E" + (n >= 0 ? "+" : "") + n; - } - - if (decimalDigits >= formattingStrings.length) - decimalDigits = formattingStrings.length - 1; - String s1 = ("" + value).toUpperCase(); - int pt = s1.indexOf("."); - if (pt < 0) // specifically JavaScript "-2" not "-2.0" - return s1 + formattingStrings[decimalDigits].substring(1); - boolean isNeg = s1.startsWith("-"); - if (isNeg) { - s1 = s1.substring(1); - pt--; - } - int pt1 = s1.indexOf("E-"); - if (pt1 > 0) { - n = PT.parseInt(s1.substring(pt1 + 1)); - // 3.567E-2 - // 0.03567 - s1 = "0." + zeros.substring(0, -n - 1) + s1.substring(0, 1) + s1.substring(2, pt1); - pt = 1; - } - - pt1 = s1.indexOf("E"); - // 3.5678E+3 - // 3567.800000000 - // 1.234E10 %3.8f -> 12340000000.00000000 - if (pt1 > 0) { - n = PT.parseInt(s1.substring(pt1 + 1)); - s1 = s1.substring(0, 1) + s1.substring(2, pt1) + zeros; - s1 = s1.substring(0, n + 1) + "." + s1.substring(n + 1); - pt = s1.indexOf("."); - } - // "234.345667 len == 10; pt = 3 - // " 0.0 " decimalDigits = 1 - - int len = s1.length(); - int pt2 = decimalDigits + pt + 1; - if (pt2 < len && s1.charAt(pt2) >= '5') { - return formatDecimal( - value + (isNeg ? -1 : 1) * formatAdds[decimalDigits], decimalDigits); - } - - SB sb = SB.newS(s1.substring(0, (decimalDigits == 0 ? pt - : ++pt))); - for (int i = 0; i < decimalDigits; i++, pt++) { - if (pt < len) - sb.appendC(s1.charAt(pt)); - else - sb.appendC('0'); - } - s1 = (isNeg ? "-" : "") + sb; - return (Boolean.TRUE.equals(useNumberLocalization[0]) ? s1 : s1.replace(',', - '.')); - } - - /** - * an alternative to DecimalFormat "0.#" - * - * @param x - * @param precision - * @return formatted number - */ - public static String formatDecimalTrimmed(double x, int precision) { - String str = formatDecimalDbl(x, precision); - int m = str.length() - 1; - char zero = '0'; - while (m >= 0 && str.charAt(m) == zero) - m--; - return str.substring(0, m + 1); // 0.##... - } - -} diff --git a/src2/javajs/util/DataReader.java b/src2/javajs/util/DataReader.java deleted file mode 100644 index 1eb8ade..0000000 --- a/src2/javajs/util/DataReader.java +++ /dev/null @@ -1,56 +0,0 @@ -package javajs.util; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; - -/** - * Just a simple abstract class to join a String reader and a String[] - * reader under the same BufferedReader umbrella. - * - * Subclassed as StringDataReader, ArrayDataReader, and ListDataReader - * - */ - -public abstract class DataReader extends BufferedReader { - - public abstract DataReader setData(Object data); - - protected int ptMark; - - public DataReader() { - super(new StringReader("")); - } - - protected DataReader(Reader in) { - super(in); - } - - public BufferedReader getBufferedReader() { - return this; - } - - protected int readBuf(char[] buf, int off, int len) throws IOException { - // not used by StringDataReader - int nRead = 0; - String line = readLine(); - if (line == null) - return 0; - int linept = 0; - int linelen = line.length(); - for (int i = off; i < len && linelen >= 0; i++) { - if (linept >= linelen) { - linept = 0; - buf[i] = '\n'; - line = readLine(); - linelen = (line == null ? -1 : line.length()); - } else { - buf[i] = line.charAt(linept++); - } - nRead++; - } - return nRead; - } - -} \ No newline at end of file diff --git a/src2/javajs/util/DebugJS.java b/src2/javajs/util/DebugJS.java deleted file mode 100644 index ab22558..0000000 --- a/src2/javajs/util/DebugJS.java +++ /dev/null @@ -1,28 +0,0 @@ -package javajs.util; - -/** - * A class to insert a JavaScript debug statement for Firefox or Chrome debugger - * - */ - -public class DebugJS { - - /** - * Insert a JavaScript debug statement - * - */ - public static void _(String msg) { - /** - * @j2sNative - * - * if (Clazz._debugging) { - * - * debugger; - * - * } - * - */ - {} - } - -} diff --git a/src2/javajs/util/Eigen.java b/src2/javajs/util/Eigen.java deleted file mode 100644 index 52736c0..0000000 --- a/src2/javajs/util/Eigen.java +++ /dev/null @@ -1,1063 +0,0 @@ -/* $RCSfile$ - * $Author: egonw $ - * $Date: 2005-11-10 09:52:44f -0600 (Thu, 10 Nov 2005) $ - * $Revision: 4255 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2003-2005 Miguel, Jmol Development, www.jmol.org - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package javajs.util; - -import javajs.api.EigenInterface; - - -/** - * Eigenvalues and eigenvectors of a real matrix. - * See javajs.api.EigenInterface() as well. - * - * adapted by Bob Hanson from http://math.nist.gov/javanumerics/jama/ (public - * domain); adding quaternion superimposition capability; removing - * nonsymmetric reduction to Hessenberg form, which we do not need in Jmol. - * - * Output is as a set of double[n] columns, but for the EigenInterface - * we return them as V3[3] and float[3] (or double[3]) values. - * - * Eigenvalues and eigenvectors are sorted from smallest to largest eigenvalue. - * - *

- * If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is diagonal - * and the eigenvector matrix V is orthogonal. I.e. A = - * V.times(D.times(V.transpose())) and V.times(V.transpose()) equals the - * identity matrix. - *

- * If A is not symmetric, then the eigenvalue matrix D is block diagonal with - * the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, lambda + - * i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The columns of V represent - * the eigenvectors in the sense that A*V = V*D, i.e. A.times(V) equals - * V.times(D). The matrix V may be badly conditioned, or even singular, so the - * validity of the equation A = V*D*inverse(V) depends upon V.cond(). - **/ - -public class Eigen implements EigenInterface { - - /* ------------------------ - Public Methods - * ------------------------ */ - - public Eigen() {} - - public Eigen set(int n) { - this.n = n; - V = new double[n][n]; - d = new double[n]; - e = new double[n]; - return this; - } - - @Override - public Eigen setM(double[][] m) { - set(m.length); - calc(m); - return this; - } - - /** - * return values sorted from smallest to largest value. - */ - @Override - public double[] getEigenvalues() { - return d; - } - - /** - * Specifically for 3x3 systems, returns eigenVectors as V3[3] - * and values as float[3]; sorted from smallest to largest value. - * - * @param eigenVectors returned vectors - * @param eigenValues returned values - * - */ - @Override - public void fillFloatArrays(V3[] eigenVectors, float[] eigenValues) { - for (int i = 0; i < 3; i++) { - if (eigenVectors != null) { - if (eigenVectors[i] == null) - eigenVectors[i] = new V3(); - eigenVectors[i].set((float) V[0][i], (float) V[1][i], (float) V[2][i]); - } - if (eigenValues != null) - eigenValues[i] = (float) d[i]; - } - } - - /** - * Transpose V and turn into floats; sorted from smallest to largest value. - * - * @return ROWS of eigenvectors f[0], f[1], f[2], etc. - */ - @Override - public float[][] getEigenvectorsFloatTransposed() { - float[][] f = new float[n][n]; - for (int i = n; --i >= 0;) - for (int j = n; --j >= 0;) - f[j][i] = (float) V[i][j]; - return f; - } - - - /** - * Check for symmetry, then construct the eigenvalue decomposition - * - * @param A - * Square matrix - */ - - public void calc(double[][] A) { - - /* Jmol only has need of symmetric solutions - * - issymmetric = true; - - for (int j = 0; (j < n) & issymmetric; j++) { - for (int i = 0; (i < n) & issymmetric; i++) { - issymmetric = (A[i][j] == A[j][i]); - } - } - - if (issymmetric) { - */ - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - V[i][j] = A[i][j]; - } - } - - // Tridiagonalize. - tred2(); - - // Diagonalize. - tql2(); - /* - } else { - H = new double[n][n]; - ort = new double[n]; - - for (int j = 0; j < n; j++) { - for (int i = 0; i < n; i++) { - H[i][j] = A[i][j]; - } - } - - // Reduce to Hessenberg form. - orthes(); - - // Reduce Hessenberg to real Schur form. - hqr2(); - } - */ - - } - - /** - * Return the real parts of the eigenvalues - * - * @return real(diag(D)) - */ - - public double[] getRealEigenvalues() { - return d; - } - - /** - * Return the imaginary parts of the eigenvalues - * - * @return imag(diag(D)) - */ - - public double[] getImagEigenvalues() { - return e; - } - - /* ------------------------ - Class variables - * ------------------------ */ - - /** - * Row and column dimension (square matrix). - * - * @serial matrix dimension. - */ - private int n = 3; - - /** - * Symmetry flag. - * - * @serial internal symmetry flag. - */ - //private boolean issymmetric = true; - - /** - * Arrays for internal storage of eigenvalues. - * - * @serial internal storage of eigenvalues. - */ - private double[] d, e; - - /** - * Array for internal storage of eigenvectors. - * - * @serial internal storage of eigenvectors. - */ - private double[][] V; - - /** - * Array for internal storage of nonsymmetric Hessenberg form. - * - * @serial internal storage of nonsymmetric Hessenberg form. - */ - //private double[][] H; - - /** - * Working storage for nonsymmetric algorithm. - * - * @serial working storage for nonsymmetric algorithm. - */ - //private double[] ort; - - /* ------------------------ - Private Methods - * ------------------------ */ - - // Symmetric Householder reduction to tridiagonal form. - - private void tred2() { - - // This is derived from the Algol procedures tred2 by - // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for - // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding - // Fortran subroutine in EISPACK. - - for (int j = 0; j < n; j++) { - d[j] = V[n - 1][j]; - } - - // Householder reduction to tridiagonal form. - - for (int i = n - 1; i > 0; i--) { - - // Scale to avoid under/overflow. - - double scale = 0.0; - double h = 0.0; - for (int k = 0; k < i; k++) { - scale = scale + Math.abs(d[k]); - } - if (scale == 0.0) { - e[i] = d[i - 1]; - for (int j = 0; j < i; j++) { - d[j] = V[i - 1][j]; - V[i][j] = 0.0; - V[j][i] = 0.0; - } - } else { - - // Generate Householder vector. - - for (int k = 0; k < i; k++) { - d[k] /= scale; - h += d[k] * d[k]; - } - double f = d[i - 1]; - double g = Math.sqrt(h); - if (f > 0) { - g = -g; - } - e[i] = scale * g; - h = h - f * g; - d[i - 1] = f - g; - for (int j = 0; j < i; j++) { - e[j] = 0.0; - } - - // Apply similarity transformation to remaining columns. - - for (int j = 0; j < i; j++) { - f = d[j]; - V[j][i] = f; - g = e[j] + V[j][j] * f; - for (int k = j + 1; k <= i - 1; k++) { - g += V[k][j] * d[k]; - e[k] += V[k][j] * f; - } - e[j] = g; - } - f = 0.0; - for (int j = 0; j < i; j++) { - e[j] /= h; - f += e[j] * d[j]; - } - double hh = f / (h + h); - for (int j = 0; j < i; j++) { - e[j] -= hh * d[j]; - } - for (int j = 0; j < i; j++) { - f = d[j]; - g = e[j]; - for (int k = j; k <= i - 1; k++) { - V[k][j] -= (f * e[k] + g * d[k]); - } - d[j] = V[i - 1][j]; - V[i][j] = 0.0; - } - } - d[i] = h; - } - - // Accumulate transformations. - - for (int i = 0; i < n - 1; i++) { - V[n - 1][i] = V[i][i]; - V[i][i] = 1.0; - double h = d[i + 1]; - if (h != 0.0) { - for (int k = 0; k <= i; k++) { - d[k] = V[k][i + 1] / h; - } - for (int j = 0; j <= i; j++) { - double g = 0.0; - for (int k = 0; k <= i; k++) { - g += V[k][i + 1] * V[k][j]; - } - for (int k = 0; k <= i; k++) { - V[k][j] -= g * d[k]; - } - } - } - for (int k = 0; k <= i; k++) { - V[k][i + 1] = 0.0; - } - } - for (int j = 0; j < n; j++) { - d[j] = V[n - 1][j]; - V[n - 1][j] = 0.0; - } - V[n - 1][n - 1] = 1.0; - e[0] = 0.0; - } - - // Symmetric tridiagonal QL algorithm. - - private void tql2() { - - // This is derived from the Algol procedures tql2, by - // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for - // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding - // Fortran subroutine in EISPACK. - - for (int i = 1; i < n; i++) { - e[i - 1] = e[i]; - } - e[n - 1] = 0.0; - - double f = 0.0; - double tst1 = 0.0; - double eps = Math.pow(2.0, -52.0); - for (int l = 0; l < n; l++) { - - // Find small subdiagonal element - - tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l])); - int m = l; - while (m < n) { - if (Math.abs(e[m]) <= eps * tst1) { - break; - } - m++; - } - - // If m == l, d[l] is an eigenvalue, - // otherwise, iterate. - - if (m > l) { - int iter = 0; - do { - iter = iter + 1; // (Could check iteration count here.) - - // Compute implicit shift - - double g = d[l]; - double p = (d[l + 1] - g) / (2.0 * e[l]); - double r = hypot(p, 1.0); - if (p < 0) { - r = -r; - } - d[l] = e[l] / (p + r); - d[l + 1] = e[l] * (p + r); - double dl1 = d[l + 1]; - double h = g - d[l]; - for (int i = l + 2; i < n; i++) { - d[i] -= h; - } - f = f + h; - - // Implicit QL transformation. - - p = d[m]; - double c = 1.0; - double c2 = c; - double c3 = c; - double el1 = e[l + 1]; - double s = 0.0; - double s2 = 0.0; - for (int i = m - 1; i >= l; i--) { - c3 = c2; - c2 = c; - s2 = s; - g = c * e[i]; - h = c * p; - r = hypot(p, e[i]); - e[i + 1] = s * r; - s = e[i] / r; - c = p / r; - p = c * d[i] - s * g; - d[i + 1] = h + s * (c * g + s * d[i]); - - // Accumulate transformation. - - for (int k = 0; k < n; k++) { - h = V[k][i + 1]; - V[k][i + 1] = s * V[k][i] + c * h; - V[k][i] = c * V[k][i] - s * h; - } - } - p = -s * s2 * c3 * el1 * e[l] / dl1; - e[l] = s * p; - d[l] = c * p; - - // Check for convergence. - - } while (Math.abs(e[l]) > eps * tst1); - } - d[l] = d[l] + f; - e[l] = 0.0; - } - - // Sort eigenvalues and corresponding vectors. - - for (int i = 0; i < n - 1; i++) { - int k = i; - double p = d[i]; - for (int j = i + 1; j < n; j++) { - if (d[j] < p) { - k = j; - p = d[j]; - } - } - if (k != i) { - d[k] = d[i]; - d[i] = p; - for (int j = 0; j < n; j++) { - p = V[j][i]; - V[j][i] = V[j][k]; - V[j][k] = p; - } - } - } - } - - private static double hypot(double a, double b) { - - // sqrt(a^2 + b^2) without under/overflow. - - double r; - if (Math.abs(a) > Math.abs(b)) { - r = b / a; - r = Math.abs(a) * Math.sqrt(1 + r * r); - } else if (b != 0) { - r = a / b; - r = Math.abs(b) * Math.sqrt(1 + r * r); - } else { - r = 0.0; - } - return r; - } - - // Nonsymmetric reduction to Hessenberg form. - - /* - private void orthes() { - - // This is derived from the Algol procedures orthes and ortran, - // by Martin and Wilkinson, Handbook for Auto. Comp., - // Vol.ii-Linear Algebra, and the corresponding - // Fortran subroutines in EISPACK. - - int low = 0; - int high = n - 1; - - for (int m = low + 1; m <= high - 1; m++) { - - // Scale column. - - double scale = 0.0; - for (int i = m; i <= high; i++) { - scale = scale + Math.abs(H[i][m - 1]); - } - if (scale != 0.0) { - - // Compute Householder transformation. - - double h = 0.0; - for (int i = high; i >= m; i--) { - ort[i] = H[i][m - 1] / scale; - h += ort[i] * ort[i]; - } - double g = Math.sqrt(h); - if (ort[m] > 0) { - g = -g; - } - h = h - ort[m] * g; - ort[m] = ort[m] - g; - - // Apply Householder similarity transformation - // H = (I-u*u'/h)*H*(I-u*u')/h) - - for (int j = m; j < n; j++) { - double f = 0.0; - for (int i = high; i >= m; i--) { - f += ort[i] * H[i][j]; - } - f = f / h; - for (int i = m; i <= high; i++) { - H[i][j] -= f * ort[i]; - } - } - - for (int i = 0; i <= high; i++) { - double f = 0.0; - for (int j = high; j >= m; j--) { - f += ort[j] * H[i][j]; - } - f = f / h; - for (int j = m; j <= high; j++) { - H[i][j] -= f * ort[j]; - } - } - ort[m] = scale * ort[m]; - H[m][m - 1] = scale * g; - } - } - - // Accumulate transformations (Algol's ortran). - - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - V[i][j] = (i == j ? 1.0 : 0.0); - } - } - - for (int m = high - 1; m >= low + 1; m--) { - if (H[m][m - 1] != 0.0) { - for (int i = m + 1; i <= high; i++) { - ort[i] = H[i][m - 1]; - } - for (int j = m; j <= high; j++) { - double g = 0.0; - for (int i = m; i <= high; i++) { - g += ort[i] * V[i][j]; - } - // Double division avoids possible underflow - g = (g / ort[m]) / H[m][m - 1]; - for (int i = m; i <= high; i++) { - V[i][j] += g * ort[i]; - } - } - } - } - } - - // Complex scalar division. - - private transient double cdivr, cdivi; - - private void cdiv(double xr, double xi, double yr, double yi) { - double r, d; - if (Math.abs(yr) > Math.abs(yi)) { - r = yi / yr; - d = yr + r * yi; - cdivr = (xr + r * xi) / d; - cdivi = (xi - r * xr) / d; - } else { - r = yr / yi; - d = yi + r * yr; - cdivr = (r * xr + xi) / d; - cdivi = (r * xi - xr) / d; - } - } - - // Nonsymmetric reduction from Hessenberg to real Schur form. - - private void hqr2() { - - // This is derived from the Algol procedure hqr2, - // by Martin and Wilkinson, Handbook for Auto. Comp., - // Vol.ii-Linear Algebra, and the corresponding - // Fortran subroutine in EISPACK. - - // Initialize - - int nn = this.n; - int n = nn - 1; - int low = 0; - int high = nn - 1; - double eps = Math.pow(2.0, -52.0); - double exshift = 0.0; - double p = 0, q = 0, r = 0, s = 0, z = 0, t, w, x, y; - - // Store roots isolated by balanc and compute matrix norm - - double norm = 0.0; - for (int i = 0; i < nn; i++) { - if (i < low || i > high) { - d[i] = H[i][i]; - e[i] = 0.0; - } - for (int j = Math.max(i - 1, 0); j < nn; j++) { - norm = norm + Math.abs(H[i][j]); - } - } - - // Outer loop over eigenvalue index - - int iter = 0; - while (n >= low) { - - // Look for single small sub-diagonal element - - int l = n; - while (l > low) { - s = Math.abs(H[l - 1][l - 1]) + Math.abs(H[l][l]); - if (s == 0.0) { - s = norm; - } - if (Math.abs(H[l][l - 1]) < eps * s) { - break; - } - l--; - } - - // Check for convergence - // One root found - - if (l == n) { - H[n][n] = H[n][n] + exshift; - d[n] = H[n][n]; - e[n] = 0.0; - n--; - iter = 0; - - // Two roots found - - } else if (l == n - 1) { - w = H[n][n - 1] * H[n - 1][n]; - p = (H[n - 1][n - 1] - H[n][n]) / 2.0; - q = p * p + w; - z = Math.sqrt(Math.abs(q)); - H[n][n] = H[n][n] + exshift; - H[n - 1][n - 1] = H[n - 1][n - 1] + exshift; - x = H[n][n]; - - // Real pair - - if (q >= 0) { - if (p >= 0) { - z = p + z; - } else { - z = p - z; - } - d[n - 1] = x + z; - d[n] = d[n - 1]; - if (z != 0.0) { - d[n] = x - w / z; - } - e[n - 1] = 0.0; - e[n] = 0.0; - x = H[n][n - 1]; - s = Math.abs(x) + Math.abs(z); - p = x / s; - q = z / s; - r = Math.sqrt(p * p + q * q); - p = p / r; - q = q / r; - - // Row modification - - for (int j = n - 1; j < nn; j++) { - z = H[n - 1][j]; - H[n - 1][j] = q * z + p * H[n][j]; - H[n][j] = q * H[n][j] - p * z; - } - - // Column modification - - for (int i = 0; i <= n; i++) { - z = H[i][n - 1]; - H[i][n - 1] = q * z + p * H[i][n]; - H[i][n] = q * H[i][n] - p * z; - } - - // Accumulate transformations - - for (int i = low; i <= high; i++) { - z = V[i][n - 1]; - V[i][n - 1] = q * z + p * V[i][n]; - V[i][n] = q * V[i][n] - p * z; - } - - // Complex pair - - } else { - d[n - 1] = x + p; - d[n] = x + p; - e[n - 1] = z; - e[n] = -z; - } - n = n - 2; - iter = 0; - - // No convergence yet - - } else { - - // Form shift - - x = H[n][n]; - y = 0.0; - w = 0.0; - if (l < n) { - y = H[n - 1][n - 1]; - w = H[n][n - 1] * H[n - 1][n]; - } - - // Wilkinson's original ad hoc shift - - if (iter == 10) { - exshift += x; - for (int i = low; i <= n; i++) { - H[i][i] -= x; - } - s = Math.abs(H[n][n - 1]) + Math.abs(H[n - 1][n - 2]); - x = y = 0.75 * s; - w = -0.4375 * s * s; - } - - // MATLAB's new ad hoc shift - - if (iter == 30) { - s = (y - x) / 2.0; - s = s * s + w; - if (s > 0) { - s = Math.sqrt(s); - if (y < x) { - s = -s; - } - s = x - w / ((y - x) / 2.0 + s); - for (int i = low; i <= n; i++) { - H[i][i] -= s; - } - exshift += s; - x = y = w = 0.964; - } - } - - iter = iter + 1; // (Could check iteration count here.) - - // Look for two consecutive small sub-diagonal elements - - int m = n - 2; - while (m >= l) { - z = H[m][m]; - r = x - z; - s = y - z; - p = (r * s - w) / H[m + 1][m] + H[m][m + 1]; - q = H[m + 1][m + 1] - z - r - s; - r = H[m + 2][m + 1]; - s = Math.abs(p) + Math.abs(q) + Math.abs(r); - p = p / s; - q = q / s; - r = r / s; - if (m == l) { - break; - } - if (Math.abs(H[m][m - 1]) * (Math.abs(q) + Math.abs(r)) < eps - * (Math.abs(p) * (Math.abs(H[m - 1][m - 1]) + Math.abs(z) + Math - .abs(H[m + 1][m + 1])))) { - break; - } - m--; - } - - for (int i = m + 2; i <= n; i++) { - H[i][i - 2] = 0.0; - if (i > m + 2) { - H[i][i - 3] = 0.0; - } - } - - // Double QR step involving rows l:n and columns m:n - - for (int k = m; k <= n - 1; k++) { - boolean notlast = (k != n - 1); - if (k != m) { - p = H[k][k - 1]; - q = H[k + 1][k - 1]; - r = (notlast ? H[k + 2][k - 1] : 0.0); - x = Math.abs(p) + Math.abs(q) + Math.abs(r); - if (x != 0.0) { - p = p / x; - q = q / x; - r = r / x; - } - } - if (x == 0.0) { - break; - } - s = Math.sqrt(p * p + q * q + r * r); - if (p < 0) { - s = -s; - } - if (s != 0) { - if (k != m) { - H[k][k - 1] = -s * x; - } else if (l != m) { - H[k][k - 1] = -H[k][k - 1]; - } - p = p + s; - x = p / s; - y = q / s; - z = r / s; - q = q / p; - r = r / p; - - // Row modification - - for (int j = k; j < nn; j++) { - p = H[k][j] + q * H[k + 1][j]; - if (notlast) { - p = p + r * H[k + 2][j]; - H[k + 2][j] = H[k + 2][j] - p * z; - } - H[k][j] = H[k][j] - p * x; - H[k + 1][j] = H[k + 1][j] - p * y; - } - - // Column modification - - for (int i = 0; i <= Math.min(n, k + 3); i++) { - p = x * H[i][k] + y * H[i][k + 1]; - if (notlast) { - p = p + z * H[i][k + 2]; - H[i][k + 2] = H[i][k + 2] - p * r; - } - H[i][k] = H[i][k] - p; - H[i][k + 1] = H[i][k + 1] - p * q; - } - - // Accumulate transformations - - for (int i = low; i <= high; i++) { - p = x * V[i][k] + y * V[i][k + 1]; - if (notlast) { - p = p + z * V[i][k + 2]; - V[i][k + 2] = V[i][k + 2] - p * r; - } - V[i][k] = V[i][k] - p; - V[i][k + 1] = V[i][k + 1] - p * q; - } - } // (s != 0) - } // k loop - } // check convergence - } // while (n >= low) - - // Backsubstitute to find vectors of upper triangular form - - if (norm == 0.0) { - return; - } - - for (n = nn - 1; n >= 0; n--) { - p = d[n]; - q = e[n]; - - // Real vector - - if (q == 0) { - int l = n; - H[n][n] = 1.0; - for (int i = n - 1; i >= 0; i--) { - w = H[i][i] - p; - r = 0.0; - for (int j = l; j <= n; j++) { - r = r + H[i][j] * H[j][n]; - } - if (e[i] < 0.0) { - z = w; - s = r; - } else { - l = i; - if (e[i] == 0.0) { - if (w != 0.0) { - H[i][n] = -r / w; - } else { - H[i][n] = -r / (eps * norm); - } - - // Solve real equations - - } else { - x = H[i][i + 1]; - y = H[i + 1][i]; - q = (d[i] - p) * (d[i] - p) + e[i] * e[i]; - t = (x * s - z * r) / q; - H[i][n] = t; - if (Math.abs(x) > Math.abs(z)) { - H[i + 1][n] = (-r - w * t) / x; - } else { - H[i + 1][n] = (-s - y * t) / z; - } - } - - // Overflow control - - t = Math.abs(H[i][n]); - if ((eps * t) * t > 1) { - for (int j = i; j <= n; j++) { - H[j][n] = H[j][n] / t; - } - } - } - } - - // Complex vector - - } else if (q < 0) { - int l = n - 1; - - // Last vector component imaginary so matrix is triangular - - if (Math.abs(H[n][n - 1]) > Math.abs(H[n - 1][n])) { - H[n - 1][n - 1] = q / H[n][n - 1]; - H[n - 1][n] = -(H[n][n] - p) / H[n][n - 1]; - } else { - cdiv(0.0, -H[n - 1][n], H[n - 1][n - 1] - p, q); - H[n - 1][n - 1] = cdivr; - H[n - 1][n] = cdivi; - } - H[n][n - 1] = 0.0; - H[n][n] = 1.0; - for (int i = n - 2; i >= 0; i--) { - double ra, sa, vr, vi; - ra = 0.0; - sa = 0.0; - for (int j = l; j <= n; j++) { - ra = ra + H[i][j] * H[j][n - 1]; - sa = sa + H[i][j] * H[j][n]; - } - w = H[i][i] - p; - - if (e[i] < 0.0) { - z = w; - r = ra; - s = sa; - } else { - l = i; - if (e[i] == 0) { - cdiv(-ra, -sa, w, q); - H[i][n - 1] = cdivr; - H[i][n] = cdivi; - } else { - - // Solve complex equations - - x = H[i][i + 1]; - y = H[i + 1][i]; - vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q; - vi = (d[i] - p) * 2.0 * q; - if (vr == 0.0 & vi == 0.0) { - vr = eps - * norm - * (Math.abs(w) + Math.abs(q) + Math.abs(x) + Math.abs(y) + Math - .abs(z)); - } - cdiv(x * r - z * ra + q * sa, x * s - z * sa - q * ra, vr, vi); - H[i][n - 1] = cdivr; - H[i][n] = cdivi; - if (Math.abs(x) > (Math.abs(z) + Math.abs(q))) { - H[i + 1][n - 1] = (-ra - w * H[i][n - 1] + q * H[i][n]) / x; - H[i + 1][n] = (-sa - w * H[i][n] - q * H[i][n - 1]) / x; - } else { - cdiv(-r - y * H[i][n - 1], -s - y * H[i][n], z, q); - H[i + 1][n - 1] = cdivr; - H[i + 1][n] = cdivi; - } - } - - // Overflow control - - t = Math.max(Math.abs(H[i][n - 1]), Math.abs(H[i][n])); - if ((eps * t) * t > 1) { - for (int j = i; j <= n; j++) { - H[j][n - 1] = H[j][n - 1] / t; - H[j][n] = H[j][n] / t; - } - } - } - } - } - } - - // Vectors of isolated roots - - for (int i = 0; i < nn; i++) { - if (i < low || i > high) { - for (int j = i; j < nn; j++) { - V[i][j] = H[i][j]; - } - } - } - - // Back transformation to get eigenvectors of original matrix - - for (int j = nn - 1; j >= low; j--) { - for (int i = low; i <= high; i++) { - z = 0.0; - for (int k = low; k <= Math.min(j, high); k++) { - z = z + V[i][k] * H[k][j]; - } - V[i][j] = z; - } - } - } - */ - - -} diff --git a/src2/javajs/util/Encoding.java b/src2/javajs/util/Encoding.java deleted file mode 100644 index 8d1a9a7..0000000 --- a/src2/javajs/util/Encoding.java +++ /dev/null @@ -1,33 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2011 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package javajs.util; - -public enum Encoding { - NONE, UTF8, UTF_16BE, UTF_16LE, UTF_32BE, UTF_32LE -} \ No newline at end of file diff --git a/src2/javajs/util/JSAudioThread.java b/src2/javajs/util/JSAudioThread.java deleted file mode 100644 index 3bcb006..0000000 --- a/src2/javajs/util/JSAudioThread.java +++ /dev/null @@ -1,258 +0,0 @@ -package javajs.util; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.DataLine; -import javax.sound.sampled.SourceDataLine; - -import sun.audio.AudioData; -import sun.audio.AudioDataStream; -import sun.audio.AudioPlayer; - - -/** - * The JSAudioThread adds a layer to JSThread that is specific for audio. - * This class utilizes JSAudioLine, which is not fully fleshed out. - * - * Two very simple interfaces, - * - * (new JSAudioThread()).playULawData(byte[] b); - * - * and - * - * (new JSAudioThread(audioFormat)).playOnce(byte[] b, offset, length); - * - * allow straightforward audio production without having to work with - * SourceDataLine directly. - * - * As a JSThread, this class implements myInit(), isLooping(), myLoop(), - * whenDone(), onException(), and doFinally(). - * - * If the constructor JSAudioThread(JSAudioThreadUser, AudioFormat, byte[]) is - * used, then the JSAudioThreadUser must simply implement fillAudioBuffer(), - * checkSoundStatus(), and audioThreadExiting() for very simple streaming audio. - * JSAudioThread will then take care of all the timing issues. - * - * But the implementer is welcome to override any of the JSThread overrides - * themselves in order to customize this further. - * - * The standard streaming case, then is: - * - * audioThread = new JSAudioThread(audioUser, audioFormat, audioByteBuffer); - * audioThread.start(); - * - * where audioUser provides - * - * checkSoundStatus() (called in isLooping()), - * - * fillAudioBuffer() (called in myLoop()), - * - * and - * - * audioThreadExiting() (called in doFinally()). - * - * @author Bob Hanson - * - */ -public class JSAudioThread extends JSThread { - - protected Owner owner; - protected boolean done; - protected int myBufferLength; - protected SourceDataLine line; - protected int rate, nChannels, bitsPerSample; - - protected byte[] audioByteBuffer; - protected int audioBufferByteLength; - - private AudioFormat audioFormat; - private int myBufferOffset; - private int playCount; - - public JSAudioThread(Owner owner, AudioFormat audioFormat, byte[] audioByteBuffer) { - this.owner = owner; - setFormat(audioFormat); - setBuffer(audioByteBuffer); - } - - /** - * A convenience constructor requiring standard settings of - * signed (for 8-bit) and littleEndian (for 16-bit) - * - * @param owner - * @param rate - * @param bitsPerSample - * @param nChannels - * @param audioByteBuffer - */ - public JSAudioThread(Owner owner, int rate, int bitsPerSample, int nChannels, byte[] audioByteBuffer) { - this.owner = owner; - setFormat(new AudioFormat(rate, bitsPerSample, nChannels, true, false)); - setBuffer(audioByteBuffer); - } - - /** - * primarily available for (new JSAudioThread()).playULawData - * - */ - public JSAudioThread() { - } - - /** - * primarily available for (new JSAudioThread()).playOnce - * - */ - public JSAudioThread(AudioFormat audioFormat) { - setFormat(audioFormat); - } - - /** - * - * A simple 8-bit uLaw data player - * - * @param data - */ - public void playULawData(byte[] data) { - // this constructor uses default new AudioFormat(ULAW,8000,8,1,1,8000,true) - // threading is taken care of by the browser in JavaScript - AudioPlayer.player.start(new AudioDataStream(new AudioData(data))); - } - - - /** - * Just play once through; no additions - * - * @param data - */ - public void playOnce(byte[] data, int offset, int length) { - setBuffer(data); - myBufferOffset = offset; - myBufferLength = length; - playCount = 1; - start(); - } - - public void setBuffer(byte[] audioByteBuffer) { - this.audioByteBuffer = audioByteBuffer; - audioBufferByteLength = audioByteBuffer.length; - } - - public SourceDataLine getLine() { - return line; - } - - public AudioFormat getFormat() { - return audioFormat; - } - - public void setFormat(AudioFormat audioFormat) { - this.audioFormat = audioFormat; - rate = (int) audioFormat.getSampleRate(); - bitsPerSample = audioFormat.getSampleSizeInBits(); - nChannels = audioFormat.getChannels(); - } - - public void resetAudio() { - if (line == null) - return; - line.flush(); - line.close(); - line = null; - } - - /** - * Standard initialization of a SourceDataLine - * - */ - @Override - protected boolean myInit() { - try { - DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); - if (line != null) - line.close(); - line = (SourceDataLine) AudioSystem.getLine(info); - line.open(audioFormat, audioBufferByteLength); - line.start(); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - @Override - protected boolean isLooping() { - return !done && (--playCount >= 0 || owner != null && owner.checkSoundStatus()); - } - - @Override - protected boolean myLoop() { - if (!done) { - if ((myBufferLength = (owner == null ? myBufferLength : owner.fillAudioBuffer())) <= 0) - return !(done = true); - try { - if (line == null) - myInit(); - line.write(audioByteBuffer, myBufferOffset, myBufferLength); - } catch (Exception e) { - e.printStackTrace(); - done = true; - } - } - return !done; - } - - @Override - protected void whenDone() { - done = true; - resetAudio(); - } - - @Override - protected int getDelayMillis() { - // about 25% of the actual play time - return 1000 // ms/sec - * (myBufferLength * 8 / bitsPerSample) // * samples - / rate // * seconds/sample) - / nChannels // / number of channels - / 4; // * 25% - } - - @Override - protected void onException(Exception e) { - e.printStackTrace(); - } - - @Override - protected void doFinally() { - if (owner != null) - owner.audioThreadExiting(); - } - - public interface Owner { - - /** - * - * @return true if thread should continue; false if not - * - */ - boolean checkSoundStatus(); - - /** fill audio buffer - * - * @return number of bytes to write to audio line - * - */ - int fillAudioBuffer(); - - /** - * called from the finally clause when complete - * - */ - void audioThreadExiting(); - - - } - -} - diff --git a/src2/javajs/util/JSJSONParser.java b/src2/javajs/util/JSJSONParser.java deleted file mode 100644 index 552270d..0000000 --- a/src2/javajs/util/JSJSONParser.java +++ /dev/null @@ -1,325 +0,0 @@ -package javajs.util; - -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; - - -/** - * a very simple JSON parser for JSON objects that are compatible with JavaScript - * A gross simplification of https://github.com/douglascrockford/JSON-java - * - * A SUBSET of JSON with similarly to window.JSON.parse(): - * - * In JavaScript returns "null" for a null value, not null - * - * -- requires quoted strings for keys and values - * - * -- does not allow /xxx/ objects - * - * @author Bob Hanson - * - */ -public class JSJSONParser { - - private String str; - private int index; - private int len; - private boolean asHashTable; - - public JSJSONParser () { - // for reflection - } - - /** - * requires { "key":"value", "key":"value",....} - * - * @param str - * @param asHashTable TODO - * - * @return Map or null - */ - @SuppressWarnings("unchecked") - public Map parseMap(String str, boolean asHashTable) { - index = 0; - this.asHashTable = asHashTable; - this.str = str; - len = str.length(); - if (getChar() != '{') - return null; - returnChar(); - return (Map) getValue(false); - } - - /** - * Could return Integer, Float, Boolean, String, Map, Lst, or null - * - * @param str - * @param asHashTable - * @return a object equivalent to the JSON string str - * - */ - public Object parse(String str, boolean asHashTable) { - index = 0; - this.asHashTable = asHashTable; - this.str = str; - len = str.length(); - return getValue(false); - } - - private char next() { - return (index < len ? str.charAt(index++) : '\0'); - } - - private void returnChar() { - index--; - } - - /** - * Get the next char in the string, skipping whitespace. - * - * @throws JSONException - * @return one character, or 0 if there are no more characters. - */ - private char getChar() throws JSONException { - for (;;) { - char c = next(); - if (c == 0 || c > ' ') { - return c; - } - } - } - - /** - * only allowing the following values: - * - * {...} object - * - * [...] array - * - * Integer - * - * Float - * - * "quoted string" - * - * - * @param isKey if we should allow {...} and [...] - * @return a subclass of Object - * @throws JSONException - */ - private Object getValue(boolean isKey) throws JSONException { - int i = index; - char c = getChar(); - switch (c) { - case '\0': - return null; - case '"': - case '\'': - return getString(c); - case '{': - if (!isKey) - return getObject(); - c = 0; - break; - case '[': - if (!isKey) - return getArray(); - c = 0; - break; - default: - // standard syntax is assumed; not checking all possible invalid keys - // for example, "-" is not allowed in JavaScript, which is what this is for - returnChar(); - while (c >= ' ' && "[,]{:}'\"".indexOf(c) < 0) - c = next(); - returnChar(); - if (isKey && c != ':') - c = 0; - break; - } - if (isKey && c == 0) - throw new JSONException("invalid key"); - - String string = str.substring(i, index).trim(); - - // check for the only valid simple words: true, false, null (lower case) - // and in this case, only for - - if (!isKey) { - if (string.equals("true")) { - return Boolean.TRUE; - } - if (string.equals("false")) { - return Boolean.FALSE; - } - if (string.equals("null")) { - return (asHashTable ? string : null); - } - } - // only numbers from here on: - c = string.charAt(0); - if (c >= '0' && c <= '9' || c == '-') - try { - if (string.indexOf('.') < 0 && string.indexOf('e') < 0 - && string.indexOf('E') < 0) - return new Integer(string); - // not allowing infinity or NaN - // using float here because Jmol does not use Double - Float d = Float.valueOf(string); - if (!d.isInfinite() && !d.isNaN()) - return d; - } catch (Exception e) { - } - // not a valid number - System.out.println("JSON parser cannot parse " + string); - throw new JSONException("invalid value"); - } - - private String getString(char quote) throws JSONException { - char c; - SB sb = null; - int i0 = index; - for (;;) { - int i1 = index; - switch (c = next()) { - case '\0': - case '\n': - case '\r': - throw syntaxError("Unterminated string"); - case '\\': - switch (c = next()) { - case '"': - case '\'': - case '\\': - case '/': - break; - case 'b': - c = '\b'; - break; - case 't': - c = '\t'; - break; - case 'n': - c = '\n'; - break; - case 'f': - c = '\f'; - break; - case 'r': - c = '\r'; - break; - case 'u': - int i = index; - index += 4; - try { - c = (char) Integer.parseInt(str.substring(i, index), 16); - } catch (Exception e) { - throw syntaxError("Substring bounds error"); - } - break; - default: - throw syntaxError("Illegal escape."); - } - break; - default: - if (c == quote) - return (sb == null ? str.substring(i0, i1) : sb.toString()); - break; - } - if (index > i1 + 1) { - if (sb == null) { - sb = new SB(); - sb.append(str.substring(i0, i1)); - } - } - if (sb != null) - sb.appendC(c); - } - } - - private Object getObject() { - Map map = (asHashTable ? new Hashtable() : new HashMap()); - String key = null; - switch (getChar()) { - case '}': - return map; - case 0: - throw new JSONException("invalid object"); - } - returnChar(); - boolean isKey = false; - for (;;) { - if ((isKey = !isKey) == true) - key = getValue(true).toString(); - else - map.put(key, getValue(false)); - switch (getChar()) { - case '}': - return map; - case ':': - if (isKey) - continue; - isKey = true; - //$FALL-THROUGH$ - case ',': - if (!isKey) - continue; - //$FALL-THROUGH$ - default: - throw syntaxError("Expected ',' or ':' or '}'"); - } - } - } - - private Object getArray() { - Lst l = new Lst(); - switch (getChar()) { - case ']': - return l; - case '\0': - throw new JSONException("invalid array"); - } - returnChar(); - boolean isNull = false; - for (;;) { - if (isNull) { - l.addLast(null); - isNull = false; - } else { - l.addLast(getValue(false)); - } - switch (getChar()) { - case ',': - switch (getChar()) { - case ']': - // terminal , - return l; - case ',': - // empty value - isNull = true; - //$FALL-THROUGH$ - default: - returnChar(); - } - continue; - case ']': - return l; - default: - throw syntaxError("Expected ',' or ']'"); - } - } - } - - /** - * Make a JSONException to signal a syntax error. - * - * @param message - * The error message. - * @return A JSONException object, suitable for throwing - */ - public JSONException syntaxError(String message) { - return new JSONException(message + " for " + str.substring(0, Math.min(index, len))); - } - -} diff --git a/src2/javajs/util/JSONException.java b/src2/javajs/util/JSONException.java deleted file mode 100644 index 58af722..0000000 --- a/src2/javajs/util/JSONException.java +++ /dev/null @@ -1,8 +0,0 @@ -package javajs.util; - -public class JSONException extends RuntimeException { - public JSONException(String message) { - super(message); - } - -} diff --git a/src2/javajs/util/JSThread.java b/src2/javajs/util/JSThread.java deleted file mode 100644 index be94c00..0000000 --- a/src2/javajs/util/JSThread.java +++ /dev/null @@ -1,216 +0,0 @@ -package javajs.util; - -import java.awt.Toolkit; -import java.awt.event.InvocationEvent; - -//import javajs.J2SRequireImport; -import javajs.api.JSFunction; - - -/** - * An abstract class that takes care of simple threading in Java or JavaScript. - * - * To use it, subclass it and complete the necessary methods. - * - * - * There are three states: INIT, LOOP, and DONE. - * - * These states are passed into run1 - * - * - * @author Bob Hanson - * - */ -//@J2SRequireImport(swingjs.JSToolkit.class) -public abstract class JSThread extends Thread implements JSFunction { - - public static final int INIT = 0; - public static final int LOOP = 1; - public static final int DONE = 2; - - public static int threadCount = 0; - - protected boolean isJS; - - public JSThread() { - this(null, "JSThread-" + (++threadCount)); - } - - public JSThread(String name) { - this(null, name); - } - - public JSThread(ThreadGroup group, String name) { - super(group, name); - /** - * @j2sNative - * - * this.isJS = true; - */ - {} - } - - @Override - public void run() { - run1(INIT); - } - - @Override - public synchronized void start() { - - - /** - * @j2sNative - * - * Clazz.load("swingjs.JSToolkit").dispatch$O$I$I(this, 1, 0); - * - */ - { - super.start(); - } - - } - - /** - * thread initialization - * - * @return false to exit thread before any looping - */ - protected abstract boolean myInit(); - - /** - * check for continuing to loop - * - * @return true if we are to continue looping - */ - protected abstract boolean isLooping(); - - /** - * - * @return false to handle sleepAndReturn yourself - */ - protected abstract boolean myLoop(); - /** - * what to do when the DONE state is reached - * - */ - protected abstract void whenDone(); - - /** - * - * @return the sleep time in milliseconds - */ - protected abstract int getDelayMillis(); - - /** - * handle an exception -- state will be set to DONE no matter what you do here - * - * @param e - */ - protected abstract void onException(Exception e); - - /** - * anything you want done in try{}catch(}finally(). - * Note that this method is not fired if we are in JavaScript - * mode and the normal return from sleepAndReturn() is taken. - * - */ - protected abstract void doFinally(); - - /** - * a generic method that loops until done, either in Java or JavaScript. - * - * In JavaScript it will reenter and continue at the appropriate spot. - * - * This method may be overridden if desired. - * - * @see org.uwi.SimThread - * - * @param state - */ - protected void run1(int state) { - boolean executeFinally = true; - // called by thisThread.run(); - try { - while (!interrupted()) { - switch (state) { - case INIT: - if (!myInit()) - return; - // initial code here - state = LOOP; - continue; - case LOOP: - // to stop looping, return false from isLooping() - if (!isLooping()) { - state = DONE; - continue; - } - // To handle sleepAndReturn yourself, or to skip the - // sleep when desired, return false from myLoop(); - // Note that doFinally must not be executed in this case. - // This is because JavaScript will do a return here - // for every loop, and Java will not. - if (myLoop() && sleepAndReturn(getDelayMillis(), state)) { - executeFinally = false; - return; - } - continue; - case DONE: - whenDone(); - // whatever - return; - } - } - } catch (Exception e) { - onException(e); - state = DONE; - } finally { - if (executeFinally) - doFinally(); - } - // normal exit - } - - /** - * - * @param r2 - * @param state - * @return true if we should interrupt (i.e. JavaScript) - * @throws InterruptedException - */ - protected boolean sleepAndReturn(final int delay, final int state) - throws InterruptedException { - if (!isJS) { - sleep(delay); - return false; - } - - // in JavaScript, we need to do this through the system event queue, - // which in JSToolkit takes care of all the "thread" handling. - - final JSThread me = this; - Runnable r = new Runnable() { - @Override - public void run() { - me.run1(state); - } - }; - /** - * @j2sNative - * - * setTimeout( - * function() { - * java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent$java_awt_AWTEvent( - * Clazz.new_(java.awt.event.InvocationEvent.c$$O$Runnable,[me, r]))}, - * delay); - * - */ - { - Toolkit.getDefaultToolkit().getSystemEventQueue() - .postEvent(new InvocationEvent(me, r)); - } - return true; - } - -} diff --git a/src2/javajs/util/LimitedLineReader.java b/src2/javajs/util/LimitedLineReader.java deleted file mode 100644 index e1d973f..0000000 --- a/src2/javajs/util/LimitedLineReader.java +++ /dev/null @@ -1,48 +0,0 @@ -package javajs.util; - -import java.io.BufferedReader; - -/** - * A simple class to read a designated number of bytes from a - * file and then return them line by line, skipping lines that - * start with #, and including the \n or \r characters at line ends. - * - * Generally useful for determining what sort of data a file contains. - * - */ -public class LimitedLineReader { - private char[] buf; - private int cchBuf; - private int ichCurrent; - - public LimitedLineReader(BufferedReader bufferedReader, int readLimit) - throws Exception { - bufferedReader.mark(readLimit + 1); - buf = new char[readLimit]; - cchBuf = Math.max(bufferedReader.read(buf, 0, readLimit), 0); - ichCurrent = 0; - bufferedReader.reset(); - } - - public String getHeader(int n) { - return (n == 0 ? new String(buf) : new String(buf, 0, Math.min(cchBuf, n))); - } - - public String readLineWithNewline() { - while (ichCurrent < cchBuf) { - int ichBeginningOfLine = ichCurrent; - char ch = 0; - while (ichCurrent < cchBuf && - (ch = buf[ichCurrent++]) != '\r' && ch != '\n') { - } - if (ch == '\r' && ichCurrent < cchBuf && buf[ichCurrent] == '\n') - ++ichCurrent; - int cchLine = ichCurrent - ichBeginningOfLine; - if (buf[ichBeginningOfLine] == '#') - continue; // flush comment lines; - return new String(buf, ichBeginningOfLine, cchLine); - } - return ""; - } -} - diff --git a/src2/javajs/util/ListDataReader.java b/src2/javajs/util/ListDataReader.java deleted file mode 100644 index 7814977..0000000 --- a/src2/javajs/util/ListDataReader.java +++ /dev/null @@ -1,57 +0,0 @@ -package javajs.util; - -import java.io.IOException; - - - - - -/** - * - * VectorDataReader subclasses BufferedReader and overrides its - * read, readLine, mark, and reset methods so that JmolAdapter - * works with Vector arrays without any further adaptation. - * - */ - -public class ListDataReader extends DataReader { - private Lst data; - private int pt; - private int len; - - public ListDataReader() { - super(); - } - - @SuppressWarnings("unchecked") - @Override - public DataReader setData(Object data) { - this.data = (Lst) data; - len = this.data.size(); - return this; - } - - @Override - public int read(char[] buf, int off, int len) throws IOException { - return readBuf(buf, off, len); - } - - @Override - public String readLine() { - return (pt < len ? data.get(pt++) : null); - } - - /** - * - * @param ptr - */ - public void mark(long ptr) { - //ignore ptr. - ptMark = pt; - } - - @Override - public void reset() { - pt = ptMark; - } -} \ No newline at end of file diff --git a/src2/javajs/util/Lst.java b/src2/javajs/util/Lst.java deleted file mode 100644 index e7fdda5..0000000 --- a/src2/javajs/util/Lst.java +++ /dev/null @@ -1,56 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2007-04-26 16:57:51 -0500 (Thu, 26 Apr 2007) $ - * $Revision: 7502 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package javajs.util; - -import java.util.ArrayList; - -/** - * created to remove ambiguities in add and remove - * - * @param - */ -@SuppressWarnings("serial") -public class Lst extends ArrayList { - - public Lst() { - super(); - } - - public boolean addLast(V v) { - return super.add(v); - } - - public V removeItemAt(int location) { - return super.remove(location); - } - - public boolean removeObj(Object v) { - return super.remove(v); - } - -} diff --git a/src2/javajs/util/M3.java b/src2/javajs/util/M3.java deleted file mode 100644 index 88f6f4e..0000000 --- a/src2/javajs/util/M3.java +++ /dev/null @@ -1,637 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - -import java.io.Serializable; - - - -/** - * A single precision floating point 3 by 3 matrix. - * - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique - * constructor and method names for the optimization of compiled - * JavaScript using Java2Script - * - * - */ -public class M3 extends M34 implements Serializable { - - /** - * Constructs and initializes a Matrix3f to all zeros. - */ - public M3() { - } - - /** - * Constructs and initializes a Matrix3f from the specified 9 element array. - * this.m00 =v[0], this.m01=v[1], etc. - * - * @param v - * the array of length 9 containing in order - * @return m - */ - public static M3 newA9(float[] v) { - M3 m = new M3(); - m.setA(v); - return m; - } - - /** - * Constructs a new matrix with the same values as the Matrix3f parameter. - * - * @param m1 - * The source matrix. - * @return m - */ - public static M3 newM3(M3 m1) { - M3 m = new M3(); - if (m1 == null) { - m.setScale(1); - return m; - } - m.m00 = m1.m00; - m.m01 = m1.m01; - m.m02 = m1.m02; - - m.m10 = m1.m10; - m.m11 = m1.m11; - m.m12 = m1.m12; - - m.m20 = m1.m20; - m.m21 = m1.m21; - m.m22 = m1.m22; - return m; - } - - /** - * Sets this Matrix3f to a scalar * Identity. - * @param scale - */ - public void setScale(float scale) { - clear33(); - m00 = m11 = m22 = scale; - } - - /** - * Sets the value of this matrix to the double value of the Matrix3f argument. - * - * @param m1 - * the matrix3f - */ - public void setM3(M34 m1) { - setM33(m1); - } - /** - * Sets the values in this Matrix3f equal to the row-major array parameter - * (ie, the first four elements of the array will be copied into the first row - * of this matrix, etc.). - * - * @param m - */ - public void setA(float m[]) { - m00 = m[0]; - m01 = m[1]; - m02 = m[2]; - m10 = m[3]; - m11 = m[4]; - m12 = m[5]; - m20 = m[6]; - m21 = m[7]; - m22 = m[8]; - } - - /** - * Sets the specified element of this matrix3d to the value provided. - * - * @param row - * the row number to be modified (zero indexed) - * @param col - * the column number to be modified (zero indexed) - * @param v - * the new value - */ - public void setElement(int row, int col, float v) { - set33(row, col, v); - } - - /** - * Retrieves the value at the specified row and column of this matrix. - * - * @param row - * the row number to be retrieved (zero indexed) - * @param col - * the column number to be retrieved (zero indexed) - * @return the value at the indexed element - */ - public float getElement(int row, int col) { - return get33(row, col); - } - - /** - * Sets the specified row of this matrix3d to the three values provided. - * - * @param row - * the row number to be modified (zero indexed) - * @param x - * the first column element - * @param y - * the second column element - * @param z - * the third column element - */ - public void setRow(int row, float x, float y, float z) { - switch (row) { - case 0: - m00 = x; - m01 = y; - m02 = z; - return; - case 1: - m10 = x; - m11 = y; - m12 = z; - return; - case 2: - m20 = x; - m21 = y; - m22 = z; - return; - default: - err(); - } - } - - /** - * Sets the specified row of this matrix3d to the Vector provided. - * - * @param row - * the row number to be modified (zero indexed) - * @param v - * the replacement row - */ - public void setRowV(int row, T3 v) { - switch (row) { - case 0: - m00 = v.x; - m01 = v.y; - m02 = v.z; - return; - case 1: - m10 = v.x; - m11 = v.y; - m12 = v.z; - return; - case 2: - m20 = v.x; - m21 = v.y; - m22 = v.z; - return; - default: - err(); - } - } - - /** - * Sets the specified row of this matrix3d to the four values provided. - * - * @param row - * the row number to be modified (zero indexed) - * @param v - * the replacement row - */ - public void setRowA(int row, float v[]) { - setRow33(row, v); - } - - /** - * Copies the matrix values in the specified row into the array parameter. - * - * @param row - * the matrix row - * @param v - * The array into which the matrix row values will be copied - */ - @Override - public void getRow(int row, float v[]) { - getRow33(row, v); - } - - /** - * Sets the specified column of this matrix3d to the three values provided. - * - * @param column - * the column number to be modified (zero indexed) - * @param x - * the first row element - * @param y - * the second row element - * @param z - * the third row element - */ - public void setColumn3(int column, float x, float y, float z) { - switch (column) { - case 0: - m00 = x; - m10 = y; - m20 = z; - break; - case 1: - m01 = x; - m11 = y; - m21 = z; - break; - case 2: - m02 = x; - m12 = y; - m22 = z; - break; - default: - err(); - } - } - - /** - * Sets the specified column of this matrix3d to the vector provided. - * - * @param column - * the column number to be modified (zero indexed) - * @param v - * the replacement column - */ - public void setColumnV(int column, T3 v) { - switch (column) { - case 0: - m00 = v.x; - m10 = v.y; - m20 = v.z; - break; - case 1: - m01 = v.x; - m11 = v.y; - m21 = v.z; - break; - case 2: - m02 = v.x; - m12 = v.y; - m22 = v.z; - break; - default: - err(); - } - } - - /** - * Copies the matrix values in the specified column into the vector parameter. - * - * @param column - * the matrix column - * @param v - * The vector into which the matrix row values will be copied - */ - public void getColumnV(int column, T3 v) { - switch (column) { - case 0: - v.x = m00; - v.y = m10; - v.z = m20; - break; - case 1: - v.x = m01; - v.y = m11; - v.z = m21; - break; - case 2: - v.x = m02; - v.y = m12; - v.z = m22; - break; - default: - err(); - } - } - - /** - * Sets the specified column of this matrix3d to the four values provided. - * - * @param column - * the column number to be modified (zero indexed) - * @param v - * the replacement column - */ - public void setColumnA(int column, float v[]) { - setColumn33(column, v); - } - - /** - * Copies the matrix values in the specified column into the array parameter. - * - * @param column - * the matrix column - * @param v - * The array into which the matrix row values will be copied - */ - public void getColumn(int column, float v[]) { - getColumn33(column, v); - } - - /** - * Sets the value of this matrix to sum of itself and matrix m1. - * - * @param m1 - * the other matrix - */ - public void add(M3 m1) { - add33(m1); - } - - /** - * Sets the value of this matrix to the matrix difference of itself and matrix - * m1 (this = this - m1). - * - * @param m1 - * the other matrix - */ - public void sub(M3 m1) { - sub33(m1); - } - - /** - * Sets the value of this matrix to its transpose. - */ - public void transpose() { - transpose33(); - } - - /** - * Sets the value of this matrix to the transpose of the argument matrix - * - * @param m1 - * the matrix to be transposed - */ - public void transposeM(M3 m1) { - // alias-safe - setM33(m1); - transpose33(); - } - - /** - * Sets the value of this matrix to the matrix inverse of the passed matrix - * m1. - * - * @param m1 - * the matrix to be inverted - */ - public void invertM(M3 m1) { - setM33(m1); - invert(); - } - - /** - * Sets the value of this matrix to its inverse. - */ - public void invert() { - double s = determinant3(); - if (s == 0.0) - return; - s = 1 / s; - // alias-safe way. - set9(m11 * m22 - m12 * m21, m02 * m21 - m01 * m22, m01 * m12 - m02 * m11, - m12 * m20 - m10 * m22, m00 * m22 - m02 * m20, m02 * m10 - m00 * m12, - m10 * m21 - m11 * m20, m01 * m20 - m00 * m21, m00 * m11 - m01 * m10); - scale((float) s); - } - - /** - * Sets the value of this matrix to a rotation matrix about the x axis by the - * passed angle. - * - * @param angle - * the angle to rotate about the X axis in radians - * @return this - */ - public M3 setAsXRotation(float angle) { - setXRot(angle); - return this; - } - - /** - * Sets the value of this matrix to a rotation matrix about the y axis by the - * passed angle. - * - * @param angle - * the angle to rotate about the Y axis in radians - * @return this - */ - public M3 setAsYRotation(float angle) { - setYRot(angle); - return this; - } - - /** - * Sets the value of this matrix to a rotation matrix about the z axis by the - * passed angle. - * - * @param angle - * the angle to rotate about the Z axis in radians - * @return this - */ - public M3 setAsZRotation(float angle) { - setZRot(angle); - return this; - } - - /** - * Multiplies each element of this matrix by a scalar. - * - * @param scalar - * The scalar multiplier. - */ - public void scale(float scalar) { - mul33(scalar); - } - - /** - * Sets the value of this matrix to the result of multiplying itself with - * matrix m1. - * - * @param m1 - * the other matrix - */ - public void mul(M3 m1) { - mul2(this, m1); - } - - /** - * Sets the value of this matrix to the result of multiplying the two argument - * matrices together. - * - * @param m1 - * the first matrix - * @param m2 - * the second matrix - */ - public void mul2(M3 m1, M3 m2) { - // alias-safe way. - set9(m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20, m1.m00 * m2.m01 - + m1.m01 * m2.m11 + m1.m02 * m2.m21, m1.m00 * m2.m02 + m1.m01 * m2.m12 - + m1.m02 * m2.m22, - - m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20, m1.m10 * m2.m01 - + m1.m11 * m2.m11 + m1.m12 * m2.m21, m1.m10 * m2.m02 + m1.m11 * m2.m12 - + m1.m12 * m2.m22, - - m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20, m1.m20 * m2.m01 - + m1.m21 * m2.m11 + m1.m22 * m2.m21, m1.m20 * m2.m02 + m1.m21 * m2.m12 - + m1.m22 * m2.m22); - } - - /** - * Returns true if the Object o is of type Matrix3f and all of the data - * members of t1 are equal to the corresponding data members in this Matrix3f. - * - * @param o - * the object with which the comparison is made. - */ - @Override - public boolean equals(Object o) { - if (!(o instanceof M3)) - return false; - M3 m = (M3) o; - return m00 == m.m00 && m01 == m.m01 && m02 == m.m02 && m10 == m.m10 - && m11 == m.m11 && m12 == m.m12 && m20 == m.m20 && m21 == m.m21 - && m22 == m.m22; - } - - /** - * Returns a hash number based on the data values in this object. Two - * different Matrix3f objects with identical data values (ie, returns true for - * equals(Matrix3f) ) will return the same hash number. Two objects with - * different data members may return the same hash value, although this is not - * likely. - * - * @return the integer hash value - */ - @Override - public int hashCode() { - return T3.floatToIntBits(m00) ^ T3.floatToIntBits(m01) - ^ T3.floatToIntBits(m02) ^ T3.floatToIntBits(m10) - ^ T3.floatToIntBits(m11) ^ T3.floatToIntBits(m12) - ^ T3.floatToIntBits(m20) ^ T3.floatToIntBits(m21) - ^ T3.floatToIntBits(m22); - } - - /** - * Sets this matrix to all zeros. - */ - public void setZero() { - clear33(); - } - - /** - * Sets 9 values - * - * @param m00 - * @param m01 - * @param m02 - * @param m10 - * @param m11 - * @param m12 - * @param m20 - * @param m21 - * @param m22 - */ - private void set9(float m00, float m01, float m02, float m10, float m11, - float m12, float m20, float m21, float m22) { - this.m00 = m00; - this.m01 = m01; - this.m02 = m02; - this.m10 = m10; - this.m11 = m11; - this.m12 = m12; - this.m20 = m20; - this.m21 = m21; - this.m22 = m22; - } - - /** - * Returns a string that contains the values of this Matrix3f. - * - * @return the String representation - */ - @Override - public String toString() { - return "[\n [" + m00 + "\t" + m01 + "\t" + m02 + "]" + "\n [" + m10 - + "\t" + m11 + "\t" + m12 + "]" + "\n [" + m20 + "\t" + m21 + "\t" - + m22 + "] ]"; - } - - /** - * Sets the value of this matrix to the matrix conversion of the single - * precision axis and angle argument. - * - * @param a - * the axis and angle to be converted - * @return this - */ - public M3 setAA(A4 a) { - setAA33(a); - return this; - } - - /** - * 3D ball rotation from dx dy in-plane mouse motion - * adapted from Andrew Hanson - * Computer Graphics beyond the Third Dimension: - * Geometry, Orientation Control, and Rendering for - * Graphics in Dimensions Greater than Three - * Course Notes for SIGGRAPH ’98 - * http://www.cse.ohio-state.edu/~hwshen/888_su02/hanson_note.pdf - * - * @param responseFactor Jmol uses 0.02 here - * @param dx - * @param dy - * @return true if successful; false if not; - */ - public boolean setAsBallRotation(float responseFactor, float dx, float dy) { - float r = (float) Math.sqrt(dx * dx + dy * dy); - float th = r * responseFactor; - if (th == 0) { - setScale(1); - return false; - } - float c = (float) Math.cos(th); - float s = (float) Math.sin(th); - float nx = -dy / r; - float ny = dx / r; - float c1 = c - 1; - m00 = 1 + c1 * nx * nx; - m01 = m10 = c1 * nx * ny; - m20 = -(m02 = s * nx); - m11 = 1 + c1 * ny * ny; - m21 = -(m12 = s * ny); - m22 = c; - return true; - } - - public boolean isRotation() { - return (Math.abs(determinant3() - 1) < 0.001f); - } - -} diff --git a/src2/javajs/util/M34.java b/src2/javajs/util/M34.java deleted file mode 100644 index 260a82c..0000000 --- a/src2/javajs/util/M34.java +++ /dev/null @@ -1,416 +0,0 @@ -package javajs.util; - -/** - * A base class for both M3 and M4 to conserve code size. - * - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique - * constructor and method names for the optimization of compiled - * JavaScript using Java2Script and for subclassing to M3 and M4 - * - */ -public abstract class M34 { - - /** - * The first element of the first row - */ - public float m00; - - /** - * The second element of the first row. - */ - public float m01; - - /** - * third element of the first row. - */ - public float m02; - - /** - * The first element of the second row. - */ - public float m10; - - /** - * The second element of the second row. - */ - public float m11; - - /** - * The third element of the second row. - */ - public float m12; - - /** - * The first element of the third row. - */ - public float m20; - - /** - * The second element of the third row. - */ - public float m21; - - /** - * The third element of the third row. - */ - public float m22; - - protected void setAA33(A4 a) { - double x = a.x; - double y = a.y; - double z = a.z; - double angle = a.angle; - // Taken from Rick's which is taken from Wertz. pg. 412 - // Bug Fixed and changed into right-handed by hiranabe - double n = Math.sqrt(x * x + y * y + z * z); - // zero-div may occur - n = 1 / n; - x *= n; - y *= n; - z *= n; - double c = Math.cos(angle); - double s = Math.sin(angle); - double omc = 1.0 - c; - m00 = (float) (c + x * x * omc); - m11 = (float) (c + y * y * omc); - m22 = (float) (c + z * z * omc); - - double tmp1 = x * y * omc; - double tmp2 = z * s; - m01 = (float) (tmp1 - tmp2); - m10 = (float) (tmp1 + tmp2); - - tmp1 = x * z * omc; - tmp2 = y * s; - m02 = (float) (tmp1 + tmp2); - m20 = (float) (tmp1 - tmp2); - - tmp1 = y * z * omc; - tmp2 = x * s; - m12 = (float) (tmp1 - tmp2); - m21 = (float) (tmp1 + tmp2); - } - - public void rotate(T3 t) { - // alias-safe - rotate2(t, t); - } - - /** - * Transform the vector vec using this Matrix3f and place the result into - * vecOut. - * - * @param t - * the single precision vector to be transformed - * @param result - * the vector into which the transformed values are placed - */ - public void rotate2(T3 t, T3 result) { - // alias-safe - result.set(m00 * t.x + m01 * t.y + m02 * t.z, m10 * t.x + m11 * t.y + m12 - * t.z, m20 * t.x + m21 * t.y + m22 * t.z); - } - - - /** - * Sets the value of this matrix to the double value of the Matrix3f argument. - * - * @param m1 - * the matrix3f - */ - protected void setM33(M34 m1) { - m00 = m1.m00; - m01 = m1.m01; - m02 = m1.m02; - m10 = m1.m10; - m11 = m1.m11; - m12 = m1.m12; - m20 = m1.m20; - m21 = m1.m21; - m22 = m1.m22; - } - - protected void clear33() { - m00 = m01 = m02 = m10 = m11 = m12 = m20 = m21 = m22 = 0.0f; - } - - protected void set33(int row, int col, float v) { - switch (row) { - case 0: - switch (col) { - case 0: - m00 = v; - return; - case 1: - m01 = v; - return; - case 2: - m02 = v; - return; - } - break; - case 1: - switch (col) { - case 0: - m10 = v; - return; - case 1: - m11 = v; - return; - case 2: - m12 = v; - return; - } - break; - case 2: - switch (col) { - case 0: - m20 = v; - return; - case 1: - m21 = v; - return; - case 2: - m22 = v; - return; - } - break; - } - err(); - } - - protected float get33(int row, int col) { - switch (row) { - case 0: - switch (col) { - case 0: - return m00; - case 1: - return m01; - case 2: - return m02; - } - break; - case 1: - switch (col) { - case 0: - return m10; - case 1: - return m11; - case 2: - return m12; - } - break; - case 2: - switch (col) { - case 0: - return m20; - case 1: - return m21; - case 2: - return m22; - } - break; - } - err(); - return 0; - } - - protected void setRow33(int row, float v[]) { - switch (row) { - case 0: - m00 = v[0]; - m01 = v[1]; - m02 = v[2]; - return; - case 1: - m10 = v[0]; - m11 = v[1]; - m12 = v[2]; - return; - case 2: - m20 = v[0]; - m21 = v[1]; - m22 = v[2]; - return; - default: - err(); - } - } - - public abstract void getRow(int row, float v[]); - - protected void getRow33(int row, float v[]) { - switch (row) { - case 0: - v[0] = m00; - v[1] = m01; - v[2] = m02; - return; - case 1: - v[0] = m10; - v[1] = m11; - v[2] = m12; - return; - case 2: - v[0] = m20; - v[1] = m21; - v[2] = m22; - return; - } - err(); - } - - protected void setColumn33(int column, float v[]) { - switch(column) { - case 0: - m00 = v[0]; - m10 = v[1]; - m20 = v[2]; - break; - case 1: - m01 = v[0]; - m11 = v[1]; - m21 = v[2]; - break; - case 2: - m02 = v[0]; - m12 = v[1]; - m22 = v[2]; - break; - default: - err(); - } - } - - protected void getColumn33(int column, float v[]) { - switch(column) { - case 0: - v[0] = m00; - v[1] = m10; - v[2] = m20; - break; - case 1: - v[0] = m01; - v[1] = m11; - v[2] = m21; - break; - case 2: - v[0] = m02; - v[1] = m12; - v[2] = m22; - break; - default: - err(); - } - } - - protected void add33(M34 m1) { - m00 += m1.m00; - m01 += m1.m01; - m02 += m1.m02; - m10 += m1.m10; - m11 += m1.m11; - m12 += m1.m12; - m20 += m1.m20; - m21 += m1.m21; - m22 += m1.m22; - } - - protected void sub33(M34 m1) { - m00 -= m1.m00; - m01 -= m1.m01; - m02 -= m1.m02; - m10 -= m1.m10; - m11 -= m1.m11; - m12 -= m1.m12; - m20 -= m1.m20; - m21 -= m1.m21; - m22 -= m1.m22; - } - - protected void mul33(float x) { - m00 *= x; - m01 *= x; - m02 *= x; - m10 *= x; - m11 *= x; - m12 *= x; - m20 *= x; - m21 *= x; - m22 *= x; - } - - protected void transpose33() { - float tmp = m01; - m01 = m10; - m10 = tmp; - - tmp = m02; - m02 = m20; - m20 = tmp; - - tmp = m12; - m12 = m21; - m21 = tmp; - } - - protected void setXRot(float angle) { - double c = Math.cos(angle); - double s = Math.sin(angle); - m00 = 1.0f; - m01 = 0.0f; - m02 = 0.0f; - m10 = 0.0f; - m11 = (float) c; - m12 = (float) -s; - m20 = 0.0f; - m21 = (float) s; - m22 = (float) c; - } - - protected void setYRot(float angle) { - double c = Math.cos(angle); - double s = Math.sin(angle); - m00 = (float) c; - m01 = 0.0f; - m02 = (float) s; - m10 = 0.0f; - m11 = 1.0f; - m12 = 0.0f; - m20 = (float) -s; - m21 = 0.0f; - m22 = (float) c; - } - - protected void setZRot(float angle) { - double c = Math.cos(angle); - double s = Math.sin(angle); - m00 = (float) c; - m01 = (float) -s; - m02 = 0.0f; - m10 = (float) s; - m11 = (float) c; - m12 = 0.0f; - m20 = 0.0f; - m21 = 0.0f; - m22 = 1.0f; - } - - /** - * @return 3x3 determinant - */ - public float determinant3() { - return m00 * (m11 * m22 - m21 * m12) - m01 * (m10 * m22 - m20 * m12) + m02 - * (m10 * m21 - m20 * m11); - } - - protected void err() { - throw new ArrayIndexOutOfBoundsException( - "matrix column/row out of bounds"); - } - - -} diff --git a/src2/javajs/util/M4.java b/src2/javajs/util/M4.java deleted file mode 100644 index 58bd355..0000000 --- a/src2/javajs/util/M4.java +++ /dev/null @@ -1,942 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - -/** - * A single precision floating point 4 by 4 matrix. - * - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique - * constructor and method names for the optimization of compiled - * JavaScript using Java2Script - */ -public class M4 extends M34 { - - /** - * The fourth element of the first row. - */ - public float m03; - - /** - * The fourth element of the second row. - */ - public float m13; - - /** - * The fourth element of the third row. - */ - public float m23; - - /** - * The first element of the fourth row. - */ - public float m30; - - /** - * The second element of the fourth row. - */ - public float m31; - - /** - * The third element of the fourth row. - */ - public float m32; - - /** - * The fourth element of the fourth row. - */ - public float m33 = 0; - - /** - * all zeros - */ - public M4() { - } - /** - * Constructs and initializes a Matrix4f from the specified 16 element array. - * this.m00 =v[0], this.m01=v[1], etc. - * - * @param v - * the array of length 16 containing in order - * @return m - */ - public static M4 newA16(float[] v) { - M4 m = new M4(); - m.m00 = v[0]; - m.m01 = v[1]; - m.m02 = v[2]; - m.m03 = v[3]; - - m.m10 = v[4]; - m.m11 = v[5]; - m.m12 = v[6]; - m.m13 = v[7]; - - m.m20 = v[8]; - m.m21 = v[9]; - m.m22 = v[10]; - m.m23 = v[11]; - - m.m30 = v[12]; - m.m31 = v[13]; - m.m32 = v[14]; - m.m33 = v[15]; - - return m; - } - - /** - * Constructs a new matrix with the same values as the Matrix4f parameter. - * - * @param m1 - * the source matrix - * @return m - */ - public static M4 newM4(M4 m1) { - M4 m = new M4(); - if (m1 == null) { - m.setIdentity(); - return m; - } - m.setToM3(m1); - m.m03 = m1.m03; - m.m13 = m1.m13; - m.m23 = m1.m23; - m.m30 = m1.m30; - m.m31 = m1.m31; - m.m32 = m1.m32; - m.m33 = m1.m33; - return m; - } - - /** - * Constructs and initializes a Matrix4f from the rotation matrix and - * translation. - * - * @param m1 - * The rotation matrix representing the rotational components - * @param t - * The translational components of the matrix - * @return m - */ - public static M4 newMV(M3 m1, T3 t) { - M4 m = new M4(); - m.setMV(m1, t); - return m; - } - - /** - * Sets this matrix to all zeros. - */ - public void setZero() { - clear33(); - m03 = m13 = m23 = m30 = m31 = m32 = m33 = 0.0f; - } - - /** - * Sets this Matrix4f to identity. - */ - public void setIdentity() { - setZero(); - m00 = m11 = m22 = m33 = 1.0f; - } - - /** - * Sets the value of this matrix to a copy of the passed matrix m1. - * - * @param m1 - * the matrix to be copied - * @return this - */ - public M4 setM4(M4 m1) { - setM33(m1); - m03 = m1.m03; - m13 = m1.m13; - m23 = m1.m23; - m30 = m1.m30; - m31 = m1.m31; - m32 = m1.m32; - m33 = m1.m33; - return this; - } - - /** - * Initializes a Matrix4f from the rotation matrix and translation. - * - * @param m1 - * The rotation matrix representing the rotational components - * @param t - * The translational components of the matrix - */ - public void setMV(M3 m1, T3 t) { - setM33(m1); - setTranslation(t); - m33 = 1; - } - - /** - * Sets the rotational component (upper 3x3) of this matrix to the matrix - * values in the single precision Matrix3f argument; the other elements of - * this matrix are initialized as if this were an identity matrix (ie, affine - * matrix with no translational component). - * - * @param m1 - * the 3x3 matrix - */ - public void setToM3(M34 m1) { - setM33(m1); - m03 = m13 = m23 = m30 = m31 = m32 = 0.0f; - m33 = 1.0f; - } - - /** - * Sets the rotational component (upper 3x3) of this matrix - * to a rotation given by an axis angle - * - * @param a - * the axis and angle to be converted - */ - public void setToAA(A4 a) { - setIdentity(); - setAA33(a); - } - - /** - * Sets the values in this Matrix4f equal to the row-major array parameter - * (ie, the first four elements of the array will be copied into the first row - * of this matrix, etc.). - * - * @param m - */ - public void setA(float m[]) { - m00 = m[0]; - m01 = m[1]; - m02 = m[2]; - m03 = m[3]; - m10 = m[4]; - m11 = m[5]; - m12 = m[6]; - m13 = m[7]; - m20 = m[8]; - m21 = m[9]; - m22 = m[10]; - m23 = m[11]; - m30 = m[12]; - m31 = m[13]; - m32 = m[14]; - m33 = m[15]; - } - - /** - * Modifies the translational components of this matrix to the values of the - * Vector3f argument; the other values of this matrix are not modified. - * - * @param trans - * the translational component - */ - public void setTranslation(T3 trans) { - m03 = trans.x; - m13 = trans.y; - m23 = trans.z; - } - - /** - * Sets the specified element of this matrix4f to the value provided. - * - * @param row - * the row number to be modified (zero indexed) - * @param col - * the column number to be modified (zero indexed) - * @param v - * the new value - */ - public void setElement(int row, int col, float v) { - if (row < 3 && col < 3) { - set33(row, col, v); - return; - } - if (row > 3 || col > 3) - err(); - switch (row) { - case 0: - m03 = v; - return; - case 1: - m13 = v; - return; - case 2: - m23 = v; - return; - } - switch (col) { - case 0: - m30 = v; - return; - case 1: - m31 = v; - return; - case 2: - m32 = v; - return; - case 3: - m33 = v; - return; - } - } - - /** - * Retrieves the value at the specified row and column of this matrix. - * - * @param row - * the row number to be retrieved (zero indexed) - * @param col - * the column number to be retrieved (zero indexed) - * @return the value at the indexed element - */ - public float getElement(int row, int col) { - if (row < 3 && col < 3) - return get33(row, col); - if (row > 3 || col > 3) { - err(); - return 0; - } - switch (row) { - case 0: - return m03; - case 1: - return m13; - case 2: - return m23; - default: - switch (col) { - case 0: - return m30; - case 1: - return m31; - case 2: - return m32; - default: - return m33; - } - } - } - - /** - * Retrieves the translational components of this matrix. - * - * @param trans - * the vector that will receive the translational component - */ - public void getTranslation(T3 trans) { - trans.x = m03; - trans.y = m13; - trans.z = m23; - } - - /** - * Gets the upper 3x3 values of this matrix and places them into the matrix - * m1. - * - * @param m1 - * The matrix that will hold the values - */ - public void getRotationScale(M3 m1) { - m1.m00 = m00; - m1.m01 = m01; - m1.m02 = m02; - m1.m10 = m10; - m1.m11 = m11; - m1.m12 = m12; - m1.m20 = m20; - m1.m21 = m21; - m1.m22 = m22; - } - - /** - * Replaces the upper 3x3 matrix values of this matrix with the values in the - * matrix m1. - * - * @param m1 - * The matrix that will be the new upper 3x3 - */ - public void setRotationScale(M3 m1) { - m00 = m1.m00; - m01 = m1.m01; - m02 = m1.m02; - m10 = m1.m10; - m11 = m1.m11; - m12 = m1.m12; - m20 = m1.m20; - m21 = m1.m21; - m22 = m1.m22; - } - - /** - * Sets the specified row of this matrix4f to the four values provided. - * - * @param row - * the row number to be modified (zero indexed) - * @param v - * the replacement row - */ - public void setRowA(int row, float v[]) { - if (row < 3) - setRow33(row, v); - switch (row) { - case 0: - m03 = v[3]; - return; - case 1: - m13 = v[3]; - return; - case 2: - m23 = v[3]; - return; - case 3: - m30 = v[0]; - m31 = v[1]; - m32 = v[2]; - m33 = v[3]; - return; - } - err(); - } - - /** - * Copies the matrix values in the specified row into the array parameter. - * - * @param row - * the matrix row - * @param v - * The array into which the matrix row values will be copied - */ - @Override - public void getRow(int row, float v[]) { - if (row < 3) - getRow33(row, v); - switch (row) { - case 0: - v[3] = m03; - return; - case 1: - v[3] = m13; - return; - case 2: - v[3] = m23; - return; - case 3: - v[0] = m30; - v[1] = m31; - v[2] = m32; - v[3] = m33; - return; - } - err(); - } - - /** - * Sets the specified column of this matrix4f to the four values provided. - * - * @param column - * the column number to be modified (zero indexed) - * @param x - * the first row element - * @param y - * the second row element - * @param z - * the third row element - * @param w - * the fourth row element - */ - public void setColumn4(int column, float x, float y, float z, float w) { - if (column == 0) { - m00 = x; - m10 = y; - m20 = z; - m30 = w; - } else if (column == 1) { - m01 = x; - m11 = y; - m21 = z; - m31 = w; - } else if (column == 2) { - m02 = x; - m12 = y; - m22 = z; - m32 = w; - } else if (column == 3) { - m03 = x; - m13 = y; - m23 = z; - m33 = w; - } else { - err(); - } - } - - /** - * Sets the specified column of this matrix4f to the four values provided. - * - * @param column - * the column number to be modified (zero indexed) - * @param v - * the replacement column - */ - public void setColumnA(int column, float v[]) { - if (column < 3) - setColumn33(column, v); - switch (column) { - case 0: - m30 = v[3]; - return; - case 1: - m31 = v[3]; - return; - case 2: - m32 = v[3]; - return; - case 3: - m03 = v[0]; - m13 = v[1]; - m23 = v[2]; - m33 = v[3]; - return; - default: - err(); - } - } - - /** - * Copies the matrix values in the specified column into the array parameter. - * - * @param column - * the matrix column - * @param v - * The array into which the matrix column values will be copied - */ - public void getColumn(int column, float v[]) { - if (column < 3) - getColumn33(column, v); - switch (column) { - case 0: - v[3] = m30; - return; - case 1: - v[3] = m31; - return; - case 2: - v[3] = m32; - return; - case 3: - v[0] = m03; - v[1] = m13; - v[2] = m23; - v[3] = m33; - return; - default: - err(); - } - } - - /** - * Sets the value of this matrix to the matrix difference of itself and matrix - * m1 (this = this - m1). - * - * @param m1 - * the other matrix - */ - public void sub(M4 m1) { - sub33(m1); - m03 -= m1.m03; - m13 -= m1.m13; - m23 -= m1.m23; - m30 -= m1.m30; - m31 -= m1.m31; - m32 -= m1.m32; - m33 -= m1.m33; - } - - /** - * Sets the value of this matrix to its transpose. - */ - public void transpose() { - transpose33(); - float tmp = m03; - m03 = m30; - m30 = tmp; - - tmp = m13; - m13 = m31; - m31 = tmp; - - tmp = m23; - m23 = m32; - m32 = tmp; - } - - /** - * Sets the value of this matrix to its inverse. - * @return this - */ - public M4 invert() { - float s = determinant4(); - if (s == 0.0) - return this; - s = 1 / s; - // alias-safe way. - // less *,+,- calculation than expanded expression. - set(m11 * (m22 * m33 - m23 * m32) + m12 * (m23 * m31 - m21 * m33) + m13 - * (m21 * m32 - m22 * m31), m21 * (m02 * m33 - m03 * m32) + m22 - * (m03 * m31 - m01 * m33) + m23 * (m01 * m32 - m02 * m31), m31 - * (m02 * m13 - m03 * m12) + m32 * (m03 * m11 - m01 * m13) + m33 - * (m01 * m12 - m02 * m11), m01 * (m13 * m22 - m12 * m23) + m02 - * (m11 * m23 - m13 * m21) + m03 * (m12 * m21 - m11 * m22), - - m12 * (m20 * m33 - m23 * m30) + m13 * (m22 * m30 - m20 * m32) + m10 - * (m23 * m32 - m22 * m33), m22 * (m00 * m33 - m03 * m30) + m23 - * (m02 * m30 - m00 * m32) + m20 * (m03 * m32 - m02 * m33), m32 - * (m00 * m13 - m03 * m10) + m33 * (m02 * m10 - m00 * m12) + m30 - * (m03 * m12 - m02 * m13), m02 * (m13 * m20 - m10 * m23) + m03 - * (m10 * m22 - m12 * m20) + m00 * (m12 * m23 - m13 * m22), - - m13 * (m20 * m31 - m21 * m30) + m10 * (m21 * m33 - m23 * m31) + m11 - * (m23 * m30 - m20 * m33), m23 * (m00 * m31 - m01 * m30) + m20 - * (m01 * m33 - m03 * m31) + m21 * (m03 * m30 - m00 * m33), m33 - * (m00 * m11 - m01 * m10) + m30 * (m01 * m13 - m03 * m11) + m31 - * (m03 * m10 - m00 * m13), m03 * (m11 * m20 - m10 * m21) + m00 - * (m13 * m21 - m11 * m23) + m01 * (m10 * m23 - m13 * m20), - - m10 * (m22 * m31 - m21 * m32) + m11 * (m20 * m32 - m22 * m30) + m12 - * (m21 * m30 - m20 * m31), m20 * (m02 * m31 - m01 * m32) + m21 - * (m00 * m32 - m02 * m30) + m22 * (m01 * m30 - m00 * m31), m30 - * (m02 * m11 - m01 * m12) + m31 * (m00 * m12 - m02 * m10) + m32 - * (m01 * m10 - m00 * m11), m00 * (m11 * m22 - m12 * m21) + m01 - * (m12 * m20 - m10 * m22) + m02 * (m10 * m21 - m11 * m20)); - scale(s); - return this; - } - - /** - * Sets 16 values - * - * @param m00 - * @param m01 - * @param m02 - * @param m03 - * @param m10 - * @param m11 - * @param m12 - * @param m13 - * @param m20 - * @param m21 - * @param m22 - * @param m23 - * @param m30 - * @param m31 - * @param m32 - * @param m33 - */ - private void set(float m00, float m01, float m02, float m03, float m10, - float m11, float m12, float m13, float m20, float m21, - float m22, float m23, float m30, float m31, float m32, - float m33) { - this.m00 = m00; - this.m01 = m01; - this.m02 = m02; - this.m03 = m03; - this.m10 = m10; - this.m11 = m11; - this.m12 = m12; - this.m13 = m13; - this.m20 = m20; - this.m21 = m21; - this.m22 = m22; - this.m23 = m23; - this.m30 = m30; - this.m31 = m31; - this.m32 = m32; - this.m33 = m33; - } - /** - * Computes the determinant of this matrix. - * - * @return the determinant of the matrix - */ - public float determinant4() { - // less *,+,- calculation than expanded expression. - return (m00 * m11 - m01 * m10) * (m22 * m33 - m23 * m32) - - (m00 * m12 - m02 * m10) * (m21 * m33 - m23 * m31) - + (m00 * m13 - m03 * m10) * (m21 * m32 - m22 * m31) - + (m01 * m12 - m02 * m11) * (m20 * m33 - m23 * m30) - - (m01 * m13 - m03 * m11) * (m20 * m32 - m22 * m30) - + (m02 * m13 - m03 * m12) * (m20 * m31 - m21 * m30); - - } - - /** - * Multiplies each element of this matrix by a scalar. - * - * @param scalar - * The scalar multiplier. - */ - public void scale(float scalar) { - mul33(scalar); - m03 *= scalar; - m13 *= scalar; - m23 *= scalar; - m30 *= scalar; - m31 *= scalar; - m32 *= scalar; - m33 *= scalar; - } - - /** - * Sets the value of this matrix to the result of multiplying itself with - * matrix m1. - * - * @param m1 - * the other matrix - */ - public void mul(M4 m1) { - mul2(this, m1); - } - - /** - * Sets the value of this matrix to the result of multiplying the two argument - * matrices together. - * - * @param m1 - * the first matrix - * @param m2 - * the second matrix - */ - public void mul2(M4 m1, M4 m2) { - // alias-safe way. - set(m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20 + m1.m03 * m2.m30, - m1.m00 * m2.m01 + m1.m01 * m2.m11 + m1.m02 * m2.m21 + m1.m03 * m2.m31, - m1.m00 * m2.m02 + m1.m01 * m2.m12 + m1.m02 * m2.m22 + m1.m03 * m2.m32, - m1.m00 * m2.m03 + m1.m01 * m2.m13 + m1.m02 * m2.m23 + m1.m03 * m2.m33, - - m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20 + m1.m13 * m2.m30, - m1.m10 * m2.m01 + m1.m11 * m2.m11 + m1.m12 * m2.m21 + m1.m13 * m2.m31, - m1.m10 * m2.m02 + m1.m11 * m2.m12 + m1.m12 * m2.m22 + m1.m13 * m2.m32, - m1.m10 * m2.m03 + m1.m11 * m2.m13 + m1.m12 * m2.m23 + m1.m13 * m2.m33, - - m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20 + m1.m23 * m2.m30, - m1.m20 * m2.m01 + m1.m21 * m2.m11 + m1.m22 * m2.m21 + m1.m23 * m2.m31, - m1.m20 * m2.m02 + m1.m21 * m2.m12 + m1.m22 * m2.m22 + m1.m23 * m2.m32, - m1.m20 * m2.m03 + m1.m21 * m2.m13 + m1.m22 * m2.m23 + m1.m23 * m2.m33, - - m1.m30 * m2.m00 + m1.m31 * m2.m10 + m1.m32 * m2.m20 + m1.m33 * m2.m30, - m1.m30 * m2.m01 + m1.m31 * m2.m11 + m1.m32 * m2.m21 + m1.m33 * m2.m31, - m1.m30 * m2.m02 + m1.m31 * m2.m12 + m1.m32 * m2.m22 + m1.m33 * m2.m32, - m1.m30 * m2.m03 + m1.m31 * m2.m13 + m1.m32 * m2.m23 + m1.m33 * m2.m33); - } - - /** - * Transform the vector vec using this Matrix4f and place the result back into - * vec. - * - * @param vec - * the single precision vector to be transformed - */ - public void transform(T4 vec) { - transform2(vec, vec); - } - - /** - * Transform the vector vec using this Matrix4f and place the result into - * vecOut. - * - * @param vec - * the single precision vector to be transformed - * @param vecOut - * the vector into which the transformed values are placed - */ - public void transform2(T4 vec, T4 vecOut) { - // alias-safe - vecOut.set4(m00 * vec.x + m01 * vec.y + m02 * vec.z + m03 * vec.w, m10 - * vec.x + m11 * vec.y + m12 * vec.z + m13 * vec.w, m20 * vec.x + m21 - * vec.y + m22 * vec.z + m23 * vec.w, m30 * vec.x + m31 * vec.y + m32 - * vec.z + m33 * vec.w); - } - - /** - * Transforms the point parameter with this Matrix4f and places the result - * back into point. The fourth element of the point input parameter is assumed - * to be one. - * - * @param point - * the input point to be transformed. - */ - public void rotTrans(T3 point) { - rotTrans2(point, point); - } - - /** - * Transforms the point parameter with this Matrix4f and places the result - * into pointOut. The fourth element of the point input parameter is assumed to - * be one. point may be pointOut - * - * @param point - * the input point to be transformed. - * @param pointOut - * the transformed point - * @return pointOut - */ - public T3 rotTrans2(T3 point, T3 pointOut) { - pointOut.set( - m00 * point.x + m01 * point.y + m02 * point.z + m03, - m10 * point.x + m11 * point.y + m12 * point.z + m13, - m20 * point.x + m21 * point.y + m22 * point.z + m23); - return pointOut; - } - - /** - * Sets the value of this matrix to a rotation matrix about the w axis by the - * passed angle. - * - * @param angle - * the angle to rotate about the W axis in radians - * @return this - */ - public M4 setAsXYRotation(float angle) { - setIdentity(); - double c = Math.cos(angle); - double s = Math.sin(angle); - m22 = (float) c; - m23 = (float) -s; - m32 = (float) s; - m33 = (float) c; - return this; - } - - /** - * Sets the value of this matrix to a rotation matrix about the w axis by the - * passed angle. - * - * @param angle - * the angle to rotate about the W axis in radians - * @return this - */ - public M4 setAsYZRotation(float angle) { - setIdentity(); - double c = Math.cos(angle); - double s = Math.sin(angle); - m00 = (float) c; - m03 = (float) -s; - m30 = (float) s; - m33 = (float) c; - return this; - } - - /** - * Sets the value of this matrix to a rotation matrix about the w axis by the - * passed angle. - * - * @param angle - * the angle to rotate about the W axis in radians - * @return this - */ - public M4 setAsXZRotation(float angle) { - setIdentity(); - double c = Math.cos(angle); - double s = Math.sin(angle); - m11 = (float) c; - m13 = (float) -s; - m31 = (float) s; - m33 = (float) c; - return this; - } - - /** - * Returns true if the Object o is of type Matrix4f and all of the data - * members of t1 are equal to the corresponding data members in this Matrix4f. - * - * @param o - * the object with which the comparison is made. - */ - @Override - public boolean equals(Object o) { - if (!(o instanceof M4)) - return false; - M4 m = (M4) o; - return (this.m00 == m.m00 && this.m01 == m.m01 && this.m02 == m.m02 - && this.m03 == m.m03 && this.m10 == m.m10 && this.m11 == m.m11 - && this.m12 == m.m12 && this.m13 == m.m13 && this.m20 == m.m20 - && this.m21 == m.m21 && this.m22 == m.m22 && this.m23 == m.m23 - && this.m30 == m.m30 && this.m31 == m.m31 && this.m32 == m.m32 && this.m33 == m.m33); - } - - /** - * Returns a hash number based on the data values in this object. Two - * different Matrix4f objects with identical data values (ie, returns true for - * equals(Matrix4f) ) will return the same hash number. Two objects with - * different data members may return the same hash value, although this is not - * likely. - * - * @return the integer hash value - */ - @Override - public int hashCode() { - return T3.floatToIntBits(m00) ^ T3.floatToIntBits(m01) - ^ T3.floatToIntBits(m02) ^ T3.floatToIntBits(m03) - ^ T3.floatToIntBits(m10) ^ T3.floatToIntBits(m11) - ^ T3.floatToIntBits(m12) ^ T3.floatToIntBits(m13) - ^ T3.floatToIntBits(m20) ^ T3.floatToIntBits(m21) - ^ T3.floatToIntBits(m22) ^ T3.floatToIntBits(m23) - ^ T3.floatToIntBits(m30) ^ T3.floatToIntBits(m31) - ^ T3.floatToIntBits(m32) ^ T3.floatToIntBits(m33); - } - - /** - * Returns a string that contains the values of this Matrix4f. - * - * @return the String representation - */ - @Override - public String toString() { - return "[\n [" + m00 + "\t" + m01 + "\t" + m02 + "\t" + m03 + "]" - + "\n [" + m10 + "\t" + m11 + "\t" + m12 + "\t" + m13 + "]" + "\n [" - + m20 + "\t" + m21 + "\t" + m22 + "\t" + m23 + "]" + "\n [" + m30 - + "\t" + m31 + "\t" + m32 + "\t" + m33 + "] ]"; - } - public M4 round(float f) { - m00 = rnd(m00, f); - m01 = rnd(m01, f); - m02 = rnd(m02, f); - m03 = rnd(m03, f); - m10 = rnd(m10, f); - m11 = rnd(m11, f); - m12 = rnd(m12, f); - m13 = rnd(m13, f); - m20 = rnd(m20, f); - m21 = rnd(m21, f); - m22 = rnd(m22, f); - m23 = rnd(m23, f); - m30 = rnd(m30, f); - m31 = rnd(m31, f); - m32 = rnd(m32, f); - m33 = rnd(m33, f); - return this; - } - - private float rnd(float n, float f) { - return (Math.abs(n) < f ? 0 : n); - } -} diff --git a/src2/javajs/util/Matrix.java b/src2/javajs/util/Matrix.java deleted file mode 100644 index cea5a04..0000000 --- a/src2/javajs/util/Matrix.java +++ /dev/null @@ -1,457 +0,0 @@ -package javajs.util; - -/** - * - * streamlined and refined for Jmol by Bob Hanson - * - * from http://math.nist.gov/javanumerics/jama/ - * - * Jama = Java Matrix class. - * - * @author The MathWorks, Inc. and the National Institute of Standards and - * Technology. - * @version 5 August 1998 - */ - -public class Matrix implements Cloneable { - - public double[][] a; - protected int m, n; - - /** - * Construct a matrix quickly without checking arguments. - * - * @param a - * Two-dimensional array of doubles or null - * @param m - * Number of rows. - * @param n - * Number of colums. - */ - - public Matrix(double[][] a, int m, int n) { - this.a = (a == null ? new double[m][n] : a); - this.m = m; - this.n = n; - } - - /** - * Get row dimension. - * - * @return m, the number of rows. - */ - - public int getRowDimension() { - return m; - } - - /** - * Get column dimension. - * - * @return n, the number of columns. - */ - - public int getColumnDimension() { - return n; - } - - /** - * Access the internal two-dimensional array. - * - * @return Pointer to the two-dimensional array of matrix elements. - */ - - public double[][] getArray() { - return a; - } - - /** - * Copy the internal two-dimensional array. - * - * @return Two-dimensional array copy of matrix elements. - */ - - public double[][] getArrayCopy() { - double[][] x = new double[m][n]; - for (int i = m; --i >= 0;) - for (int j = n; --j >= 0;) - x[i][j] = a[i][j]; - return x; - } - - /** - * Make a deep copy of a matrix - * - * @return copy - */ - - public Matrix copy() { - Matrix x = new Matrix(null, m, n); - double[][] c = x.a; - for (int i = m; --i >= 0;) - for (int j = n; --j >= 0;) - c[i][j] = a[i][j]; - return x; - } - - /** - * Clone the Matrix object. - */ - - @Override - public Object clone() { - return copy(); - } - - /** - * Get a submatrix. - * - * @param i0 - * Initial row index - * @param j0 - * Initial column index - * @param nrows - * Number of rows - * @param ncols - * Number of columns - * @return submatrix - * - */ - - public Matrix getSubmatrix(int i0, int j0, int nrows, int ncols) { - Matrix x = new Matrix(null, nrows, ncols); - double[][] xa = x.a; - for (int i = nrows; --i >= 0;) - for (int j = ncols; --j >= 0;) - xa[i][j] = a[i0 + i][j0 + j]; - return x; - } - - /** - * Get a submatrix for a give number of columns and selected row set. - * - * @param r - * Array of row indices. - * @param n - * number of rows - * @return submatrix - */ - - public Matrix getMatrixSelected(int[] r, int n) { - Matrix x = new Matrix(null, r.length, n); - double[][] xa = x.a; - for (int i = r.length; --i >= 0;) { - double[] b = a[r[i]]; - for (int j = n; --j >= 0;) - xa[i][j] = b[j]; - } - return x; - } - - /** - * Matrix transpose. - * - * @return A' - */ - - public Matrix transpose() { - Matrix x = new Matrix(null, n, m); - double[][] c = x.a; - for (int i = m; --i >= 0;) - for (int j = n; --j >= 0;) - c[j][i] = a[i][j]; - return x; - } - - /** - * add two matrices - * @param b - * @return new Matrix this + b - */ - public Matrix add(Matrix b) { - return scaleAdd(b, 1); - } - - /** - * subtract two matrices - * @param b - * @return new Matrix this - b - */ - public Matrix sub(Matrix b) { - return scaleAdd(b, -1); - } - - /** - * X = A + B*scale - * @param b - * @param scale - * @return X - * - */ - public Matrix scaleAdd(Matrix b, double scale) { - Matrix x = new Matrix(null, m, n); - double[][] xa = x.a; - double[][] ba = b.a; - for (int i = m; --i >= 0;) - for (int j = n; --j >= 0;) - xa[i][j] = ba[i][j] * scale + a[i][j]; - return x; - } - - /** - * Linear algebraic matrix multiplication, A * B - * - * @param b - * another matrix - * @return Matrix product, A * B or null for wrong dimension - */ - - public Matrix mul(Matrix b) { - if (b.m != n) - return null; - Matrix x = new Matrix(null, m, b.n); - double[][] xa = x.a; - double[][] ba = b.a; - for (int j = b.n; --j >= 0;) - for (int i = m; --i >= 0;) { - double[] arowi = a[i]; - double s = 0; - for (int k = n; --k >= 0;) - s += arowi[k] * ba[k][j]; - xa[i][j] = s; - } - return x; - } - - /** - * Matrix inverse or pseudoinverse - * - * @return inverse (m == n) or pseudoinverse (m != n) - */ - - public Matrix inverse() { - return new LUDecomp(m, n).solve(identity(m, m), n); - } - - /** - * Matrix trace. - * - * @return sum of the diagonal elements. - */ - - public double trace() { - double t = 0; - for (int i = Math.min(m, n); --i >= 0;) - t += a[i][i]; - return t; - } - - /** - * Generate identity matrix - * - * @param m - * Number of rows. - * @param n - * Number of columns. - * @return An m-by-n matrix with ones on the diagonal and zeros elsewhere. - */ - - public static Matrix identity(int m, int n) { - Matrix x = new Matrix(null, m, n); - double[][] xa = x.a; - for (int i = Math.min(m, n); --i >= 0;) - xa[i][i] = 1; - return x; - } - - /** - * similarly to M3/M4 standard rotation/translation matrix - * we set a rotationTranslation matrix to be: - * - * [ nxn rot nx1 trans - * - * 1xn 0 1x1 1 ] - * - * - * @return rotation matrix - */ - public Matrix getRotation() { - return getSubmatrix(0, 0, m - 1, n - 1); - } - - public Matrix getTranslation() { - return getSubmatrix(0, n - 1, m - 1, 1); - } - - public static Matrix newT(T3 r, boolean asColumn) { - return (asColumn ? new Matrix(new double[][] { new double[] { r.x }, - new double[] { r.y }, new double[] { r.z } }, 3, 1) : new Matrix( - new double[][] { new double[] { r.x, r.y, r.z } }, 1, 3)); - } - - @Override - public String toString() { - String s = "[\n"; - for (int i = 0; i < m; i++) { - s += " ["; - for (int j = 0; j < n; j++) - s += " " + a[i][j]; - s += "]\n"; - } - s += "]"; - return s; - } - - /** - * - * Edited down by Bob Hanson for minimum needed by Jmol -- just constructor - * and solve - * - * LU Decomposition. - *

- * For an m-by-n matrix A with m >= n, the LU decomposition is an m-by-n unit - * lower triangular matrix L, an n-by-n upper triangular matrix U, and a - * permutation vector piv of length m so that A(piv,:) = L*U. If m < n, then L - * is m-by-m and U is m-by-n. - *

- * The LU decompostion with pivoting always exists, even if the matrix is - * singular, so the constructor will never fail. The primary use of the LU - * decomposition is in the solution of square systems of simultaneous linear - * equations. This will fail if isNonsingular() returns false. - */ - - private class LUDecomp { - - /* ------------------------ - Class variables - * ------------------------ */ - - /** - * Array for internal storage of decomposition. - * - */ - private double[][] LU; - - /** - * Internal storage of pivot vector. - * - */ - private int[] piv; - - private int pivsign; - - /* ------------------------ - Constructor - * ------------------------ */ - - /** - * LU Decomposition Structure to access L, U and piv. - * @param m - * @param n - * - */ - - protected LUDecomp(int m, int n) { - - // Use a "left-looking", dot-product, Crout/Doolittle algorithm. - - LU = getArrayCopy(); - piv = new int[m]; - for (int i = m; --i >= 0;) - piv[i] = i; - pivsign = 1; - double[] LUrowi; - double[] LUcolj = new double[m]; - - // Outer loop. - - for (int j = 0; j < n; j++) { - - // Make a copy of the j-th column to localize references. - - for (int i = m; --i >= 0;) - LUcolj[i] = LU[i][j]; - - // Apply previous transformations. - - for (int i = m; --i >= 0;) { - LUrowi = LU[i]; - - // Most of the time is spent in the following dot product. - - int kmax = Math.min(i, j); - double s = 0.0; - for (int k = kmax; --k >= 0;) - s += LUrowi[k] * LUcolj[k]; - - LUrowi[j] = LUcolj[i] -= s; - } - - // Find pivot and exchange if necessary. - - int p = j; - for (int i = m; --i > j;) - if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) - p = i; - if (p != j) { - for (int k = n; --k >= 0;) { - double t = LU[p][k]; - LU[p][k] = LU[j][k]; - LU[j][k] = t; - } - int k = piv[p]; - piv[p] = piv[j]; - piv[j] = k; - pivsign = -pivsign; - } - - // Compute multipliers. - - if (j < m & LU[j][j] != 0.0) - for (int i = m; --i > j;) - LU[i][j] /= LU[j][j]; - } - } - - /* ------------------------ - default Methods - * ------------------------ */ - - /** - * Solve A*X = B - * - * @param b - * A Matrix with as many rows as A and any number of columns. - * @param n - * @return X so that L*U*X = B(piv,:) or null for wrong size or singular matrix - */ - - protected Matrix solve(Matrix b, int n) { - for (int j = 0; j < n; j++) - if (LU[j][j] == 0) - return null; // matrix is singular - - // Copy right hand side with pivoting - int nx = b.n; - Matrix x = b.getMatrixSelected(piv, nx); - double[][] a = x.a; - - // Solve L*Y = B(piv,:) - for (int k = 0; k < n; k++) - for (int i = k + 1; i < n; i++) - for (int j = 0; j < nx; j++) - a[i][j] -= a[k][j] * LU[i][k]; - - // Solve U*X = Y; - for (int k = n; --k >= 0;) { - for (int j = nx; --j >= 0;) - a[k][j] /= LU[k][k]; - for (int i = k; --i >= 0;) - for (int j = nx; --j >= 0;) - a[i][j] -= a[k][j] * LU[i][k]; - } - return x; - } - } - -} diff --git a/src2/javajs/util/Measure.java b/src2/javajs/util/Measure.java deleted file mode 100644 index 8b21cfe..0000000 --- a/src2/javajs/util/Measure.java +++ /dev/null @@ -1,728 +0,0 @@ -/* $RCSfile$ - * $Author: egonw $ - * $Date: 2005-11-10 09:52:44 -0600 (Thu, 10 Nov 2005) $ - * $Revision: 4255 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2003-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.util; - -import javajs.api.EigenInterface; - -import javajs.api.Interface; - - - - -//import org.jmol.script.T; - -final public class Measure { - - public final static float radiansPerDegree = (float) (2 * Math.PI / 360); - - public static float computeAngle(T3 pointA, T3 pointB, T3 pointC, V3 vectorBA, V3 vectorBC, boolean asDegrees) { - vectorBA.sub2(pointA, pointB); - vectorBC.sub2(pointC, pointB); - float angle = vectorBA.angle(vectorBC); - return (asDegrees ? angle / radiansPerDegree : angle); - } - - public static float computeAngleABC(T3 pointA, T3 pointB, T3 pointC, boolean asDegrees) { - V3 vectorBA = new V3(); - V3 vectorBC = new V3(); - return computeAngle(pointA, pointB, pointC, vectorBA, vectorBC, asDegrees); - } - - public static float computeTorsion(T3 p1, T3 p2, T3 p3, T3 p4, boolean asDegrees) { - - float ijx = p1.x - p2.x; - float ijy = p1.y - p2.y; - float ijz = p1.z - p2.z; - - float kjx = p3.x - p2.x; - float kjy = p3.y - p2.y; - float kjz = p3.z - p2.z; - - float klx = p3.x - p4.x; - float kly = p3.y - p4.y; - float klz = p3.z - p4.z; - - float ax = ijy * kjz - ijz * kjy; - float ay = ijz * kjx - ijx * kjz; - float az = ijx * kjy - ijy * kjx; - float cx = kjy * klz - kjz * kly; - float cy = kjz * klx - kjx * klz; - float cz = kjx * kly - kjy * klx; - - float ai2 = 1f / (ax * ax + ay * ay + az * az); - float ci2 = 1f / (cx * cx + cy * cy + cz * cz); - - float ai = (float) Math.sqrt(ai2); - float ci = (float) Math.sqrt(ci2); - float denom = ai * ci; - float cross = ax * cx + ay * cy + az * cz; - float cosang = cross * denom; - if (cosang > 1) { - cosang = 1; - } - if (cosang < -1) { - cosang = -1; - } - - float torsion = (float) Math.acos(cosang); - float dot = ijx * cx + ijy * cy + ijz * cz; - float absDot = Math.abs(dot); - torsion = (dot / absDot > 0) ? torsion : -torsion; - return (asDegrees ? torsion / radiansPerDegree : torsion); - } - - /** - * This method calculates measures relating to two points in space - * with related quaternion frame difference. It is used in Jmol for - * calculating straightness and many other helical quantities. - * - * @param a - * @param b - * @param dq - * @return new T3[] { pt_a_prime, n, r, P3.new3(theta, pitch, residuesPerTurn), pt_b_prime }; - */ - public static T3[] computeHelicalAxis(P3 a, P3 b, Quat dq) { - - // b - // | /| - // | / | - // | / | - // |/ c - // b'+ / \ - // | / \ Vcb = Vab . n - // n | / \d Vda = (Vcb - Vab) / 2 - // |/theta \ - // a'+---------a - // r - - V3 vab = new V3(); - vab.sub2(b, a); - /* - * testing here to see if directing the normal makes any difference -- oddly - * enough, it does not. When n = -n and theta = -theta vab.n is reversed, - * and that magnitude is multiplied by n in generating the A'-B' vector. - * - * a negative angle implies a left-handed axis (sheets) - */ - float theta = dq.getTheta(); - V3 n = dq.getNormal(); - float v_dot_n = vab.dot(n); - if (Math.abs(v_dot_n) < 0.0001f) - v_dot_n = 0; - V3 va_prime_d = new V3(); - va_prime_d.cross(vab, n); - if (va_prime_d.dot(va_prime_d) != 0) - va_prime_d.normalize(); - V3 vda = new V3(); - V3 vcb = V3.newV(n); - if (v_dot_n == 0) - v_dot_n = PT.FLOAT_MIN_SAFE; // allow for perpendicular axis to vab - vcb.scale(v_dot_n); - vda.sub2(vcb, vab); - vda.scale(0.5f); - va_prime_d.scale(theta == 0 ? 0 : (float) (vda.length() / Math.tan(theta - / 2 / 180 * Math.PI))); - V3 r = V3.newV(va_prime_d); - if (theta != 0) - r.add(vda); - P3 pt_a_prime = P3.newP(a); - pt_a_prime.sub(r); - // already done this. ?? - if (v_dot_n != PT.FLOAT_MIN_SAFE) - n.scale(v_dot_n); - // must calculate directed angle: - P3 pt_b_prime = P3.newP(pt_a_prime); - pt_b_prime.add(n); - theta = computeTorsion(a, pt_a_prime, pt_b_prime, b, true); - if (Float.isNaN(theta) || r.length() < 0.0001f) - theta = dq.getThetaDirectedV(n); // allow for r = 0 - // anything else is an array - float residuesPerTurn = Math.abs(theta == 0 ? 0 : 360f / theta); - float pitch = Math.abs(v_dot_n == PT.FLOAT_MIN_SAFE ? 0 : n.length() - * (theta == 0 ? 1 : 360f / theta)); - return new T3[] { pt_a_prime, n, r, P3.new3(theta, pitch, residuesPerTurn), pt_b_prime }; - } - - public static P4 getPlaneThroughPoints(T3 pointA, - T3 pointB, - T3 pointC, V3 vNorm, - V3 vAB, P4 plane) { - float w = getNormalThroughPoints(pointA, pointB, pointC, vNorm, vAB); - plane.set4(vNorm.x, vNorm.y, vNorm.z, w); - return plane; - } - - public static void getPlaneThroughPoint(T3 pt, V3 normal, P4 plane) { - plane.set4(normal.x, normal.y, normal.z, -normal.dot(pt)); - } - - public static float distanceToPlane(P4 plane, T3 pt) { - return (plane == null ? Float.NaN - : (plane.dot(pt) + plane.w) / (float) Math.sqrt(plane.dot(plane))); - } - - public static float directedDistanceToPlane(P3 pt, P4 plane, P3 ptref) { - float f = plane.dot(pt) + plane.w; - float f1 = plane.dot(ptref) + plane.w; - return Math.signum(f1) * f / (float) Math.sqrt(plane.dot(plane)); - } - - public static float distanceToPlaneD(P4 plane, float d, P3 pt) { - return (plane == null ? Float.NaN : (plane.dot(pt) + plane.w) / d); - } - - public static float distanceToPlaneV(V3 norm, float w, P3 pt) { - return (norm == null ? Float.NaN - : (norm.dot(pt) + w) / (float) Math.sqrt(norm.dot(norm))); - } - - /** - * note that if vAB or vAC is dispensible, vNormNorm can be one of them - * @param pointA - * @param pointB - * @param pointC - * @param vNormNorm - * @param vAB - */ - public static void calcNormalizedNormal(T3 pointA, T3 pointB, - T3 pointC, T3 vNormNorm, T3 vAB) { - vAB.sub2(pointB, pointA); - vNormNorm.sub2(pointC, pointA); - vNormNorm.cross(vAB, vNormNorm); - vNormNorm.normalize(); - } - - public static float getDirectedNormalThroughPoints(T3 pointA, - T3 pointB, T3 pointC, T3 ptRef, V3 vNorm, - V3 vAB) { - // for x = plane({atomno=1}, {atomno=2}, {atomno=3}, {atomno=4}) - float nd = getNormalThroughPoints(pointA, pointB, pointC, vNorm, vAB); - if (ptRef != null) { - P3 pt0 = P3.newP(pointA); - pt0.add(vNorm); - float d = pt0.distance(ptRef); - pt0.sub2(pointA, vNorm); - if (d > pt0.distance(ptRef)) { - vNorm.scale(-1); - nd = -nd; - } - } - return nd; - } - - /** - * @param pointA - * @param pointB - * @param pointC - * @param vNorm - * @param vTemp - * @return w - */ - public static float getNormalThroughPoints(T3 pointA, T3 pointB, - T3 pointC, T3 vNorm, T3 vTemp) { - // for Polyhedra - calcNormalizedNormal(pointA, pointB, pointC, vNorm, vTemp); - // ax + by + cz + d = 0 - // so if a point is in the plane, then N dot X = -d - vTemp.setT(pointA); - return -vTemp.dot(vNorm); - } - - public static void getPlaneProjection(P3 pt, P4 plane, P3 ptProj, V3 vNorm) { - float dist = distanceToPlane(plane, pt); - vNorm.set(plane.x, plane.y, plane.z); - vNorm.normalize(); - vNorm.scale(-dist); - ptProj.add2(pt, vNorm); - } - - /** - * - * @param ptCenter - * @param ptA - * @param ptB - * @param ptC - * @param isOutward - * @param normal set to be opposite to direction of ptCenter from ABC - * @param vTemp - * @return true if winding is CCW; false if CW - */ - public static boolean getNormalFromCenter(P3 ptCenter, P3 ptA, P3 ptB, P3 ptC, - boolean isOutward, V3 normal, V3 vTemp) { - float d = getNormalThroughPoints(ptA, ptB, ptC, normal, vTemp); - boolean isReversed = (distanceToPlaneV(normal, d, ptCenter) > 0); - if (isReversed == isOutward) - normal.scale(-1f); - return !isReversed; - } - - public final static V3 axisY = V3.new3(0, 1, 0); - - public static void getNormalToLine(P3 pointA, P3 pointB, - V3 vNormNorm) { - // vector in xy plane perpendicular to a line between two points RMH - vNormNorm.sub2(pointA, pointB); - vNormNorm.cross(vNormNorm, axisY); - vNormNorm.normalize(); - if (Float.isNaN(vNormNorm.x)) - vNormNorm.set(1, 0, 0); - } - - public static void getBisectingPlane(P3 pointA, V3 vAB, - T3 ptTemp, V3 vTemp, P4 plane) { - ptTemp.scaleAdd2(0.5f, vAB, pointA); - vTemp.setT(vAB); - vTemp.normalize(); - getPlaneThroughPoint(ptTemp, vTemp, plane); - } - - public static void projectOntoAxis(P3 point, P3 axisA, - V3 axisUnitVector, - V3 vectorProjection) { - vectorProjection.sub2(point, axisA); - float projectedLength = vectorProjection.dot(axisUnitVector); - point.scaleAdd2(projectedLength, axisUnitVector, axisA); - vectorProjection.sub2(point, axisA); - } - - public static void calcBestAxisThroughPoints(P3[] points, P3 axisA, - V3 axisUnitVector, - V3 vectorProjection, - int nTriesMax) { - // just a crude starting point. - - int nPoints = points.length; - axisA.setT(points[0]); - axisUnitVector.sub2(points[nPoints - 1], axisA); - axisUnitVector.normalize(); - - /* - * We now calculate the least-squares 3D axis - * through the helix alpha carbons starting with Vo - * as a first approximation. - * - * This uses the simple 0-centered least squares fit: - * - * Y = M cross Xi - * - * minimizing R^2 = SUM(|Y - Yi|^2) - * - * where Yi is the vector PERPENDICULAR of the point onto axis Vo - * and Xi is the vector PROJECTION of the point onto axis Vo - * and M is a vector adjustment - * - * M = SUM_(Xi cross Yi) / sum(|Xi|^2) - * - * from which we arrive at: - * - * V = Vo + (M cross Vo) - * - * Basically, this is just a 3D version of a - * standard 2D least squares fit to a line, where we would say: - * - * y = m xi + b - * - * D = n (sum xi^2) - (sum xi)^2 - * - * m = [(n sum xiyi) - (sum xi)(sum yi)] / D - * b = [(sum yi) (sum xi^2) - (sum xi)(sum xiyi)] / D - * - * but here we demand that the line go through the center, so we - * require (sum xi) = (sum yi) = 0, so b = 0 and - * - * m = (sum xiyi) / (sum xi^2) - * - * In 3D we do the same but - * instead of x we have Vo, - * instead of multiplication we use cross products - * - * A bit of iteration is necessary. - * - * Bob Hanson 11/2006 - * - */ - - calcAveragePointN(points, nPoints, axisA); - - int nTries = 0; - while (nTries++ < nTriesMax - && findAxis(points, nPoints, axisA, axisUnitVector, vectorProjection) > 0.001) { - } - - /* - * Iteration here gets the job done. - * We now find the projections of the endpoints onto the axis - * - */ - - P3 tempA = P3.newP(points[0]); - projectOntoAxis(tempA, axisA, axisUnitVector, vectorProjection); - axisA.setT(tempA); - } - - public static float findAxis(P3[] points, int nPoints, P3 axisA, - V3 axisUnitVector, V3 vectorProjection) { - V3 sumXiYi = new V3(); - V3 vTemp = new V3(); - P3 pt = new P3(); - P3 ptProj = new P3(); - V3 a = V3.newV(axisUnitVector); - - float sum_Xi2 = 0; - for (int i = nPoints; --i >= 0;) { - pt.setT(points[i]); - ptProj.setT(pt); - projectOntoAxis(ptProj, axisA, axisUnitVector, - vectorProjection); - vTemp.sub2(pt, ptProj); - //sum_Yi2 += vTemp.lengthSquared(); - vTemp.cross(vectorProjection, vTemp); - sumXiYi.add(vTemp); - sum_Xi2 += vectorProjection.lengthSquared(); - } - V3 m = V3.newV(sumXiYi); - m.scale(1 / sum_Xi2); - vTemp.cross(m, axisUnitVector); - axisUnitVector.add(vTemp); - axisUnitVector.normalize(); - //check for change in direction by measuring vector difference length - vTemp.sub2(axisUnitVector, a); - return vTemp.length(); - } - - - public static void calcAveragePoint(P3 pointA, P3 pointB, - P3 pointC) { - pointC.set((pointA.x + pointB.x) / 2, (pointA.y + pointB.y) / 2, - (pointA.z + pointB.z) / 2); - } - - public static void calcAveragePointN(P3[] points, int nPoints, - P3 averagePoint) { - averagePoint.setT(points[0]); - for (int i = 1; i < nPoints; i++) - averagePoint.add(points[i]); - averagePoint.scale(1f / nPoints); - } - - public static Lst transformPoints(Lst vPts, M4 m4, P3 center) { - Lst v = new Lst(); - for (int i = 0; i < vPts.size(); i++) { - P3 pt = P3.newP(vPts.get(i)); - pt.sub(center); - m4.rotTrans(pt); - pt.add(center); - v.addLast(pt); - } - return v; - } - - public static boolean isInTetrahedron(P3 pt, P3 ptA, P3 ptB, - P3 ptC, P3 ptD, - P4 plane, V3 vTemp, - V3 vTemp2, boolean fullyEnclosed) { - boolean b = (distanceToPlane(getPlaneThroughPoints(ptC, ptD, ptA, vTemp, vTemp2, plane), pt) >= 0); - if (b != (distanceToPlane(getPlaneThroughPoints(ptA, ptD, ptB, vTemp, vTemp2, plane), pt) >= 0)) - return false; - if (b != (distanceToPlane(getPlaneThroughPoints(ptB, ptD, ptC, vTemp, vTemp2, plane), pt) >= 0)) - return false; - float d = distanceToPlane(getPlaneThroughPoints(ptA, ptB, ptC, vTemp, vTemp2, plane), pt); - if (fullyEnclosed) - return (b == (d >= 0)); - float d1 = distanceToPlane(plane, ptD); - return d1 * d <= 0 || Math.abs(d1) > Math.abs(d); - } - - - /** - * - * @param plane1 - * @param plane2 - * @return [ point, vector ] or [] - */ - public static Lst getIntersectionPP(P4 plane1, P4 plane2) { - float a1 = plane1.x; - float b1 = plane1.y; - float c1 = plane1.z; - float d1 = plane1.w; - float a2 = plane2.x; - float b2 = plane2.y; - float c2 = plane2.z; - float d2 = plane2.w; - V3 norm1 = V3.new3(a1, b1, c1); - V3 norm2 = V3.new3(a2, b2, c2); - V3 nxn = new V3(); - nxn.cross(norm1, norm2); - float ax = Math.abs(nxn.x); - float ay = Math.abs(nxn.y); - float az = Math.abs(nxn.z); - float x, y, z, diff; - int type = (ax > ay ? (ax > az ? 1 : 3) : ay > az ? 2 : 3); - switch(type) { - case 1: - x = 0; - diff = (b1 * c2 - b2 * c1); - if (Math.abs(diff) < 0.01) return null; - y = (c1 * d2 - c2 * d1) / diff; - z = (b2 * d1 - d2 * b1) / diff; - break; - case 2: - diff = (a1 * c2 - a2 * c1); - if (Math.abs(diff) < 0.01) return null; - x = (c1 * d2 - c2 * d1) / diff; - y = 0; - z = (a2 * d1 - d2 * a1) / diff; - break; - case 3: - default: - diff = (a1 * b2 - a2 * b1); - if (Math.abs(diff) < 0.01) return null; - x = (b1 * d2 - b2 * d1) / diff; - y = (a2 * d1 - d2 * a1) / diff; - z = 0; - } - Lstlist = new Lst(); - list.addLast(P3.new3(x, y, z)); - nxn.normalize(); - list.addLast(nxn); - return list; - } - - /** - * - * @param pt1 point on line - * @param v unit vector of line - * @param plane - * @param ptRet point of intersection of line with plane - * @param tempNorm - * @param vTemp - * @return ptRtet - */ - public static P3 getIntersection(P3 pt1, V3 v, - P4 plane, P3 ptRet, V3 tempNorm, V3 vTemp) { - getPlaneProjection(pt1, plane, ptRet, tempNorm); - tempNorm.set(plane.x, plane.y, plane.z); - tempNorm.normalize(); - if (v == null) - v = V3.newV(tempNorm); - float l_dot_n = v.dot(tempNorm); - if (Math.abs(l_dot_n) < 0.01) return null; - vTemp.sub2(ptRet, pt1); - ptRet.scaleAdd2(vTemp.dot(tempNorm) / l_dot_n, v, pt1); - return ptRet; - } - - /* - * public static Point3f getTriangleIntersection(Point3f a1, Point3f a2, - * Point3f a3, Point4f plane, Point3f b1, Point3f b2, Point3f b3, Vector3f - * vNorm, Vector3f vTemp, Point3f ptRet, Point3f ptTemp, Vector3f vTemp2, - * Point4f pTemp, Vector3f vTemp3) { - * - * if (getTriangleIntersection(b1, b2, a1, a2, a3, vTemp, plane, vNorm, - * vTemp2, vTemp3, ptRet, ptTemp)) return ptRet; if - * (getTriangleIntersection(b2, b3, a1, a2, a3, vTemp, plane, vNorm, vTemp2, - * vTemp3, ptRet, ptTemp)) return ptRet; if (getTriangleIntersection(b3, b1, - * a1, a2, a3, vTemp, plane, vNorm, vTemp2, vTemp3, ptRet, ptTemp)) return - * ptRet; return null; } - */ - /* - * public static boolean getTriangleIntersection(Point3f b1, Point3f b2, - * Point3f a1, Point3f a2, Point3f a3, Vector3f vTemp, Point4f plane, Vector3f - * vNorm, Vector3f vTemp2, Vector3f vTemp3, Point3f ptRet, Point3f ptTemp) { - * if (distanceToPlane(plane, b1) * distanceToPlane(plane, b2) >= 0) return - * false; vTemp.sub(b2, b1); vTemp.normalize(); if (getIntersection(b1, vTemp, - * plane, ptRet, vNorm, vTemp2) != null) { if (isInTriangle(ptRet, a1, a2, a3, - * vTemp, vTemp2, vTemp3)) return true; } return false; } private static - * boolean isInTriangle(Point3f p, Point3f a, Point3f b, Point3f c, Vector3f - * v0, Vector3f v1, Vector3f v2) { // from - * http://www.blackpawn.com/texts/pointinpoly/default.html // Compute - * barycentric coordinates v0.sub(c, a); v1.sub(b, a); v2.sub(p, a); float - * dot00 = v0.dot(v0); float dot01 = v0.dot(v1); float dot02 = v0.dot(v2); - * float dot11 = v1.dot(v1); float dot12 = v1.dot(v2); float invDenom = 1 / - * (dot00 * dot11 - dot01 * dot01); float u = (dot11 * dot02 - dot01 * dot12) - * * invDenom; float v = (dot00 * dot12 - dot01 * dot02) * invDenom; return (u - * > 0 && v > 0 && u + v < 1); } - */ - - /** - * Closed-form solution of absolute orientation requiring 1:1 mapping of - * positions. - * - * @param centerAndPoints - * @param retStddev - * @return unit quaternion representation rotation - * - * @author hansonr Bob Hanson - * - */ - public static Quat calculateQuaternionRotation(P3[][] centerAndPoints, - float[] retStddev) { - /* - * see Berthold K. P. Horn, - * "Closed-form solution of absolute orientation using unit quaternions" J. - * Opt. Soc. Amer. A, 1987, Vol. 4, pp. 629-642 - * http://www.opticsinfobase.org/viewmedia.cfm?uri=josaa-4-4-629&seq=0 - * - * - * A similar treatment was developed independently (and later!) by G. - * Kramer, in G. R. Kramer, - * "Superposition of Molecular Structures Using Quaternions" Molecular - * Simulation, 1991, Vol. 7, pp. 113-119. - * - * In that treatment there is a lot of unnecessary calculation along the - * trace of matrix M (eqn 20). I'm not sure why the extra x^2 + y^2 + z^2 + - * x'^2 + y'^2 + z'^2 is in there, but they are unnecessary and only - * contribute to larger numerical averaging errors and additional processing - * time, as far as I can tell. Adding aI, where a is a scalar and I is the - * 4x4 identity just offsets the eigenvalues but doesn't change the - * eigenvectors. - * - * and Lydia E. Kavraki, "Molecular Distance Measures" - * http://cnx.org/content/m11608/latest/ - */ - - - retStddev[1] = Float.NaN; - Quat q = new Quat(); - P3[] ptsA = centerAndPoints[0]; - P3[] ptsB = centerAndPoints[1]; - int nPts = ptsA.length - 1; - if (nPts < 2 || ptsA.length != ptsB.length) - return q; - double Sxx = 0, Sxy = 0, Sxz = 0, Syx = 0, Syy = 0, Syz = 0, Szx = 0, Szy = 0, Szz = 0; - P3 ptA = new P3(); - P3 ptB = new P3(); - P3 ptA0 = ptsA[0]; - P3 ptB0 = ptsB[0]; - for (int i = nPts + 1; --i >= 1;) { - ptA.sub2(ptsA[i], ptA0); - ptB.sub2(ptsB[i], ptB0); - Sxx += (double) ptA.x * (double) ptB.x; - Sxy += (double) ptA.x * (double) ptB.y; - Sxz += (double) ptA.x * (double) ptB.z; - Syx += (double) ptA.y * (double) ptB.x; - Syy += (double) ptA.y * (double) ptB.y; - Syz += (double) ptA.y * (double) ptB.z; - Szx += (double) ptA.z * (double) ptB.x; - Szy += (double) ptA.z * (double) ptB.y; - Szz += (double) ptA.z * (double) ptB.z; - } - retStddev[0] = getRmsd(centerAndPoints, q); - double[][] N = new double[4][4]; - N[0][0] = Sxx + Syy + Szz; - N[0][1] = N[1][0] = Syz - Szy; - N[0][2] = N[2][0] = Szx - Sxz; - N[0][3] = N[3][0] = Sxy - Syx; - - N[1][1] = Sxx - Syy - Szz; - N[1][2] = N[2][1] = Sxy + Syx; - N[1][3] = N[3][1] = Szx + Sxz; - - N[2][2] = -Sxx + Syy - Szz; - N[2][3] = N[3][2] = Syz + Szy; - - N[3][3] = -Sxx - Syy + Szz; - - // this construction prevents JavaScript from requiring preloading of Eigen - - float[] v = ((EigenInterface) Interface.getInterface("javajs.util.Eigen")) - .setM(N).getEigenvectorsFloatTransposed()[3]; - q = Quat.newP4(P4.new4(v[1], v[2], v[3], v[0])); - retStddev[1] = getRmsd(centerAndPoints, q); - return q; - } - - /** - * Fills a 4x4 matrix with rotation-translation of mapped points A to B. - * If centerA is null, this is a standard 4x4 rotation-translation matrix; - * otherwise, this 4x4 matrix is a rotation around a vector through the center of ptsA, - * and centerA is filled with that center; - * Prior to Jmol 14.3.12_2014.02.14, when used from the JmolScript compare() function, - * this method returned the second of these options instead of the first. - * - * @param ptsA - * @param ptsB - * @param m 4x4 matrix to be returned - * @param centerA return center of rotation; if null, then standard 4x4 matrix is returned - * @return stdDev - */ - public static float getTransformMatrix4(Lst ptsA, Lst ptsB, M4 m, - P3 centerA) { - P3[] cptsA = getCenterAndPoints(ptsA); - P3[] cptsB = getCenterAndPoints(ptsB); - float[] retStddev = new float[2]; - Quat q = calculateQuaternionRotation(new P3[][] { cptsA, cptsB }, - retStddev); - M3 r = q.getMatrix(); - if (centerA == null) - r.rotate(cptsA[0]); - else - centerA.setT(cptsA[0]); - V3 t = V3.newVsub(cptsB[0], cptsA[0]); - m.setMV(r, t); - return retStddev[1]; - } - - /** - * from a list of points, create an array that includes the center - * point as the first point. This array is used as a starting point for - * a quaternion analysis of superposition. - * - * @param vPts - * @return array of points with first point center - */ - public static P3[] getCenterAndPoints(Lst vPts) { - int n = vPts.size(); - P3[] pts = new P3[n + 1]; - pts[0] = new P3(); - if (n > 0) { - for (int i = 0; i < n; i++) { - pts[0].add(pts[i + 1] = vPts.get(i)); - } - pts[0].scale(1f / n); - } - return pts; - } - - public static float getRmsd(P3[][] centerAndPoints, Quat q) { - double sum2 = 0; - P3[] ptsA = centerAndPoints[0]; - P3[] ptsB = centerAndPoints[1]; - P3 cA = ptsA[0]; - P3 cB = ptsB[0]; - int n = ptsA.length - 1; - P3 ptAnew = new P3(); - - for (int i = n + 1; --i >= 1;) { - ptAnew.sub2(ptsA[i], cA); - q.transform2(ptAnew, ptAnew).add(cB); - sum2 += ptAnew.distanceSquared(ptsB[i]); - } - return (float) Math.sqrt(sum2 / n); - } - -} diff --git a/src2/javajs/util/MessagePackReader.java b/src2/javajs/util/MessagePackReader.java deleted file mode 100644 index a0e6b8b..0000000 --- a/src2/javajs/util/MessagePackReader.java +++ /dev/null @@ -1,716 +0,0 @@ -package javajs.util; - -import java.io.BufferedInputStream; -import java.io.InputStream; -import java.util.Hashtable; -import java.util.Map; - -import javajs.api.GenericBinaryDocumentReader; - -/** - * A simple MessagePack reader. See https://github.com/msgpack/msgpack/blob/master/spec.md - * with very few dependencies. - * - * Nuances: - * - * Does not implement unsigned int32 or int64 (delivers simple integers in all cases). - * Does not use doubles; just floats - * - * Note: - * - * homogeneousArrays == true will deliver null for empty array. - * - * - * Use in MMTF: - * - * - * BufferedInputStream bs = [whatever] - * - * GenericBinaryDocument binaryDoc = new javajs.util.BinaryDocument(); - * - * binaryDoc.setStream(bs, true); - * - * - * map = (new MessagePackReader(binaryDoc, true)).readMap(); - * - * entities = (Object[]) map.get("entityList"); - * - * float[] x = (float[]) decode((byte[]) map.get("xCoordList")) - * - * - * @author Bob Hanson hansonr@stolaf.edu - */ - -public class MessagePackReader { - - private GenericBinaryDocumentReader doc; - - private boolean isHomo;// homogeneous arrays -- use int[] not Integer - - // these maps must be checked for the specific number of bits, in the following order: - private final static int POSITIVEFIXINT_x80 = 0x80; //0xxxxxxx - private final static int FIXMAP_xF0 = 0x80; //1000xxxx -// private final static int FIXARRAY_xF0 = 0x90; //1001xxxx - private final static int FIXSTR_xE0 = 0xa0; //101xxxxx - private final static int NEGATIVEFIXINT_xE0 = 0xe0; //111xxxxx - private final static int DEFINITE_xE0 = 0xc0; //110xxxxx - - private final static int NIL = 0xc0; -// private final static int (NEVERUSED) = 0xc1; - private final static int FALSE = 0xc2; - private final static int TRUE = 0xc3; - private final static int BIN8 = 0xc4; - private final static int BIN16 = 0xc5; - private final static int BIN32 = 0xc6; - private final static int EXT8 = 0xc7; - private final static int EXT16 = 0xc8; - private final static int EXT32 = 0xc9; - private final static int FLOAT32 = 0xca; - private final static int FLOAT64 = 0xcb; - private final static int UINT8 = 0xcc; - private final static int UINT16 = 0xcd; - private final static int UINT32 = 0xce; - private final static int UINT64 = 0xcf; - private final static int INT8 = 0xd0; - private final static int INT16 = 0xd1; - private final static int INT32 = 0xd2; - private final static int INT64 = 0xd3; - private final static int FIXEXT1 = 0xd4; - private final static int FIXEXT2 = 0xd5; - private final static int FIXEXT4 = 0xd6; - private final static int FIXEXT8 = 0xd7; - private final static int FIXEXT16 = 0xd8; - private final static int STR8 = 0xd9; - private final static int STR16 = 0xda; - private final static int STR32 = 0xdb; - private final static int ARRAY16 = 0xdc; - private final static int ARRAY32 = 0xdd; - private final static int MAP16 = 0xde; - private final static int MAP32 = 0xdf; - - public MessagePackReader(GenericBinaryDocumentReader binaryDoc, boolean isHomogeneousArrays) { - isHomo = isHomogeneousArrays; - doc = binaryDoc; - } - - public MessagePackReader() { - // for reflection - } - - public Map getMapForStream(BufferedInputStream is) throws Exception { - doc = new BinaryDocument().setStream(is, true); - Map map = readMap(); - is.close(); - return map; - } - - @SuppressWarnings("unchecked") - public Map readMap() throws Exception { - return (Map) getNext(null, 0); - } - - public Object getNext(Object array, int pt) throws Exception { - int b = doc.readByte() & 0xFF; - int be0 = b & 0xE0; - if ((b & POSITIVEFIXINT_x80) == 0) { - if (array != null) { - ((int[]) array)[pt] = b; - return null; - } - return Integer.valueOf(b); - } - switch (be0) { - case NEGATIVEFIXINT_xE0: - b = BC.intToSignedInt(b | 0xFFFFFF00); - if (array != null) { - ((int[]) array)[pt] = b; - return null; - } - return Integer.valueOf(b); - case FIXSTR_xE0: { - String s = doc.readString(b & 0x1F); - if (array != null) { - ((String[]) array)[pt] = s; - return null; - } - return s; - } - case FIXMAP_xF0: - return ((b & 0xF0) == FIXMAP_xF0 ? getMap(b & 0x0F) : getArray(b & 0x0F)); - case DEFINITE_xE0: - switch (b) { - case NIL: - return null; - case FALSE: - return Boolean.FALSE; - case TRUE: - return Boolean.TRUE; - case EXT8: - return getObject(doc.readUInt8()); - case EXT16: - return getObject(doc.readUnsignedShort()); - case EXT32: - return getObject(doc.readInt()); // should be unsigned int - case FIXEXT1: - return getObject(1); - case FIXEXT2: - return getObject(2); - case FIXEXT4: - return getObject(4); - case FIXEXT8: - return getObject(8); - case FIXEXT16: - return getObject(16); - case ARRAY16: - return getArray(doc.readUnsignedShort()); - case ARRAY32: - return getArray(doc.readInt()); - case MAP16: - return getMap(doc.readUnsignedShort()); - case MAP32: - return getMap(doc.readInt()); - - // binary arrays: - - case BIN8: - return doc.readBytes(doc.readUInt8()); - case BIN16: - return doc.readBytes(doc.readUnsignedShort()); - case BIN32: - return doc.readBytes(doc.readInt()); - } - if (array == null) { - switch (b) { - case FLOAT32: - return Float.valueOf(doc.readFloat()); - case FLOAT64: - return Float.valueOf((float) doc.readDouble()); - case UINT8: - return Integer.valueOf(doc.readUInt8()); - case UINT16: - return Integer.valueOf(doc.readUnsignedShort()); - case UINT32: - return Integer.valueOf(doc.readInt()); // technically should be UInt32 - case UINT64: - return Long.valueOf(doc.readLong()); // should be unsigned long; incompatible with JavaScript! - case INT8: - return Integer.valueOf(doc.readByte()); - case INT16: - return Integer.valueOf(doc.readShort()); - case INT32: - return Integer.valueOf(doc.readInt()); // should be Unsigned Int here - case INT64: - return Long.valueOf(doc.readLong()); - case STR8: - return doc.readString(doc.readUInt8()); - case STR16: - return doc.readString(doc.readShort()); - case STR32: - return doc.readString(doc.readInt()); - } - } else { - switch (b) { - case FLOAT32: - ((float[]) array)[pt] = doc.readFloat(); - break; - case FLOAT64: - ((float[]) array)[pt] = (float) doc.readDouble(); - break; - case UINT8: - ((int[]) array)[pt] = doc.readUInt8(); - break; - case UINT16: - ((int[]) array)[pt] = doc.readUnsignedShort(); - break; - case UINT32: - ((int[]) array)[pt] = doc.readInt(); // should be unsigned int - break; - case UINT64: - ((int[]) array)[pt] = (int) doc.readLong(); // should be unsigned long; incompatible with JavaScript! - break; - case INT8: - ((int[]) array)[pt] = doc.readByte(); - break; - case INT16: - ((int[]) array)[pt] = doc.readShort(); - break; - case INT32: - ((int[]) array)[pt] = doc.readInt(); // should be Unsigned Int here - break; - case INT64: - ((int[]) array)[pt] = (int) doc.readLong(); - break; - case STR8: - ((String[]) array)[pt] = doc.readString(doc.readUInt8()); - break; - case STR16: - ((String[]) array)[pt] = doc.readString(doc.readShort()); - break; - case STR32: - ((String[]) array)[pt] = doc.readString(doc.readInt()); - break; - } - } - } - return null; - } - - private Object getObject(int n) throws Exception { - return new Object[] { Integer.valueOf(doc.readUInt8()), doc.readBytes(n) }; - } - - private Object getArray(int n) throws Exception { - if (isHomo) { - if (n == 0) - return null; - Object v = getNext(null, 0); - if (v instanceof Integer) { - int[] a = new int[n]; - a[0] = ((Integer) v).intValue(); - v = a; - } else if (v instanceof Float) { - float[] a = new float[n]; - a[0] = ((Float) v).floatValue(); - v = a; - } else if (v instanceof String) { - String[] a = new String[n]; - a[0] = (String) v; - v = a; - } else { - Object[] o = new Object[n]; - o[0] = v; - for (int i = 1; i < n; i++) - o[i] = getNext(null, 0); - return o; - } - for (int i = 1; i < n; i++) - getNext(v, i); - return v; - } - Object[] o = new Object[n]; - for (int i = 0; i < n; i++) - o[i] = getNext(null, 0); - return o; - } - - private Object getMap(int n) throws Exception { - Map map = new Hashtable(); - for (int i = 0; i < n; i++) { - String key = getNext(null, 0).toString(); - //Logger.info(key); - - Object value = getNext(null, 0); - if (value == null) { - //Logger.info("null value for " + key); - } else { - map.put(key, value); - } - } - return map; - } - - /////////////// MMTF MessagePack decoding /////////////// - - /** - * This single method takes care of all MMTF needs. - * - * See https://github.com/rcsb/mmtf/blob/master/spec.md - * - * @param b - * - * @return array of int, char, or float, depending upon the type - */ - public static Object decode(byte[] b) { - int type = BC.bytesToInt(b, 0, true); - int n = BC.bytesToInt(b, 4, true); - int param = BC.bytesToInt(b, 8, true); - switch (type) { - case 1: - return getFloats(b, n, 1); - case 2: // 1-byte - case 3: // 2-byte - case 4: // 4-byte - return getInts(b, n); - case 5: - return rldecode32ToStr(b); - case 6: - return rldecode32ToChar(b, n); - case 7: - return rldecode32(b, n); - case 8: - return rldecode32Delta(b, n); - case 9: - return rldecodef(b, n, param); - case 10: - return unpack16Deltaf(b, n, param); - case 11: - return getFloats(b, n, param); - case 12: // two-byte - case 13: // one-byte - return unpackf(b, 14 - type, n, param); - case 14: // two-byte - case 15: // one-byte - return unpack(b, 16 - type, n); - default: - System.out.println("MMTF type " + type + " not found!"); - return null; - } - } - - /** - * mmtf type 1 and 11 - * - * byte[4] to float32 - * - * @param b - * @param n - * @param divisor - * @return array of floats - */ - public static float[] getFloats(byte[] b, int n, float divisor) { - if (b == null) - return null; - float[] a = new float[n]; - try { - switch ((b.length - 12) / n) { - case 2: - for (int i = 0, j = 12; i < n; i++, j += 2) - a[i] = BC.bytesToShort(b, j, false) / divisor; - break; - case 4: - for (int i = 0, j = 12; i < n; i++, j += 4) - a[i] = BC.bytesToFloat(b, j, false); - break; - } - } catch (Exception e) { - } - return a; - } - - /** - * mmtf types 2-4 - * - * Decode a byte array into a byte, short, or int array. - * - * @param b - * @param n - * - * @return array of integers - */ - public static int[] getInts(byte[] b, int n) { - if (b == null) - return null; - int[] a = new int[n]; - switch ((b.length - 12) / n) { - case 1: - for (int i = 0, j = 12; i < n; i++, j++) - a[i] = b[j]; - break; - case 2: - for (int i = 0, j = 12; i < n; i++, j += 2) - a[i] = BC.bytesToShort(b, j, true); - break; - case 4: - for (int i = 0, j = 12; i < n; i++, j += 4) - a[i] = BC.bytesToInt(b, j, true); - break; - } - return a; - } - - /** - * mmtf type 5 - * - * Decode each four bytes as a 1- to 4-character string label where a 0 byte - * indicates end-of-string. - * - * @param b - * a byte array - * @return String[] - */ - public static String[] rldecode32ToStr(byte[] b) { - String[] id = new String[(b.length - 12) / 4]; - out: for (int i = 0, len = id.length, pt = 12; i < len; i++) { - SB sb = new SB(); - for (int j = 0; j < 4; j++) { - switch (b[pt]) { - case 0: - id[i] = sb.toString(); - pt += 4 - j; - continue out; - default: - sb.appendC((char) b[pt++]); - if (j == 3) - id[i] = sb.toString(); - continue; - } - } - } - return id; - } - - /** - * mmtf type 6 - * - * Decode an array of int32 using run-length decoding to one char per int. - * - * @param b - * @param n - * @return array of characters - */ - public static char[] rldecode32ToChar(byte[] b, int n) { - if (b == null) - return null; - char[] ret = new char[n]; - for (int i = 0, pt = 3; i < n;) { - char val = (char) b[((pt++) << 2) + 3]; - for (int j = BC.bytesToInt(b, (pt++) << 2, true); --j >= 0;) - ret[i++] = val; - } - return ret; - } - - /** - * mmtf type 7 - * - * Decode an array of int32 using run-length decoding. - * - * @param b - * @param n - * @return array of integers - */ - public static int[] rldecode32(byte[] b, int n) { - if (b == null) - return null; - int[] ret = new int[n]; - for (int i = 0, pt = 3; i < n;) { - int val = BC.bytesToInt(b, (pt++) << 2, true); - for (int j = BC.bytesToInt(b, (pt++) << 2, true); --j >= 0;) - ret[i++] = val; - } - return ret; - } - - /** - * mmtf type 8 - * - * Decode an array of int32 using run-length decoding of a difference array. - * - * @param b - * @param n - * @return array of integers - */ - public static int[] rldecode32Delta(byte[] b, int n) { - if (b == null) - return null; - int[] ret = new int[n]; - for (int i = 0, pt = 3, val = 0; i < n;) { - int diff = BC.bytesToInt(b, (pt++) << 2, true); - for (int j = BC.bytesToInt(b, (pt++) << 2, true); --j >= 0;) - ret[i++] = (val = val + diff); - } - return ret; - } - - /** - * mmtf type 9 - * - * Decode an array of int32 using run-length decoding and divide by a divisor - * to give a float32. - * - * @param b - * @param n - * @param divisor - * @return array of floats - */ - public static float[] rldecodef(byte[] b, int n, float divisor) { - if (b == null) - return null; - float[] ret = new float[n]; - for (int i = 0, pt = 3; i < n;) { - int val = BC.bytesToInt(b, (pt++) << 2, true); - for (int j = BC.bytesToInt(b, (pt++) << 2, true); --j >= 0;) - ret[i++] = val / divisor; - } - return ret; - } - - /** - * - * mmtf type 10 - * - * Decode an array of int16 using run-length decoding of a difference array. - * - * @param b - * @param n - * @param divisor - * @return array of floats - */ - public static float[] unpack16Deltaf(byte[] b, int n, float divisor) { - if (b == null) - return null; - float[] ret = new float[n]; - for (int i = 0, pt = 6, val = 0, buf = 0; i < n;) { - int diff = BC.bytesToShort(b, (pt++) << 1, true); - if (diff == Short.MAX_VALUE || diff == Short.MIN_VALUE) { - buf += diff; - } else { - ret[i++] = (val = val + diff + buf) / divisor; - buf = 0; - } - } - return ret; - } - - /** - * - * mmtf type 12 and 13 - * - * Unpack an array of int8 or int16 to int32 and divide to give a float32. - * - * untested - * - * @param b - * @param nBytes - * @param n - * @param divisor - * @return array of floats - */ - public static float[] unpackf(byte[] b, int nBytes, int n, float divisor) { - if (b == null) - return null; - float[] ret = new float[n]; - switch (nBytes) { - case 1: - for (int i = 0, pt = 12, offset = 0; i < n;) { - int val = b[pt++]; - if (val == Byte.MAX_VALUE || val == Byte.MIN_VALUE) { - offset += val; - } else { - ret[i++] = (val + offset) / divisor; - offset = 0; - } - } - break; - case 2: - for (int i = 0, pt = 6, offset = 0; i < n;) { - int val = BC.bytesToShort(b, (pt++) << 1, true); - if (val == Short.MAX_VALUE || val == Short.MIN_VALUE) { - offset += val; - } else { - ret[i++] = (val + offset) / divisor; - offset = 0; - } - } - break; - } - return ret; - } - - /** - * - * mmtf type 14 and 15 - * - * Unpack an array of int8 or int16 to int32. - * - * untested - * - * @param b - * @param nBytes - * @param n - * @return array of integers - */ - public static int[] unpack(byte[] b, int nBytes, int n) { - if (b == null) - return null; - int[] ret = new int[n]; - switch (nBytes) { - case 1: - for (int i = 0, pt = 12, offset = 0; i < n;) { - int val = b[pt++]; - if (val == Byte.MAX_VALUE || val == Byte.MIN_VALUE) { - offset += val; - } else { - ret[i++] = val + offset; - offset = 0; - } - } - break; - case 2: - for (int i = 0, pt = 6, offset = 0; i < n;) { - int val = BC.bytesToShort(b, (pt++) << 1, true); - if (val == Short.MAX_VALUE || val == Short.MIN_VALUE) { - offset += val; - } else { - ret[i++] = val + offset; - offset = 0; - } - } - break; - } - return ret; - } - - ///** - //* Decode an array of int16 using run-length decoding - //* of a difference array. - //* - //* @param b - //* @param n - //* @param i0 - //* @return array of integers - //*/ - //public static int[] rldecode16Delta(byte[] b, int n, int i0) { - //if (b == null) - //return null; - //int[] ret = new int[n]; - //for (int i = 0, pt = i0 / 2, val = 0; i < n;) { - //int diff = BC.bytesToShort(b, (pt++) << 1, true); - //for (int j = BC.bytesToShort(b, (pt++) << 1, true); --j >= 0;) - //ret[i++] = (val = val + diff); - //} - //return ret; - //} - - ///** - //* Do a split delta to a float[] array - //* @param xyz label "x", "y", "z", or "bFactor" - //* @param factor for dividing in the end -- 1000f or 100f - //* @return float[] - //* - //*/ - //public static float[] getFloatsSplit(String xyz, float factor) { - //byte[] big = (byte[]) map.get(xyz + "Big"); - //return (big == null ? null : splitDelta(big, - //(byte[]) map.get(xyz + "Small"), fileAtomCount, factor)); - //} - - ///** - //* Do a split delta to a float[] array - //* - //* @param big - //* [n m n m n m...] where n is a "big delta" and m is a number of - //* "small deltas - //* @param small - //* array containing the small deltas - //* @param n - //* the size of the final array - //* @param factor - //* to divide the final result by -- 1000f or 100f here - //* @return float[] - //*/ - //public static float[] splitDelta(byte[] big, byte[] small, int n, float factor) { - //float[] ret = new float[n]; - //for (int i = 0, smallpt = 0, val = 0, datapt = 0, len = big.length >> 2; i < len; i++) { - //ret[datapt++] = (val = val + BC.bytesToInt(big, i << 2, true)) / factor; - //if (++i < len) - //for (int j = BC.bytesToInt(big, i << 2, true); --j >= 0; smallpt++) - //ret[datapt++] = (val = val + BC.bytesToShort(small, smallpt << 1, true)) - // / factor; - //} - //return ret; - //} - // - - -} diff --git a/src2/javajs/util/OC.java b/src2/javajs/util/OC.java deleted file mode 100644 index 98151d1..0000000 --- a/src2/javajs/util/OC.java +++ /dev/null @@ -1,416 +0,0 @@ -package javajs.util; - -import java.io.BufferedWriter; -import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import javajs.api.BytePoster; -import javajs.api.GenericOutputChannel; -import javajs.api.js.J2SObjectInterface; - -/** - * - * A generic output method. JmolOutputChannel can be used to: - * - * add characters to a StringBuffer - * using fileName==null, append() and toString() - * - * add bytes utilizing ByteArrayOutputStream - * using writeBytes(), writeByteAsInt(), append()*, and bytesAsArray() - * *append() can be used as long as os==ByteArrayOutputStream - * or it is not used before one of the writeByte methods. - * - * output characters to a FileOutputStream - * using os==FileOutputStream, asWriter==true, append(), and closeChannel() - * - * output bytes to a FileOutputStream - * using os==FileOutputStream, writeBytes(), writeByteAsInt(), append(), and closeChannel() - * - * post characters or bytes to a remote server - * using fileName=="http://..." or "https://...", - * writeBytes(), writeByteAsInt(), append(), and closeChannel() - * - * send characters or bytes to a JavaScript function - * when JavaScript and (typeof fileName == "function") - * - * if fileName equals ";base64,", then the data are base64-encoded - * prior to writing, and closeChannel() returns the data. - * - * @author hansonr Bob Hanson hansonr@stolaf.edu 9/2013 - * - * - */ - -public class OC extends OutputStream implements GenericOutputChannel { - - private BytePoster bytePoster; // only necessary for writing to http:// or https:// - private String fileName; - private BufferedWriter bw; - private boolean isLocalFile; - private int byteCount; - private boolean isCanceled; - private boolean closed; - private OutputStream os; - private SB sb; - private String type; - private boolean isBase64; - private OutputStream os0; - private byte[] bytes; // preset bytes; output only - - public boolean bigEndian = true; - - @Override - public boolean isBigEndian() { - return bigEndian; - } - - public void setBigEndian(boolean TF) { - bigEndian = TF; - } - - public OC setParams(BytePoster bytePoster, String fileName, - boolean asWriter, OutputStream os) { - this.bytePoster = bytePoster; - isBase64 = ";base64,".equals(fileName); - if (isBase64) { - fileName = null; - os0 = os; - os = null; - } - this.fileName = fileName; - this.os = os; - isLocalFile = (fileName != null && !isRemote(fileName)); - if (asWriter && !isBase64 && os != null) - bw = Rdr.getBufferedWriter(os, null); - return this; - } - - public OC setBytes(byte[] b) { - bytes = b; - return this; - } - - public String getFileName() { - return fileName; - } - - public String getName() { - return (fileName == null ? null : fileName.substring(fileName.lastIndexOf("/") + 1)); - } - - public int getByteCount() { - return byteCount; - } - - /** - * - * @param type user-identified type (PNG, JPG, etc) - */ - public void setType(String type) { - this.type = type; - } - - public String getType() { - return type; - } - - /** - * will go to string buffer if bw == null and os == null - * - * @param s - * @return this, for chaining like a standard StringBuffer - * - */ - public OC append(String s) { - try { - if (bw != null) { - bw.write(s); - } else if (os == null) { - if (sb == null) - sb = new SB(); - sb.append(s); - } else { - byte[] b = s.getBytes(); - os.write(b, 0, b.length); - byteCount += b.length; - return this; - } - } catch (IOException e) { - // ignore - } - byteCount += s.length(); // not necessarily exactly correct if unicode - return this; - } - - @Override - public void reset() { - sb = null; - initOS(); - } - - - private void initOS() { - if (sb != null) { - String s = sb.toString(); - reset(); - append(s); - return; - } - try { - /** - * @j2sNative - * - * this.os = null; - */ - { - if (os instanceof FileOutputStream) { - os.close(); - os = new FileOutputStream(fileName); - } else { - os = null; - } - } - if (os == null) - os = new ByteArrayOutputStream(); - if (bw != null) { - bw.close(); - bw = Rdr.getBufferedWriter(os, null); - } - } catch (Exception e) { - // not perfect here. - System.out.println(e.toString()); - } - byteCount = 0; - } - - /** - * @param b - */ - @Override - public void writeByteAsInt(int b) { - if (os == null) - initOS(); - { - try { - os.write(b); - } catch (IOException e) { - } - } - byteCount++; - } - - @Override - public void write(byte[] buf, int i, int len) { - if (os == null) - initOS(); - try { - os.write(buf, i, len); - } catch (IOException e) { - } - byteCount += len; - } - - @Override - public void writeShort(short i) { - if (isBigEndian()) { - writeByteAsInt(i >> 8); - writeByteAsInt(i); - } else { - writeByteAsInt(i); - writeByteAsInt(i >> 8); - } - } - - @Override - public void writeLong(long b) { - if (isBigEndian()) { - writeInt((int) ((b >> 32) & 0xFFFFFFFFl)); - writeInt((int) (b & 0xFFFFFFFFl)); - } else { - writeByteAsInt((int) (b >> 56)); - writeByteAsInt((int) (b >> 48)); - writeByteAsInt((int) (b >> 40)); - writeByteAsInt((int) (b >> 32)); - writeByteAsInt((int) (b >> 24)); - writeByteAsInt((int) (b >> 16)); - writeByteAsInt((int) (b >> 8)); - writeByteAsInt((int) b); - } - } - - public void write(int b) { - // required by standard ZipOutputStream -- do not use, as it will break JavaScript methods - if (os == null) - initOS(); - try { - os.write(b); - } catch (IOException e) { - } - byteCount++; - } - - public void write(byte[] b) { - // not used in JavaScript due to overloading problem there - write(b, 0, b.length); - } - - public void cancel() { - isCanceled = true; - closeChannel(); - } - - @Override - @SuppressWarnings({ "unused" }) - public String closeChannel() { - if (closed) - return null; - // can't cancel file writers - try { - if (bw != null) { - bw.flush(); - bw.close(); - } else if (os != null) { - os.flush(); - os.close(); - } - if (os0 != null && isCanceled) { - os0.flush(); - os0.close(); - } - } catch (Exception e) { - // ignore closing issues - } - if (isCanceled) { - closed = true; - return null; - } - if (fileName == null) { - if (isBase64) { - String s = getBase64(); - if (os0 != null) { - os = os0; - append(s); - } - sb = new SB(); - sb.append(s); - isBase64 = false; - return closeChannel(); - } - return (sb == null ? null : sb.toString()); - } - closed = true; - J2SObjectInterface jmol = null; - Object _function = null; - /** - * @j2sNative - * - * jmol = self.J2S || Jmol; _function = (typeof this.fileName == "function" ? - * this.fileName : null); - * - */ - { - if (!isLocalFile) { - String ret = postByteArray(); // unsigned applet could do this - if (ret.startsWith("java.net")) - byteCount = -1; - return ret; - } - } - if (jmol != null) { - Object data = (sb == null ? toByteArray() : sb.toString()); - if (_function == null) - jmol._doAjax(fileName, null, data, sb == null); - else - jmol._apply(_function, data); - } - return null; - } - - public boolean isBase64() { - return isBase64; - } - - public String getBase64() { - return Base64.getBase64(toByteArray()).toString(); - } - - public byte[] toByteArray() { - return (bytes != null ? bytes : os instanceof ByteArrayOutputStream ? ((ByteArrayOutputStream)os).toByteArray() : null); - } - - @Override - @Deprecated - public void close() { - closeChannel(); - } - - @Override - public String toString() { - if (bw != null) - try { - bw.flush(); - } catch (IOException e) { - // TODO - } - if (sb != null) - return closeChannel(); - return byteCount + " bytes"; - } - - private String postByteArray() { - byte[] bytes = (sb == null ? toByteArray() : sb.toString().getBytes()); - return bytePoster.postByteArray(fileName, bytes); - } - - public final static String[] urlPrefixes = { "http:", "https:", "sftp:", "ftp:", - "file:" }; - // note that SFTP is not supported - public final static int URL_LOCAL = 4; - - public static boolean isRemote(String fileName) { - if (fileName == null) - return false; - int itype = urlTypeIndex(fileName); - return (itype >= 0 && itype != URL_LOCAL); - } - - public static boolean isLocal(String fileName) { - if (fileName == null) - return false; - int itype = urlTypeIndex(fileName); - return (itype < 0 || itype == URL_LOCAL); - } - - public static int urlTypeIndex(String name) { - if (name == null) - return -2; // local unsigned applet - for (int i = 0; i < urlPrefixes.length; ++i) { - if (name.startsWith(urlPrefixes[i])) { - return i; - } - } - return -1; - } - - @Override - public void writeInt(int i) { - if (bigEndian) { - writeByteAsInt(i >> 24); - writeByteAsInt(i >> 16); - writeByteAsInt(i >> 8); - writeByteAsInt(i); - } else { - writeByteAsInt(i); - writeByteAsInt(i >> 8); - writeByteAsInt(i >> 16); - writeByteAsInt(i >> 24); - } - } - - public void writeFloat(float x) { - writeInt(x == 0 ? 0 : Float.floatToIntBits(x)); - } - -} diff --git a/src2/javajs/util/P3.java b/src2/javajs/util/P3.java deleted file mode 100644 index 1e1dfdb..0000000 --- a/src2/javajs/util/P3.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - - - -/** - * A 3 element point that is represented by single precision floating point - * x,y,z coordinates. - * - * @version specification 1.1, implementation $Revision: 1.10 $, $Date: - * 2006/09/08 20:20:20 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 - * for unique constructor and method names - * for the optimization of compiled JavaScript using Java2Script - * - */ -public class P3 extends T3 { - - public P3() { - // ignore T3 - } - - public static P3 newP(T3 t) { - P3 p = new P3(); - p.x = t.x; - p.y = t.y; - p.z = t.z; - return p; - } - - private static P3 unlikely; - - public static P3 getUnlikely() { - return (unlikely == null ? unlikely = new3((float) Math.PI, (float) Math.E, (float) (Math.PI * Math.E)) : unlikely); - } - - public static P3 new3(float x, float y, float z) { - P3 p = new P3(); - p.x = x; - p.y = y; - p.z = z; - return p; - } - -} diff --git a/src2/javajs/util/P3i.java b/src2/javajs/util/P3i.java deleted file mode 100644 index 8f39550..0000000 --- a/src2/javajs/util/P3i.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - - - -/** - * A 3 element point that is represented by signed integer x,y,z coordinates. - * - * @since Java 3D 1.2 - * @version specification 1.2, implementation $Revision: 1.9 $, $Date: - * 2006/07/28 17:01:33 $ - * @author Kenji hiranabe - * - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique - * constructor and method names for the optimization of compiled - * JavaScript using Java2Script - */ -public class P3i extends T3i { - - public static P3i new3(int x, int y, int z) { - P3i pt = new P3i(); - pt.x = x; - pt.y = y; - pt.z = z; - return pt; - } -} diff --git a/src2/javajs/util/P4.java b/src2/javajs/util/P4.java deleted file mode 100644 index 6478602..0000000 --- a/src2/javajs/util/P4.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - - - -/** - * A 4 element point that is represented by single precision floating point - * x,y,z,w coordinates. - * - * @version specification 1.1, implementation $Revision: 1.9 $, $Date: - * 2006/07/28 17:01:32 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 - * for unique constructor and method names - * for the optimization of compiled JavaScript using Java2Script - */ -public class P4 extends T4 { - - public P4() { - // skip T4() constructor - } - - public static P4 new4(float x, float y, float z, float w) { - P4 pt = new P4(); - pt.set4(x, y, z, w); - return pt; - } - - public static P4 newPt(P4 value) { - P4 pt = new P4(); - pt.set4(value.x, value.y, value.z, value.w); - return pt; - } - - /** - * Returns the distance between this point and point p1. - * - * @param p1 - * the other point - * @return the distance between these two points - */ - public final float distance4(P4 p1) { - double dx = x - p1.x; - double dy = y - p1.y; - double dz = z - p1.z; - double dw = w - p1.w; - return (float) Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw); - } - -} diff --git a/src2/javajs/util/PT.java b/src2/javajs/util/PT.java deleted file mode 100644 index 81653cf..0000000 --- a/src2/javajs/util/PT.java +++ /dev/null @@ -1,1570 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2007-04-26 16:57:51 -0500 (Thu, 26 Apr 2007) $ - * $Revision: 7502 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package javajs.util; - -import java.lang.reflect.Array; -import java.util.Map; -import java.util.Map.Entry; - -import javajs.api.JSONEncodable; - -/** - * a combination of Parsing and Text-related utility classes - * - * @author hansonr - * - */ - -public class PT { - - public static int parseInt(String str) { - return parseIntNext(str, new int[] {0}); - } - - public static int parseIntNext(String str, int[] next) { - int cch = str.length(); - if (next[0] < 0 || next[0] >= cch) - return Integer.MIN_VALUE; - return parseIntChecked(str, cch, next); - } - - public static int parseIntChecked(String str, int ichMax, int[] next) { - boolean digitSeen = false; - int value = 0; - int ich = next[0]; - if (ich < 0) - return Integer.MIN_VALUE; - int ch; - while (ich < ichMax && isWhiteSpace(str, ich)) - ++ich; - boolean negative = false; - if (ich < ichMax && str.charAt(ich) == 45) { //"-" - negative = true; - ++ich; - } - while (ich < ichMax && (ch = str.charAt(ich)) >= 48 && ch <= 57) { - value = value * 10 + (ch - 48); - digitSeen = true; - ++ich; - } - if (!digitSeen)// || !checkTrailingText(str, ich, ichMax)) - value = Integer.MIN_VALUE; - else if (negative) - value = -value; - next[0] = ich; - return value; - } - - public static boolean isWhiteSpace(String str, int ich) { - char ch; - return (ich >= 0 && ((ch = str.charAt(ich)) == ' ' || ch == '\t' || ch == '\n')); - } - - /** - * A float parser that is 30% faster than Float.parseFloat(x) and also accepts - * x.yD+-n - * - * @param str - * @param ichMax - * @param next - * pointer; incremented - * @param isStrict - * @return value or Float.NaN - */ - public static float parseFloatChecked(String str, int ichMax, int[] next, - boolean isStrict) { - boolean digitSeen = false; - int ich = next[0]; - if (isStrict && str.indexOf('\n') != str.lastIndexOf('\n')) - return Float.NaN; - while (ich < ichMax && isWhiteSpace(str, ich)) - ++ich; - boolean negative = false; - if (ich < ichMax && str.charAt(ich) == '-') { - ++ich; - negative = true; - } - // looks crazy, but if we don't do this, Google Closure Compiler will - // write code that Safari will misinterpret in a VERY nasty way -- - // getting totally confused as to long integers and double values - - // This is Safari figuring out the values of the numbers on the line (x, y, then z): - - // ATOM 1241 CD1 LEU A 64 -2.206 36.532 31.576 1.00 60.60 C - // e=1408749273 - // -e =-1408749273 - // ATOM 1241 CD1 LEU A 64 -2.206 36.532 31.576 1.00 60.60 C - // e=-1821066134 - // e=36.532 - // ATOM 1241 CD1 LEU A 64 -2.206 36.532 31.576 1.00 60.60 C - // e=-1133871366 - // e=31.576 - // - // "e" values are just before and after the "value = -value" statement. - - int ch = 0; - float ival = 0f; - float ival2 = 0f; - while (ich < ichMax && (ch = str.charAt(ich)) >= 48 && ch <= 57) { - ival = (ival * 10f) + (ch - 48)*1f; - ++ich; - digitSeen = true; - } - boolean isDecimal = false; - int iscale = 0; - int nzero = (ival == 0 ? -1 : 0); - if (ch == '.') { - isDecimal = true; - while (++ich < ichMax && (ch = str.charAt(ich)) >= 48 && ch <= 57) { - digitSeen = true; - if (nzero < 0) { - if (ch == 48) { - nzero--; - continue; - } - nzero = -nzero; - } - if (iscale < decimalScale.length) { - ival2 = (ival2 * 10f) + (ch - 48)*1f; - iscale++; - } - } - } - float value; - - // Safari breaks here intermittently converting integers to floats - - if (!digitSeen) { - value = Float.NaN; - } else if (ival2 > 0) { - value = ival2 * decimalScale[iscale - 1]; - if (nzero > 1) { - if (nzero - 2 < decimalScale.length) { - value *= decimalScale[nzero - 2]; - } else { - value *= Math.pow(10, 1 - nzero); - } - } else { - value += ival; - } - } else { - value = ival; - } - boolean isExponent = false; - if (ich < ichMax && (ch == 69 || ch == 101 || ch == 68)) { // E e D - isExponent = true; - if (++ich >= ichMax) - return Float.NaN; - ch = str.charAt(ich); - if ((ch == '+') && (++ich >= ichMax)) - return Float.NaN; - next[0] = ich; - int exponent = parseIntChecked(str, ichMax, next); - if (exponent == Integer.MIN_VALUE) - return Float.NaN; - if (exponent > 0 && exponent <= tensScale.length) - value *= tensScale[exponent - 1]; - else if (exponent < 0 && -exponent <= decimalScale.length) - value *= decimalScale[-exponent - 1]; - else if (exponent != 0) - value *= Math.pow(10, exponent); - } else { - next[0] = ich; // the exponent code finds its own ichNextParse - } - // believe it or not, Safari reports the long-equivalent of the - // float value here, then later the float value, after no operation! - if (negative) - value = -value; - if (value == Float.POSITIVE_INFINITY) - value = Float.MAX_VALUE; - return (!isStrict || (!isExponent || isDecimal) - && checkTrailingText(str, next[0], ichMax) ? value : Float.NaN); - } - - public final static float[] tensScale = { 10f, 100f, 1000f, 10000f, 100000f, 1000000f }; - public final static float[] decimalScale = { - 0.1f, - 0.01f, - 0.001f, - 0.0001f, - 0.00001f, - 0.000001f, - 0.0000001f, - 0.00000001f, - 0.000000001f - }; - public static boolean checkTrailingText(String str, int ich, int ichMax) { - //number must be pure -- no additional characters other than white space or ; - char ch; - while (ich < ichMax && (isWhitespace(ch = str.charAt(ich)) || ch == ';')) - ++ich; - return (ich == ichMax); - } - - public static float[] parseFloatArray(String str) { - return parseFloatArrayNext(str, new int[1], null, null, null); - } - - public static int parseFloatArrayInfested(String[] tokens, float[] data) { - int len = data.length; - int nTokens = tokens.length; - int n = 0; - int max = 0; - for (int i = 0; i >= 0 && i < len && n < nTokens; i++) { - float f; - while (Float.isNaN(f = parseFloat(tokens[n++])) - && n < nTokens) { - } - if (!Float.isNaN(f)) - data[(max = i)] = f; - if (n == nTokens) - break; - } - return max + 1; - } - - /** - * @param str - * @param next - * @param f - * @param strStart or null - * @param strEnd or null - * @return array of float values - * - */ - public static float[] parseFloatArrayNext(String str, int[] next, float[] f, - String strStart, String strEnd) { - int n = 0; - int pt = next[0]; - if (pt >= 0) { - if (strStart != null) { - int p = str.indexOf(strStart, pt); - if (p >= 0) - next[0] = p + strStart.length(); - } - str = str.substring(next[0]); - pt = (strEnd == null ? -1 : str.indexOf(strEnd)); - if (pt < 0) - pt = str.length(); - else - str = str.substring(0, pt); - next[0] += pt + 1; - String[] tokens = getTokens(str); - if (f == null) - f = new float[tokens.length]; - n = parseFloatArrayInfested(tokens, f); - } - if (f == null) - return new float[0]; - for (int i = n; i < f.length; i++) - f[i] = Float.NaN; - return f; - } - - public static float parseFloatRange(String str, int ichMax, int[] next) { - int cch = str.length(); - if (ichMax > cch) - ichMax = cch; - if (next[0] < 0 || next[0] >= ichMax) - return Float.NaN; - return parseFloatChecked(str, ichMax, next, false); - } - - public static float parseFloatNext(String str, int[] next) { - int cch = (str == null ? -1 : str.length()); - return (next[0] < 0 || next[0] >= cch ? Float.NaN : parseFloatChecked(str, cch, next, false)); - } - - public static float parseFloatStrict(String str) { - // checks trailing characters and does not allow "1E35" to be float - int cch = str.length(); - if (cch == 0) - return Float.NaN; - return parseFloatChecked(str, cch, new int[] {0}, true); - } - - public static float parseFloat(String str) { - return parseFloatNext(str, new int[] {0}); - } - - public static int parseIntRadix(String s, int i) throws NumberFormatException { - /** - * - * JavaScript uses parseIntRadix - * - * @j2sNative - * - * return Integer.parseIntRadix(s, i); - * - */ - { - return Integer.parseInt(s, i); - } - } - - public static String[] getTokens(String line) { - return getTokensAt(line, 0); - } - - public static String parseToken(String str) { - return parseTokenNext(str, new int[] {0}); - } - - public static String parseTrimmed(String str) { - return parseTrimmedRange(str, 0, str.length()); - } - - public static String parseTrimmedAt(String str, int ichStart) { - return parseTrimmedRange(str, ichStart, str.length()); - } - - public static String parseTrimmedRange(String str, int ichStart, int ichMax) { - int cch = str.length(); - if (ichMax < cch) - cch = ichMax; - if (cch < ichStart) - return ""; - return parseTrimmedChecked(str, ichStart, cch); - } - - public static String[] getTokensAt(String line, int ich) { - if (line == null) - return null; - int cchLine = line.length(); - if (ich < 0 || ich > cchLine) - return null; - int tokenCount = countTokens(line, ich); - String[] tokens = new String[tokenCount]; - int[] next = new int[1]; - next[0] = ich; - for (int i = 0; i < tokenCount; ++i) - tokens[i] = parseTokenChecked(line, cchLine, next); - return tokens; - } - - public static int countChar(String line, char c) { - int n = 0; - for (int i = line.lastIndexOf(c) + 1; --i >= 0;) - if (line.charAt(i) == c) - n++; - return n; - } - - public static int countTokens(String line, int ich) { - int tokenCount = 0; - if (line != null) { - int ichMax = line.length(); - while (true) { - while (ich < ichMax && isWhiteSpace(line, ich)) - ++ich; - if (ich == ichMax) - break; - ++tokenCount; - do { - ++ich; - } while (ich < ichMax && !isWhiteSpace(line, ich)); - } - } - return tokenCount; - } - - public static String parseTokenNext(String str, int[] next) { - int cch = str.length(); - return (next[0] < 0 || next[0] >= cch ? null : parseTokenChecked(str, cch, next)); - } - - public static String parseTokenRange(String str, int ichMax, int[] next) { - int cch = str.length(); - if (ichMax > cch) - ichMax = cch; - return (next[0] < 0 || next[0] >= ichMax ? null : parseTokenChecked(str, ichMax, next)); - } - - public static String parseTokenChecked(String str, int ichMax, int[] next) { - int ich = next[0]; - while (ich < ichMax && isWhiteSpace(str, ich)) - ++ich; - int ichNonWhite = ich; - while (ich < ichMax && !isWhiteSpace(str, ich)) - ++ich; - next[0] = ich; - return (ichNonWhite == ich ? null : str.substring(ichNonWhite, ich)); - } - - public static String parseTrimmedChecked(String str, int ich, int ichMax) { - while (ich < ichMax && isWhiteSpace(str, ich)) - ++ich; - int ichLast = ichMax - 1; - while (ichLast >= ich && isWhiteSpace(str, ichLast)) - --ichLast; - return (ichLast < ich ? "" : str.substring(ich, ichLast + 1)); - } - -// public static double dVal(String s) throws NumberFormatException { -// /** -// * @j2sNative -// * -// * if(s==null) -// * throw new NumberFormatException("null"); -// * var d=parseFloat(s); -// * if(isNaN(d)) -// * throw new NumberFormatException("Not a Number : "+s); -// * return d -// * -// */ -// { -// return Double.valueOf(s).doubleValue(); -// } -// } -// -// public static float fVal(String s) throws NumberFormatException { -// /** -// * @j2sNative -// * -// * return this.dVal(s); -// */ -// { -// -// return Float.parseFloat(s); -// } -// } - - public static int parseIntRange(String str, int ichMax, int[] next) { - int cch = str.length(); - if (ichMax > cch) - ichMax = cch; - return (next[0] < 0 || next[0] >= ichMax ? Integer.MIN_VALUE : parseIntChecked(str, ichMax, next)); - } - - /** - * parses a string array for floats. Returns NaN for nonfloats. - * - * @param tokens the strings to parse - * @param data the array to fill - */ - public static void parseFloatArrayData(String[] tokens, float[] data) { - parseFloatArrayDataN(tokens, data, data.length); - } - - /** - * parses a string array for floats. Returns NaN for nonfloats or missing data. - * - * @param tokens the strings to parse - * @param data the array to fill - * @param nData the number of elements - */ - public static void parseFloatArrayDataN(String[] tokens, float[] data, int nData) { - for (int i = nData; --i >= 0;) - data[i] = (i >= tokens.length ? Float.NaN : parseFloat(tokens[i])); - } - - /** - * - * proper splitting, even for Java 1.3 -- if the text ends in the run, - * no new line is appended. - * - * @param text - * @param run - * @return String array - */ - public static String[] split(String text, String run) { - if (text.length() == 0) - return new String[0]; - int n = 1; - int i = text.indexOf(run); - String[] lines; - int runLen = run.length(); - if (i < 0 || runLen == 0) { - lines = new String[1]; - lines[0] = text; - return lines; - } - int len = text.length() - runLen; - for (; i >= 0 && i < len; n++) - i = text.indexOf(run, i + runLen); - lines = new String[n]; - i = 0; - int ipt = 0; - int pt = 0; - for (; (ipt = text.indexOf(run, i)) >= 0 && pt + 1 < n;) { - lines[pt++] = text.substring(i, ipt); - i = ipt + runLen; - } - if (text.indexOf(run, len) != len) - len += runLen; - lines[pt] = text.substring(i, len); - return lines; - } - - public final static float FLOAT_MIN_SAFE = 2E-45f; - // Float.MIN_VALUE (1.45E-45) is not reliable with JavaScript because of the float/double difference there - - /// general static string-parsing class /// - - // next[0] tracks the pointer within the string so these can all be static. - // but the methods parseFloat, parseInt, parseToken, parseTrimmed, and getTokens do not require this. - -// public static String concatTokens(String[] tokens, int iFirst, int iEnd) { -// String str = ""; -// String sep = ""; -// for (int i = iFirst; i < iEnd; i++) { -// if (i < tokens.length) { -// str += sep + tokens[i]; -// sep = " "; -// } -// } -// return str; -// } - - public static String getQuotedStringAt(String line, int ipt0) { - int[] next = new int[] { ipt0 }; - return getQuotedStringNext(line, next); - } - - /** - * - * @param line - * @param next passes [current pointer] - * @return quoted string -- does NOT unescape characters - */ - public static String getQuotedStringNext(String line, int[] next) { - int i = next[0]; - if (i < 0 || (i = line.indexOf("\"", i)) < 0) - return ""; - int pt = i + 1; - int len = line.length(); - while (++i < len && line.charAt(i) != '"') - if (line.charAt(i) == '\\') - i++; - next[0] = i + 1; - return line.substring(pt, i); - } - - /** - * single- or double-quoted string or up to the first space -- like HTML5 - * not case-sensitive - * - * @param line - * @param key - * @return attribute - */ - public static String getQuotedOrUnquotedAttribute(String line, String key) { - if (line == null || key == null) - return null; - int pt = line.toLowerCase().indexOf(key.toLowerCase() + "="); - if (pt < 0 || (pt = pt + key.length() + 1) >= line.length()) - return ""; - char c = line.charAt(pt); - switch (c) { - case '\'': - case '"': - pt++; - break; - default: - c = ' '; - line += " "; - } - int pt1 = line.indexOf(c, pt); - return (pt1 < 0 ? null : line.substring(pt, pt1)); - } - - /** - * CSV format -- escaped quote is "" WITHIN "..." - * - * - * @param line - * @param next int[2] filled with [ptrQuote1, ptrAfterQuote2] - * next[1] will be -1 if unmatched quotes are found (continuation on next line) - * @return unescaped string or null - */ - public static String getCSVString(String line, int[] next) { - int i = next[1]; - if (i < 0 || (i = line.indexOf("\"", i)) < 0) - return null; - int pt = next[0] = i; - int len = line.length(); - boolean escaped = false; - boolean haveEscape = false; - while (++i < len - && (line.charAt(i) != '"' || (escaped = (i + 1 < len && line.charAt(i + 1) == '"')))) - if (escaped) { - escaped = false; - haveEscape = true; - i++; - } - if (i >= len) { - next[1] = -1; - return null; // unmatched - } - next[1] = i + 1; - String s = line.substring(pt + 1, i); - return (haveEscape ? rep(rep(s, "\"\"", "\0"), "\0","\"") : s); - } - - public static boolean isOneOf(String key, String semiList) { - if (semiList.length() == 0) - return false; - if (semiList.charAt(0) != ';') - semiList = ";" + semiList + ";"; - return key.indexOf(";") < 0 && semiList.indexOf(';' + key + ';') >= 0; - } - - public static String getQuotedAttribute(String info, String name) { - int i = info.indexOf(name + "="); - return (i < 0 ? null : getQuotedStringAt(info, i)); - } - - public static float approx(float f, float n) { - return Math.round (f * n) / n; - } - - /** - * Does a clean ITERATIVE replace of strFrom in str with strTo. - * Thus, rep("Testttt", "tt","t") becomes "Test". - * - * @param str - * @param strFrom - * @param strTo - * @return replaced string - */ - public static String rep(String str, String strFrom, String strTo) { - if (str == null || strFrom.length() == 0 || str.indexOf(strFrom) < 0) - return str; - boolean isOnce = (strTo.indexOf(strFrom) >= 0); - do { - str = str.replace(strFrom, strTo); - } while (!isOnce && str.indexOf(strFrom) >= 0); - return str; - } - - public static String formatF(float value, int width, int precision, - boolean alignLeft, boolean zeroPad) { - return formatS(DF.formatDecimal(value, precision), width, 0, alignLeft, zeroPad); - } - - /** - * - * @param value - * @param width - * @param precision - * @param alignLeft - * @param zeroPad - * @param allowOverflow IGNORED - * @return formatted string - */ - public static String formatD(double value, int width, int precision, - boolean alignLeft, boolean zeroPad, boolean allowOverflow) { - return formatS(DF.formatDecimal((float)value, -1 - precision), width, 0, alignLeft, zeroPad); - } - - /** - * - * @param value - * @param width number of columns - * @param precision precision > 0 ==> precision = number of characters max from left - * precision < 0 ==> -1 - precision = number of char. max from right - * @param alignLeft - * @param zeroPad generally for numbers turned strings - * @return formatted string - */ - public static String formatS(String value, int width, int precision, - boolean alignLeft, boolean zeroPad) { - if (value == null) - return ""; - int len = value.length(); - if (precision != Integer.MAX_VALUE && precision > 0 - && precision < len) - value = value.substring(0, precision); - else if (precision < 0 && len + precision >= 0) - value = value.substring(len + precision + 1); - - int padLength = width - value.length(); - if (padLength <= 0) - return value; - boolean isNeg = (zeroPad && !alignLeft && value.charAt(0) == '-'); - char padChar = (zeroPad ? '0' : ' '); - char padChar0 = (isNeg ? '-' : padChar); - - SB sb = new SB(); - if (alignLeft) - sb.append(value); - sb.appendC(padChar0); - for (int i = padLength; --i > 0;) - // this is correct, not >= 0 - sb.appendC(padChar); - if (!alignLeft) - sb.append(isNeg ? padChar + value.substring(1) : value); - return sb.toString(); - } - - /** - * Does a clean replace of any of the characters in str with chrTo - * If strTo contains strFrom, then only a single pass is done. - * Otherwise, multiple passes are made until no more replacements can be made. - * - * @param str - * @param strFrom - * @param chTo - * @return replaced string - */ - public static String replaceWithCharacter(String str, String strFrom, - char chTo) { - if (str == null) - return null; - for (int i = strFrom.length(); --i >= 0;) - str = str.replace(strFrom.charAt(i), chTo); - return str; - } - - /** - * Does a clean replace of any of the characters in str with strTo - * If strTo contains strFrom, then only a single pass is done. - * Otherwise, multiple passes are made until no more replacements can be made. - * - * @param str - * @param strFrom - * @param strTo - * @return replaced string - */ - public static String replaceAllCharacters(String str, String strFrom, - String strTo) { - for (int i = strFrom.length(); --i >= 0;) { - String chFrom = strFrom.substring(i, i + 1); - str = rep(str, chFrom, strTo); - } - return str; - } - - public static String trim(String str, String chars) { - if (str == null || str.length() == 0) - return str; - if (chars.length() == 0) - return str.trim(); - int len = str.length(); - int k = 0; - while (k < len && chars.indexOf(str.charAt(k)) >= 0) - k++; - int m = str.length() - 1; - while (m > k && chars.indexOf(str.charAt(m)) >= 0) - m--; - return str.substring(k, m + 1); - } - - public static String trimQuotes(String value) { - return (value != null && value.length() > 1 && value.startsWith("\"") - && value.endsWith("\"") ? value.substring(1, value.length() - 1) - : value); - } - - public static boolean isNonStringPrimitive(Object info) { - // note that we don't use Double, Float, or Integer here - // because in JavaScript those would be false for unwrapped primitives - // coming from equivalent of Array.get() - // Strings will need their own escaped processing - - return info instanceof Number || info instanceof Boolean; - } - -// private static Object arrayGet(Object info, int i) { -// /** -// * -// * Note that info will be a primitive in JavaScript -// * but a wrapped primitive in Java. -// * -// * @j2sNative -// * -// * return info[i]; -// */ -// { -// return Array.get(info, i); -// } -// } -// - @SuppressWarnings("unchecked") - public static String toJSON(String infoType, Object info) { - if (info == null) - return packageJSON(infoType, null); - if (isNonStringPrimitive(info)) - return packageJSON(infoType, info.toString()); - String s = null; - SB sb = null; - while (true) { - if (info instanceof String) { - s = (String) info; - /** - * @j2sNative - * - * if (typeof s == "undefined") s = "null" - * - */ - {} - - if (s.indexOf("{\"") != 0) { - //don't doubly fix JSON strings when retrieving status - // what about \1 \2 \3 etc.? - s = esc(s); - } - break; - } - if (info instanceof JSONEncodable) { - // includes javajs.util.BS, org.jmol.script.SV - if ((s = ((JSONEncodable) info).toJSON()) == null) - s = "null"; // perhaps a list has a null value (group3List, for example) - break; - } - sb = new SB(); - if (info instanceof Map) { - sb.append("{ "); - String sep = ""; - for (String key : ((Map) info).keySet()) { - sb.append(sep).append( - packageJSON(key, toJSON(null, ((Map) info).get(key)))); - sep = ","; - } - sb.append(" }"); - break; - } - if (info instanceof Lst) { - sb.append("[ "); - int n = ((Lst) info).size(); - for (int i = 0; i < n; i++) { - if (i > 0) - sb.appendC(','); - sb.append(toJSON(null, ((Lst) info).get(i))); - } - sb.append(" ]"); - break; - } - if (info instanceof M34) { - // M4 extends M3 - int len = (info instanceof M4 ? 4 : 3); - float[] x = new float[len]; - M34 m = (M34) info; - sb.appendC('['); - for (int i = 0; i < len; i++) { - if (i > 0) - sb.appendC(','); - m.getRow(i, x); - sb.append(toJSON(null, x)); - } - sb.appendC(']'); - break; - } - s = nonArrayString(info); - if (s == null) { - sb.append("["); - int n = AU.getLength(info); - for (int i = 0; i < n; i++) { - if (i > 0) - sb.appendC(','); - sb.append(toJSON(null, Array.get(info, i))); - } - sb.append("]"); - break; - } - info = info.toString(); - } - return packageJSON(infoType, (s == null ? sb.toString() : s)); - } - - /** - * Checks to see if an object is an array (including typed arrays), and if it is, returns null; - * otherwise it returns the string equivalent of that object. - * - * @param x - * @return String or null - */ - public static String nonArrayString(Object x) { - /** - * @j2sNative - * - * return (x.constructor == Array || x.BYTES_PER_ELEMENT ? null : x.toString()); - * - */ - { - try { - Array.getLength(x); - return null; - } catch (Exception e) { - return x.toString(); - } - } - } - - public static String byteArrayToJSON(byte[] data) { - SB sb = new SB(); - sb.append("["); - int n = data.length; - for (int i = 0; i < n; i++) { - if (i > 0) - sb.appendC(','); - sb.appendI(data[i] & 0xFF); - } - sb.append("]"); - return sb.toString(); - } - - public static String packageJSON(String infoType, String info) { - return (infoType == null ? info : "\"" + infoType + "\": " + info); - } - - public static String escapeUrl(String url) { - url = rep(url, "\n", ""); - url = rep(url, "%", "%25"); - url = rep(url, "#", "%23"); - url = rep(url, "[", "%5B"); - url = rep(url, "\\", "%5C"); - url = rep(url, "]", "%5D"); - url = rep(url, " ", "%20"); - return url; - } - - private final static String escapable = "\\\\\tt\rr\nn\"\""; - - public static String esc(String str) { - if (str == null || str.length() == 0) - return "\"\""; - boolean haveEscape = false; - int i = 0; - for (; i < escapable.length(); i += 2) - if (str.indexOf(escapable.charAt(i)) >= 0) { - haveEscape = true; - break; - } - if (haveEscape) - while (i < escapable.length()) { - int pt = -1; - char ch = escapable.charAt(i++); - char ch2 = escapable.charAt(i++); - SB sb = new SB(); - int pt0 = 0; - while ((pt = str.indexOf(ch, pt + 1)) >= 0) { - sb.append(str.substring(pt0, pt)).appendC('\\').appendC(ch2); - pt0 = pt + 1; - } - sb.append(str.substring(pt0, str.length())); - str = sb.toString(); - } - return "\"" + escUnicode(str) + "\""; - } - - public static String escUnicode(String str) { - for (int i = str.length(); --i >= 0;) - if (str.charAt(i) > 0x7F) { - String s = "0000" + Integer.toHexString(str.charAt(i)); - str = str.substring(0, i) + "\\u" + s.substring(s.length() - 4) - + str.substring(i + 1); - } - return str; - } - - /** - * ensures that a float turned to string has a decimal point - * - * @param f - * @return string version of float - */ - public static String escF(float f) { - String sf = "" + f; - /** - * @j2sNative - * - * if (sf.indexOf(".") < 0 && sf.indexOf("e") < 0) - * sf += ".0"; - */ - { - } - return sf; - } - public static String join(String[] s, char c, int i0) { - if (s.length < i0) - return null; - SB sb = new SB(); - sb.append(s[i0++]); - for (int i = i0; i < s.length; i++) - sb.appendC(c).append(s[i]); - return sb.toString(); - } - - /** - * a LIKE "x" a is a string and equals x - * - * a LIKE "*x" a is a string and ends with x - * - * a LIKE "x*" a is a string and starts with x - * - * a LIKE "*x*" a is a string and contains x - * - * @param a - * @param b - * @return a LIKE b - */ - public static boolean isLike(String a, String b) { - boolean areEqual = a.equals(b); - if (areEqual) - return true; - boolean isStart = b.startsWith("*"); - boolean isEnd = b.endsWith("*"); - return (!isStart && !isEnd) ? areEqual - : isStart && isEnd ? b.length() == 1 || a.contains(b.substring(1, b.length() - 1)) - : isStart ? a.endsWith(b.substring(1)) - : a.startsWith(b.substring(0, b.length() - 1)); - } - - public static Object getMapValueNoCase(Map h, String key) { - if ("this".equals(key)) - return h; - Object val = h.get(key); - if (val == null) - for (Entry e : h.entrySet()) - if (e.getKey().equalsIgnoreCase(key)) - return e.getValue(); - return val; - } - - public static String clean(String s) { - return rep(replaceAllCharacters(s, " \t\n\r", " "), " ", " ").trim(); - } - - /** - * - * fdup duplicates p or q formats for formatCheck - * and the format() function. - * - * @param f - * @param pt - * @param n - * @return %3.5q%3.5q%3.5q%3.5q or %3.5p%3.5p%3.5p - */ - public static String fdup(String f, int pt, int n) { - char ch; - int count = 0; - for (int i = pt; --i >= 1; ) { - if (isDigit(ch = f.charAt(i))) - continue; - switch (ch) { - case '.': - if (count++ != 0) - return f; - continue; - case '-': - if (i != 1 && f.charAt(i - 1) != '.') - return f; - continue; - default: - return f; - } - } - String s = f.substring(0, pt + 1); - SB sb = new SB(); - for (int i = 0; i < n; i++) - sb.append(s); - sb.append(f.substring(pt + 1)); - return sb.toString(); - } - - /** - * generic string formatter based on formatLabel in Atom - * - * - * @param strFormat .... %width.precisionKEY.... - * @param key any string to match - * @param strT replacement string or null - * @param floatT replacement float or Float.NaN - * @param doubleT replacement double or Double.NaN -- for exponential - * @param doOne mimic sprintf - * @return formatted string - */ - - private static String formatString(String strFormat, String key, String strT, - float floatT, double doubleT, boolean doOne) { - if (strFormat == null) - return null; - if ("".equals(strFormat)) - return ""; - int len = key.length(); - if (strFormat.indexOf("%") < 0 || len == 0 || strFormat.indexOf(key) < 0) - return strFormat; - - String strLabel = ""; - int ich, ichPercent, ichKey; - for (ich = 0; (ichPercent = strFormat.indexOf('%', ich)) >= 0 - && (ichKey = strFormat.indexOf(key, ichPercent + 1)) >= 0;) { - if (ich != ichPercent) - strLabel += strFormat.substring(ich, ichPercent); - ich = ichPercent + 1; - if (ichKey > ichPercent + 6) { - strLabel += '%'; - continue;//%12.10x - } - try { - boolean alignLeft = false; - if (strFormat.charAt(ich) == '-') { - alignLeft = true; - ++ich; - } - boolean zeroPad = false; - if (strFormat.charAt(ich) == '0') { - zeroPad = true; - ++ich; - } - char ch; - int width = 0; - while ((ch = strFormat.charAt(ich)) >= '0' && (ch <= '9')) { - width = (10 * width) + (ch - '0'); - ++ich; - } - int precision = Integer.MAX_VALUE; - boolean isExponential = false; - if (strFormat.charAt(ich) == '.') { - ++ich; - if ((ch = strFormat.charAt(ich)) == '-') { - isExponential = (strT == null); - ++ich; - } - if ((ch = strFormat.charAt(ich)) >= '0' && ch <= '9') { - precision = ch - '0'; - ++ich; - } - if (isExponential) - precision = -precision; - } - String st = strFormat.substring(ich, ich + len); - if (!st.equals(key)) { - ich = ichPercent + 1; - strLabel += '%'; - continue; - } - ich += len; - if (!Float.isNaN(floatT)) // 'f' - strLabel += formatF(floatT, width, precision, alignLeft, - zeroPad); - else if (strT != null) // 'd' 'i' or 's' - strLabel += formatS(strT, width, precision, alignLeft, - zeroPad); - else if (!Double.isNaN(doubleT)) // 'e' - strLabel += formatD(doubleT, width, precision - 1, alignLeft, - zeroPad, true); - if (doOne) - break; - } catch (IndexOutOfBoundsException ioobe) { - ich = ichPercent; - break; - } - } - strLabel += strFormat.substring(ich); - //if (strLabel.length() == 0) - //return null; - return strLabel; - } - - public static String formatStringS(String strFormat, String key, String strT) { - return formatString(strFormat, key, strT, Float.NaN, Double.NaN, false); - } - - public static String formatStringF(String strFormat, String key, float floatT) { - return formatString(strFormat, key, null, floatT, Double.NaN, false); - } - - public static String formatStringI(String strFormat, String key, int intT) { - return formatString(strFormat, key, "" + intT, Float.NaN, Double.NaN, false); - } - - /** - * sprintf emulation uses (almost) c++ standard string formats - * - * 's' string 'i' or 'd' integer, 'e' double, 'f' float, 'p' point3f 'q' - * quaternion/plane/axisangle with added "i" (equal to the insipid "d" -- - * digits?) - * - * @param strFormat - * @param list - * a listing of what sort of data will be found in Object[] values, in - * order: s string, f float, i integer, d double, p point3f, q - * quaternion/point4f, S String[], F float[], I int[], and D double[] - * @param values - * Object[] containing above types - * @return formatted string - */ - public static String sprintf(String strFormat, String list, Object[] values) { - if (values == null) - return strFormat; - int n = list.length(); - if (n == values.length) - try { - for (int o = 0; o < n; o++) { - if (values[o] == null) - continue; - switch (list.charAt(o)) { - case 's': - strFormat = formatString(strFormat, "s", (String) values[o], - Float.NaN, Double.NaN, true); - break; - case 'f': - strFormat = formatString(strFormat, "f", null, ((Float) values[o]) - .floatValue(), Double.NaN, true); - break; - case 'i': - strFormat = formatString(strFormat, "d", "" + values[o], Float.NaN, - Double.NaN, true); - strFormat = formatString(strFormat, "i", "" + values[o], Float.NaN, - Double.NaN, true); - break; - case 'd': - strFormat = formatString(strFormat, "e", null, Float.NaN, - ((Double) values[o]).doubleValue(), true); - break; - case 'p': - T3 pVal = (T3) values[o]; - strFormat = formatString(strFormat, "p", null, pVal.x, Double.NaN, - true); - strFormat = formatString(strFormat, "p", null, pVal.y, Double.NaN, - true); - strFormat = formatString(strFormat, "p", null, pVal.z, Double.NaN, - true); - break; - case 'q': - T4 qVal = (T4) values[o]; - strFormat = formatString(strFormat, "q", null, qVal.x, Double.NaN, - true); - strFormat = formatString(strFormat, "q", null, qVal.y, Double.NaN, - true); - strFormat = formatString(strFormat, "q", null, qVal.z, Double.NaN, - true); - strFormat = formatString(strFormat, "q", null, qVal.w, Double.NaN, - true); - break; - case 'S': - String[] sVal = (String[]) values[o]; - for (int i = 0; i < sVal.length; i++) - strFormat = formatString(strFormat, "s", sVal[i], Float.NaN, - Double.NaN, true); - break; - case 'F': - float[] fVal = (float[]) values[o]; - for (int i = 0; i < fVal.length; i++) - strFormat = formatString(strFormat, "f", null, fVal[i], - Double.NaN, true); - break; - case 'I': - int[] iVal = (int[]) values[o]; - for (int i = 0; i < iVal.length; i++) - strFormat = formatString(strFormat, "d", "" + iVal[i], Float.NaN, - Double.NaN, true); - for (int i = 0; i < iVal.length; i++) - strFormat = formatString(strFormat, "i", "" + iVal[i], Float.NaN, - Double.NaN, true); - break; - case 'D': - double[] dVal = (double[]) values[o]; - for (int i = 0; i < dVal.length; i++) - strFormat = formatString(strFormat, "e", null, Float.NaN, - dVal[i], true); - } - - } - return rep(strFormat, "%%", "%"); - } catch (Exception e) { - // - } - System.out.println("TextFormat.sprintf error " + list + " " + strFormat); - return rep(strFormat, "%", "?"); - } - - /** - * - * formatCheck checks p and q formats and duplicates if necessary - * "%10.5p xxxx" ==> "%10.5p%10.5p%10.5p xxxx" - * - * @param strFormat - * @return f or dupicated format - */ - public static String formatCheck(String strFormat) { - if (strFormat == null || strFormat.indexOf('p') < 0 && strFormat.indexOf('q') < 0) - return strFormat; - strFormat = rep(strFormat, "%%", "\1"); - strFormat = rep(strFormat, "%p", "%6.2p"); - strFormat = rep(strFormat, "%q", "%6.2q"); - String[] format = split(strFormat, "%"); - SB sb = new SB(); - sb.append(format[0]); - for (int i = 1; i < format.length; i++) { - String f = "%" + format[i]; - int pt; - if (f.length() >= 3) { - if ((pt = f.indexOf('p')) >= 0) - f = fdup(f, pt, 3); - if ((pt = f.indexOf('q')) >= 0) - f = fdup(f, pt, 4); - } - sb.append(f); - } - return sb.toString().replace('\1', '%'); - } - - public static void leftJustify(SB s, String s1, String s2) { - s.append(s2); - int n = s1.length() - s2.length(); - if (n > 0) - s.append(s1.substring(0, n)); - } - - public static void rightJustify(SB s, String s1, String s2) { - int n = s1.length() - s2.length(); - if (n > 0) - s.append(s1.substring(0, n)); - s.append(s2); - } - - public static String safeTruncate(float f, int n) { - if (f > -0.001 && f < 0.001) - f = 0; - return (f + " ").substring(0,n); - } - - public static boolean isWild(String s) { - return s != null && (s.indexOf("*") >= 0 || s.indexOf("?") >= 0); - } - - /** - * A general non-regex (for performance) text matcher that utilizes ? and *. - * - * ??? means "at most three" characters if at beginning or end; - * "exactly three" otherwise - * \1 in search is a stand-in for actual ? - * - * @param search - * the string to search - * @param match - * the match string - * @param checkStar - * @param allowInitialStar - * @return true if found - */ - public static boolean isMatch(String search, String match, boolean checkStar, - boolean allowInitialStar) { - // search == match --> true - if (search.equals(match)) - return true; - int mLen = match.length(); - // match == "" --> false - if (mLen == 0) - return false; - boolean isStar0 = (checkStar && allowInitialStar ? match.charAt(0) == '*' - : false); - // match == "*" --> true - if (mLen == 1 && isStar0) - return true; - boolean isStar1 = (checkStar && match.endsWith("*")); - boolean haveQ = (match.indexOf('?') >= 0); - // match == "**" --> true - // match == "*xxx*" --> search contains "xxx" - // match == "*xxx" --> search ends with "xxx" - // match == "xxx*" --> search starts with "xxx" - if (!haveQ) { - if (isStar0) - return (isStar1 ? (mLen < 3 || search.indexOf(match.substring(1, - mLen - 1)) >= 0) : search.endsWith(match.substring(1))); - else if (isStar1) - return search.startsWith(match.substring(0, mLen - 1)); - } - int sLen = search.length(); - // pad match with "?" -- same as * - String qqqq = "????"; - int nq = 4; - while (nq < sLen) { - qqqq += qqqq; - nq += 4; - } - if (checkStar) { - if (isStar0) { - match = qqqq + match.substring(1); - mLen += nq - 1; - } - if (isStar1) { - match = match.substring(0, mLen - 1) + qqqq; - mLen += nq - 1; - } - } - // length of match < length of search --> false - if (mLen < sLen) - return false; - - // -- each ? matches ONE character if not at end - // -- extra ? at end ignored - - // (allowInitialStar == true) - // -- extra ? at beginning reduced to match length - - int ich = 0; - while (mLen > sLen) { - if (allowInitialStar && match.charAt(ich) == '?') { - ++ich; - } else if (match.charAt(ich + mLen - 1) != '?') { - return false; - } - --mLen; - } - - // both are effectively same length now. - // \1 is stand-in for "?" - - for (int i = sLen; --i >= 0;) { - char chm = match.charAt(ich + i); - if (chm == '?') - continue; - char chs = search.charAt(i); - if (chm != chs && (chm != '\1' || chs != '?')) - return false; - } - return true; - } - - public static String replaceQuotedStrings(String s, Lst list, - Lst newList) { - int n = list.size(); - for (int i = 0; i < n; i++) { - String name = list.get(i); - String newName = newList.get(i); - if (!newName.equals(name)) - s = rep(s, "\"" + name + "\"", "\"" + newName - + "\""); - } - return s; - } - - public static String replaceStrings(String s, Lst list, - Lst newList) { - int n = list.size(); - for (int i = 0; i < n; i++) { - String name = list.get(i); - String newName = newList.get(i); - if (!newName.equals(name)) - s = rep(s, name, newName); - } - return s; - } - - public static boolean isDigit(char ch) { - // just way simpler code than Character.isDigit(ch); - int c = ch; - return (48 <= c && c <= 57); - } - - public static boolean isUpperCase(char ch) { - int c = ch; - return (65 <= c && c <= 90); - } - - public static boolean isLowerCase(char ch) { - int c = ch; - return (97 <= c && c <= 122); - } - - public static boolean isLetter(char ch) { - // just way simpler code than Character.isLetter(ch); - int c = ch; - return (65 <= c && c <= 90 || 97 <= c && c <= 122); - } - - public static boolean isLetterOrDigit(char ch) { - // just way simpler code than Character.isLetterOrDigit(ch); - int c = ch; - return (65 <= c && c <= 90 || 97 <= c && c <= 122 || 48 <= c && c <= 57); - } - - public static boolean isWhitespace(char ch) { - int c = ch; - return (c >= 0x1c && c <= 0x20 || c >= 0x9 && c <= 0xd); - } - - public static final float FRACTIONAL_PRECISION = 100000f; - public static final float CARTESIAN_PRECISION = 10000f; - - public static void fixPtFloats(T3 pt, float f) { - //this will equate float and double as long as -256 <= x <= 256 - pt.x = Math.round(pt.x * f) / f; - pt.y = Math.round(pt.y * f) / f; - pt.z = Math.round(pt.z * f) / f; - } - - public static double fixDouble(double d, double f) { - return Math.round(d * f) / f; - } - - /** - * parse a float or "float/float" - * @param s - * @return a/b - */ - public static float parseFloatFraction(String s) { - int pt = s.indexOf("/"); - return (pt < 0 ? parseFloat(s) : parseFloat(s.substring(0, pt)) - / parseFloat(s.substring(pt + 1))); - } - -//static { -// -// double d = 790.8999998888; -// float x = 790.8999998888f; -// for (int i = 0; i < 50; i++) { -// System.out.println(x + " " + d); -// System.out.println(Math.round(x * 100000) / 100000f); -// System.out.println(Math.round(d * 100000) / 100000.); -// System.out.println(Math.round(x * 10000) / 10000f); -// System.out.println(Math.round(d * 10000) / 10000.); -// x+=1; -// d+=1; -// } -// System.out.println(100.123456789f); -//} - -// static { -// long t; -// char c = '0'; -// t = System.currentTimeMillis(); -// for (int i = 0; i < 10000000; i++) { -// boolean b = PT.isUpperCase(c); -// } -// System.out.println(System.currentTimeMillis() - t); -// -// t = System.currentTimeMillis(); -// for (int i = 0; i < 10000000; i++) { -// boolean b = Character.isUpperCase(c); -// } -// System.out.println(System.currentTimeMillis() - t); -// -// t = System.currentTimeMillis(); -// for (int i = 0; i < 10000000; i++) { -// boolean b = PT.isUpperCase(c); -// } -// System.out.println(System.currentTimeMillis() - t); -// -// System.out.println("PT test"); -// } -} diff --git a/src2/javajs/util/Quat.java b/src2/javajs/util/Quat.java deleted file mode 100644 index d4a7bf9..0000000 --- a/src2/javajs/util/Quat.java +++ /dev/null @@ -1,818 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2007-04-05 09:07:28 -0500 (Thu, 05 Apr 2007) $ - * $Revision: 7326 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2003-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.util; - -/* - * Standard UNIT quaternion math -- for rotation. - * - * All rotations can be represented as two identical quaternions. - * This is because any rotation can be considered from either end of the - * rotational axis -- either as a + rotation or a - rotation. This code - * is designed to always maintain the quaternion with a rotation in the - * [0, PI) range. - * - * This ensures that the reported theta is always positive, and the normal - * reported is always associated with a positive theta. - * - * @author Bob Hanson, hansonr@stolaf.edu 6/2008 - * - */ - -public class Quat { - public float q0, q1, q2, q3; - private M3 mat; - - private final static P4 qZero = new P4(); - private static final double RAD_PER_DEG = Math.PI / 180; - - public Quat() { - q0 = 1; - } - - public static Quat newQ(Quat q) { - Quat q1 = new Quat(); - q1.set(q); - return q1; - } - - public static Quat newVA(T3 v, float theta) { - Quat q = new Quat(); - q.setTA(v, theta); - return q; - } - - public static Quat newM(M3 mat) { - Quat q = new Quat(); - q.setM(M3.newM3(mat)); - return q; - } - - public static Quat newAA(A4 a) { - Quat q = new Quat(); - q.setAA(a); - return q; - } - - public static Quat newP4(P4 pt) { - Quat q = new Quat(); - q.setP4(pt); - return q; - } - - /** - * Note that q0 is the last parameter here - * - * @param q1 - * @param q2 - * @param q3 - * @param q0 - * @return {q1 q2 q3 q0} - */ - public static Quat new4(float q1, float q2, float q3, float q0) { - Quat q = new Quat(); - if (q0 < -1) { - q.q0 = -1; - return q; - } - if (q0 > 1) { - q.q0 = 1; - return q; - } - q.q0 = q0; - q.q1 = q1; - q.q2 = q2; - q.q3 = q3; - return q; - } - - public void set(Quat q) { - q0 = q.q0; - q1 = q.q1; - q2 = q.q2; - q3 = q.q3; - } - - /** - * {x y z w} --> {q1 q2 q3 q0} and factored - * - * @param pt - */ - private void setP4(P4 pt) { - float factor = (pt == null ? 0 : pt.distance4(qZero)); - if (factor == 0) { - q0 = 1; - return; - } - q0 = pt.w / factor; - q1 = pt.x / factor; - q2 = pt.y / factor; - q3 = pt.z / factor; - } - - /** - * q = (cos(theta/2), sin(theta/2) * n) - * - * @param pt - * @param theta - */ - public void setTA(T3 pt, float theta) { - if (pt.x == 0 && pt.y == 0 && pt.z == 0) { - q0 = 1; - return; - } - double fact = (Math.sin(theta / 2 * RAD_PER_DEG) / Math.sqrt(pt.x - * pt.x + pt.y * pt.y + pt.z * pt.z)); - q0 = (float) (Math.cos(theta / 2 * RAD_PER_DEG)); - q1 = (float) (pt.x * fact); - q2 = (float) (pt.y * fact); - q3 = (float) (pt.z * fact); - } - - public void setAA(A4 a) { - A4 aa = A4.newAA(a); - if (aa.angle == 0) - aa.y = 1; - setM(new M3().setAA(aa)); - } - - private void setM(M3 mat) { - - /* - * Changed 7/16/2008 to double precision for 11.5.48. - * - * - * - * RayTrace Software Package, release 3.0. May 3, 2006. - * - * Mathematics Subpackage (VrMath) - * - * Author: Samuel R. Buss - * - * Software is "as-is" and carries no warranty. It may be used without - * restriction, but if you modify it, please change the filenames to - * prevent confusion between different versions. Please acknowledge - * all use of the software in any publications or products based on it. - * - * Bug reports: Sam Buss, sbuss@ucsd.edu. - * Web page: http://math.ucsd.edu/~sbuss/MathCG - - // Use Shepperd's algorithm, which is stable, does not lose - // significant precision and uses only one sqrt. - // J. Guidance and Control, 1 (1978) 223-224. - - * - * - * Except, that code has errors. - * - * CORRECTIONS (as noted below) of Quaternion.cpp. I have reported the bug. - * - * -- Bob Hanson - * - * theory: - * cos(theta/2)^2 = (cos(theta) + 1)/2 - * and - * trace = (1-x^2)ct + (1-y^2)ct + (1-z^2)ct + 1 = 2cos(theta) + 1 - * or - * cos(theta) = (trace - 1)/2 - * - * so in general, - * - * w = cos(theta/2) - * = sqrt((cos(theta)+1)/2) - * = sqrt((trace-1)/4+1/2) - * = sqrt((trace+1)/4) - * = sqrt(trace+1)/2 - * - * but there are precision issues, so we allow for other situations. - * note -- trace >= 0.5 when cos(theta) >= -0.25 (-104.48 <= theta <= 104.48). - * this code cleverly matches the precision in all four options. - * - */ - - this.mat = mat; - - double trace = mat.m00 + mat.m11 + mat.m22; - double temp; - double w, x, y, z; - if (trace >= 0.5) { - w = Math.sqrt(1.0 + trace); - x = (mat.m21 - mat.m12) / w; - y = (mat.m02 - mat.m20) / w; - z = (mat.m10 - mat.m01) / w; - } else if ((temp = mat.m00 + mat.m00 - trace) >= 0.5) { - x = Math.sqrt(1.0 + temp); - w = (mat.m21 - mat.m12) / x; - y = (mat.m10 + mat.m01) / x; - z = (mat.m20 + mat.m02) / x; - } else if ((temp = mat.m11 + mat.m11 - trace) >= 0.5 - || mat.m11 > mat.m22) { - y = Math.sqrt(1.0 + temp); - w = (mat.m02 - mat.m20) / y; - x = (mat.m10 + mat.m01) / y; - z = (mat.m21 + mat.m12) / y; - } else { - z = Math.sqrt(1.0 + mat.m22 + mat.m22 - trace); - w = (mat.m10 - mat.m01) / z; - x = (mat.m20 + mat.m02) / z; // was - - y = (mat.m21 + mat.m12) / z; // was - - } - - q0 = (float) (w * 0.5); - q1 = (float) (x * 0.5); - q2 = (float) (y * 0.5); - q3 = (float) (z * 0.5); - - /* - * Originally from http://www.gamedev.net/community/forums/topic.asp?topic_id=448380 - * later algorithm was adapted from Visualizing Quaternions, by Andrew J. Hanson - * (Morgan Kaufmann, 2006), page 446 - * - * HOWEVER, checking with AxisAngle4f and Quat4f equivalents, it was found that - * BOTH of these sources produce inverted quaternions. So here we do an inversion. - * - * This correction was made in 11.5.42 6/19/2008 -- Bob Hanson - * - * former algorithm used: - * / - - double tr = mat.m00 + mat.m11 + mat.m22; //Matrix trace - double s; - double[] q = new double[4]; - if (tr > 0) { - s = Math.sqrt(tr + 1); - q0 = (float) (0.5 * s); - s = 0.5 / s; // = 1/q0 - q1 = (float) ((mat.m21 - mat.m12) * s); - q2 = (float) ((mat.m02 - mat.m20) * s); - q3 = (float) ((mat.m10 - mat.m01) * s); - } else { - float[][] m = new float[][] { new float[3], new float[3], new float[3] }; - mat.getRow(0, m[0]); - mat.getRow(1, m[1]); - mat.getRow(2, m[2]); - - //Find out the biggest element along the diagonal - float max = Math.max(mat.m11, mat.m00); - int i = (mat.m22 > max ? 2 : max == mat.m11 ? 1 : 0); - int j = (i + 1) % 3; - int k = (j + 1) % 3; - s = -Math.sqrt(1 + m[i][i] - m[j][j] - m[k][k]); - // 0 = 1 + (1-x^2)ct + x^2 -(1-y^2)ct - y^2 - (1-z^2)ct - z^2 - // 0 = 1 - ct + (x^2 - y^2 - z^2) - (x^2 - y^2 - z^2)ct - // 0 = 1 - ct + 2x^2 - 1 - (2x^2)ct + ct - // 0 = 2x^2(1 - ct) - // theta = 0 (but then trace = 1 + 1 + 1 = 3) - // or x = 0. - q[i] = s * 0.5; - if (s != 0) - s = 0.5 / s; // = 1/q[i] - q[j] = (m[i][j] + m[j][i]) * s; - q[k] = (m[i][k] + m[k][i]) * s; - q0 = (float) ((m[k][j] - m[j][k]) * s); - q1 = (float) q[0]; // x - q2 = (float) q[1]; // y - q3 = (float) q[2]; // z - } - - */ - } - - /* - * if qref is null, "fix" this quaternion - * otherwise, return a quaternion that is CLOSEST to the given quaternion - * that is, one that gives a positive dot product - * - */ - public void setRef(Quat qref) { - if (qref == null) { - mul(getFixFactor()); - return; - } - if (dot(qref) >= 0) - return; - q0 *= -1; - q1 *= -1; - q2 *= -1; - q3 *= -1; - } - - /** - * returns a quaternion frame based on three points (center, x, and any point in xy plane) - * or two vectors (vA, vB). - * - * @param center (null for vA/vB option) - * @param x - * @param xy - * @return quaternion for frame - */ - public static final Quat getQuaternionFrame(P3 center, T3 x, - T3 xy) { - V3 vA = V3.newV(x); - V3 vB = V3.newV(xy); - if (center != null) { - vA.sub(center); - vB.sub(center); - } - return getQuaternionFrameV(vA, vB, null, false); - } - - /** - * Create a quaternion based on a frame - * @param vA - * @param vB - * @param vC - * @param yBased - * @return quaternion - */ - public static final Quat getQuaternionFrameV(V3 vA, V3 vB, - V3 vC, boolean yBased) { - if (vC == null) { - vC = new V3(); - vC.cross(vA, vB); - if (yBased) - vA.cross(vB, vC); - } - V3 vBprime = new V3(); - vBprime.cross(vC, vA); - vA.normalize(); - vBprime.normalize(); - vC.normalize(); - M3 mat = new M3(); - mat.setColumnV(0, vA); - mat.setColumnV(1, vBprime); - mat.setColumnV(2, vC); - - /* - * - * Verification tests using Quat4f and AngleAxis4f: - * - System.out.println("quaternion frame matrix: " + mat); - - Point3f pt2 = new Point3f(); - mat.transform(Point3f.new3(1, 0, 0), pt2); - System.out.println("vA=" + vA + " M(100)=" + pt2); - mat.transform(Point3f.new3(0, 1, 0), pt2); - System.out.println("vB'=" + vBprime + " M(010)=" + pt2); - mat.transform(Point3f.new3(0, 0, 1), pt2); - System.out.println("vC=" + vC + " M(001)=" + pt2); - Quat4f q4 = new Quat4f(); - q4.set(mat); - System.out.println("----"); - System.out.println("Quat4f: {" + q4.w + " " + q4.x + " " + q4.y + " " + q4.z + "}"); - System.out.println("Quat4f: 2xy + 2wz = m10: " + (2 * q4.x * q4.y + 2 * q4.w * q4.z) + " = " + mat.m10); - - */ - - Quat q = newM(mat); - - /* - System.out.println("Quaternion mat from q \n" + q.getMatrix()); - System.out.println("Quaternion: " + q.getNormal() + " " + q.getTheta()); - AxisAngle4f a = new AxisAngle4f(); - a.set(mat); - Vector3f v = Vector3f.new3(a.x, a.y, a.z); - v.normalize(); - System.out.println("angleAxis: " + v + " "+(a.angle/Math.PI * 180)); - */ - - return q; - } - - public M3 getMatrix() { - if (mat == null) - setMatrix(); - return mat; - } - - private void setMatrix() { - mat = new M3(); - // q0 = w, q1 = x, q2 = y, q3 = z - mat.m00 = q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3; - mat.m01 = 2 * q1 * q2 - 2 * q0 * q3; - mat.m02 = 2 * q1 * q3 + 2 * q0 * q2; - mat.m10 = 2 * q1 * q2 + 2 * q0 * q3; - mat.m11 = q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3; - mat.m12 = 2 * q2 * q3 - 2 * q0 * q1; - mat.m20 = 2 * q1 * q3 - 2 * q0 * q2; - mat.m21 = 2 * q2 * q3 + 2 * q0 * q1; - mat.m22 = q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3; - } - - public Quat add(float x) { - // scalar theta addition (degrees) - return newVA(getNormal(), getTheta() + x); - } - - public Quat mul(float x) { - // scalar theta multiplication - return (x == 1 ? new4(q1, q2, q3, q0) : - newVA(getNormal(), getTheta() * x)); - } - - public Quat mulQ(Quat p) { - return new4( - q0 * p.q1 + q1 * p.q0 + q2 * p.q3 - q3 * p.q2, - q0 * p.q2 + q2 * p.q0 + q3 * p.q1 - q1 * p.q3, - q0 * p.q3 + q3 * p.q0 + q1 * p.q2 - q2 * p.q1, - q0 * p.q0 - q1 * p.q1 - q2 * p.q2 - q3 * p.q3); - } - - public Quat div(Quat p) { - // unit quaternions assumed -- otherwise would scale by 1/p.dot(p) - return mulQ(p.inv()); - } - - public Quat divLeft(Quat p) { - // unit quaternions assumed -- otherwise would scale by 1/p.dot(p) - return this.inv().mulQ(p); - } - - public float dot(Quat q) { - return this.q0 * q.q0 + this.q1 * q.q1 + this.q2 * q.q2 + this.q3 * q.q3; - } - - public Quat inv() { - return new4(-q1, -q2, -q3, q0); - } - - public Quat negate() { - return new4(-q1, -q2, -q3, -q0); - } - - /** - * ensures - * - * 1) q0 > 0 - * or - * 2) q0 = 0 and q1 > 0 - * or - * 3) q0 = 0 and q1 = 0 and q2 > 0 - * or - * 4) q0 = 0 and q1 = 0 and q2 = 0 and q3 > 0 - * - * @return 1 or -1 - * - */ - - private float getFixFactor() { - return (q0 < 0 || - q0 == 0 && (q1 < 0 || q1 == 0 && (q2 < 0 || q2 == 0 && q3 < 0)) ? -1 : 1); - } - - public V3 getVector(int i) { - return getVectorScaled(i, 1f); - } - - public V3 getVectorScaled(int i, float scale) { - if (i == -1) { - scale *= getFixFactor(); - return V3.new3(q1 * scale, q2 * scale, q3 * scale); - } - if (mat == null) - setMatrix(); - V3 v = new V3(); - mat.getColumnV(i, v); - if (scale != 1f) - v.scale(scale); - return v; - } - - /** - * - * @return vector such that 0 <= angle <= 180 - */ - public V3 getNormal() { - V3 v = getRawNormal(this); - v.scale(getFixFactor()); - return v; - } - - private static V3 getRawNormal(Quat q) { - V3 v = V3.new3(q.q1, q.q2, q.q3); - if (v.length() == 0) - return V3.new3(0, 0, 1); - v.normalize(); - return v; - } - - /** - * - * @return 0 <= angle <= 180 in degrees - */ - public float getTheta() { - return (float) (Math.acos(Math.abs(q0)) * 2 * 180 / Math.PI); - } - - public float getThetaRadians() { - return (float) (Math.acos(Math.abs(q0)) * 2); - } - - /** - * - * @param v0 - * @return vector option closest to v0 - * - */ - public V3 getNormalDirected(V3 v0) { - V3 v = getNormal(); - if (v.x * v0.x + v.y * v0.y + v.z * v0.z < 0) { - v.scale(-1); - } - return v; - } - - public V3 get3dProjection(V3 v3d) { - v3d.set(q1, q2, q3); - return v3d; - } - - /** - * - * @param axisAngle - * @return fill in theta of axisAngle such that - */ - public P4 getThetaDirected(P4 axisAngle) { - //fills in .w; - float theta = getTheta(); - V3 v = getNormal(); - if (axisAngle.x * q1 + axisAngle.y * q2 + axisAngle.z * q3 < 0) { - v.scale(-1); - theta = -theta; - } - axisAngle.set4(v.x, v.y, v.z, theta); - return axisAngle; - } - - /** - * - * @param vector a vector, same as for getNormalDirected - * @return return theta - */ - public float getThetaDirectedV(V3 vector) { - //fills in .w; - float theta = getTheta(); - V3 v = getNormal(); - if (vector.x * q1 + vector.y * q2 + vector.z * q3 < 0) { - v.scale(-1); - theta = -theta; - } - return theta; - } - - /** - * Quaternions are saved as {q1, q2, q3, q0} - * - * While this may seem odd, it is so that for any point4 -- - * planes, axisangles, and quaternions -- we can use the - * first three coordinates to determine the relavent axis - * the fourth then gives us offset to {0,0,0} (plane), - * rotation angle (axisangle), and cos(theta/2) (quaternion). - * @return {x y z w} (unnormalized) - */ - public P4 toPoint4f() { - return P4.new4(q1, q2, q3, q0); // x,y,z,w - } - - public A4 toAxisAngle4f() { - double theta = 2 * Math.acos(Math.abs(q0)); - double sinTheta2 = Math.sin(theta/2); - V3 v = getNormal(); - if (sinTheta2 < 0) { - v.scale(-1); - theta = Math.PI - theta; - } - return A4.newVA(v, (float) theta); - } - - public T3 transform2(T3 pt, T3 ptNew) { - if (mat == null) - setMatrix(); - mat.rotate2(pt, ptNew); - return ptNew; - } - - public Quat leftDifference(Quat q2) { - //dq = q.leftDifference(qnext);//q.inv().mul(qnext); - Quat q2adjusted = (this.dot(q2) < 0 ? q2.negate() : q2); - return inv().mulQ(q2adjusted); - } - - public Quat rightDifference(Quat q2) { - //dq = qnext.rightDifference(q);//qnext.mul(q.inv()); - Quat q2adjusted = (this.dot(q2) < 0 ? q2.negate() : q2); - return mulQ(q2adjusted.inv()); - } - - /** - * - * Java axisAngle / plane / Point4f format - * all have the format {x y z w} - * so we go with that here as well - * - * @return "{q1 q2 q3 q0}" - */ - @Override - public String toString() { - return "{" + q1 + " " + q2 + " " + q3 + " " + q0 + "}"; - } - - /** - * - * @param data1 - * @param data2 - * @param nMax > 0 --> limit to this number - * @param isRelative - * - * @return pairwise array of data1 / data2 or data1 \ data2 - */ - public static Quat[] div(Quat[] data1, Quat[] data2, int nMax, boolean isRelative) { - int n; - if (data1 == null || data2 == null || (n = Math.min(data1.length, data2.length)) == 0) - return null; - if (nMax > 0 && n > nMax) - n = nMax; - Quat[] dqs = new Quat[n]; - for (int i = 0; i < n; i++) { - if (data1[i] == null || data2[i] == null) - return null; - dqs[i] = (isRelative ? data1[i].divLeft(data2[i]) : data1[i].div(data2[i])); - } - return dqs; - } - - public static Quat sphereMean(Quat[] data, float[] retStddev, float criterion) { - // Samuel R. Buss, Jay P. Fillmore: - // Spherical averages and applications to spherical splines and interpolation. - // ACM Trans. Graph. 20(2): 95-126 (2001) - if (data == null || data.length == 0) - return new Quat(); - if (retStddev == null) - retStddev = new float[1]; - if (data.length == 1) { - retStddev[0] = 0; - return newQ(data[0]); - } - float diff = Float.MAX_VALUE; - float lastStddev = Float.MAX_VALUE; - Quat qMean = simpleAverage(data); - int maxIter = 100; // typically goes about 5 iterations - int iter = 0; - while (diff > criterion && lastStddev != 0 && iter < maxIter) { - qMean = newMean(data, qMean); - retStddev[0] = stdDev(data, qMean); - diff = Math.abs(retStddev[0] - lastStddev); - lastStddev = retStddev[0]; - //Logger.info(++iter + " sphereMean " + qMean + " stddev=" + lastStddev + " diff=" + diff); - } - return qMean; - } - - /** - * Just a starting point. - * get average normal vector - * scale normal by average projection of vectors onto it - * create quaternion from this 3D projection - * - * @param ndata - * @return approximate average - */ - private static Quat simpleAverage(Quat[] ndata) { - V3 mean = V3.new3(0, 0, 1); - // using the directed normal ensures that the mean is - // continually added to and never subtracted from - V3 v = ndata[0].getNormal(); - mean.add(v); - for (int i = ndata.length; --i >= 0;) - mean.add(ndata[i].getNormalDirected(mean)); - mean.sub(v); - mean.normalize(); - float f = 0; - // the 3D projection of the quaternion is [sin(theta/2)]*n - // so dotted with the normalized mean gets us an approximate average for sin(theta/2) - for (int i = ndata.length; --i >= 0;) - f += Math.abs(ndata[i].get3dProjection(v).dot(mean)); - if (f != 0) - mean.scale(f / ndata.length); - // now convert f to the corresponding cosine instead of sine - f = (float) Math.sqrt(1 - mean.lengthSquared()); - if (Float.isNaN(f)) - f = 0; - return newP4(P4.new4(mean.x, mean.y, mean.z, f)); - } - - private static Quat newMean(Quat[] data, Quat mean) { - /* quaternion derivatives nicely take care of producing the necessary - * metric. Since dq gives us the normal with the smallest POSITIVE angle, - * we just scale by that -- using degrees. - * No special normalization is required. - * - * The key is that the mean has been set up already, and dq.getTheta() - * will always return a value between 0 and 180. True, for groupings - * where dq swings wildly -- 178, 182, 178, for example -- there will - * be problems, but the presumption here is that there is a REASONABLE - * set of data. Clearly there are spherical data sets that simply cannot - * be assigned a mean. (For example, where the three projected points - * are equally distant on the sphere. We just can't worry about those - * cases here. Rather, if there is any significance to the data, - * there will be clusters of projected points, and the analysis will - * be meaningful. - * - * Note that the hemisphere problem drops out because dq.getNormal() and - * dq.getTheta() will never return (n, 182 degrees) but will - * instead return (-n, 2 degrees). That's just what we want in that case. - * - * Note that the projection in this case is to 3D -- a set of vectors - * in space with lengths proportional to theta (not the sin(theta/2) - * that is associated with a quaternion map). - * - * This is officially an "exponential" or "hyperbolic" projection. - * - */ - V3 sum = new V3(); - V3 v; - Quat q, dq; - //System.out.println("newMean mean " + mean); - for (int i = data.length; --i >= 0;) { - q = data[i]; - dq = q.div(mean); - v = dq.getNormal(); - v.scale(dq.getTheta()); - sum.add(v); - } - sum.scale(1f/data.length); - Quat dqMean = newVA(sum, sum.length()); - //System.out.println("newMean dqMean " + dqMean + " " + dqMean.getNormal() + " " + dqMean.getTheta()); - return dqMean.mulQ(mean); - } - - /** - * @param data - * @param mean - * @return standard deviation in units of degrees - */ - private static float stdDev(Quat[] data, Quat mean) { - // the quaternion dot product gives q0 for dq (i.e. q / mean) - // that is, cos(theta/2) for theta between them - double sum2 = 0; - int n = data.length; - for (int i = n; --i >= 0;) { - float theta = data[i].div(mean).getTheta(); - sum2 += theta * theta; - } - return (float) Math.sqrt(sum2 / n); - } - - public float[] getEulerZYZ() { - // http://www.swarthmore.edu/NatSci/mzucker1/e27/diebel2006attitude.pdf - double rA, rB, rG; - if (q1 == 0 && q2 == 0) { - float theta = getTheta(); - // pure Z rotation - ambiguous - return new float[] { q3 < 0 ? -theta : theta , 0, 0 }; - } - rA = Math.atan2(2 * (q2 * q3 + q0 * q1), 2 * (-q1 * q3 + q0 * q2 )); - rB = Math.acos(q3 * q3 - q2 * q2 - q1 * q1 + q0 * q0); - rG = Math.atan2( 2 * (q2 * q3 - q0 * q1), 2 * (q0 * q2 + q1 * q3)); - return new float[] {(float) (rA / RAD_PER_DEG), (float) (rB / RAD_PER_DEG), (float) (rG / RAD_PER_DEG)}; - } - - public float[] getEulerZXZ() { - // NOT http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles - // http://www.swarthmore.edu/NatSci/mzucker1/e27/diebel2006attitude.pdf - double rA, rB, rG; - if (q1 == 0 && q2 == 0) { - float theta = getTheta(); - // pure Z rotation - ambiguous - return new float[] { q3 < 0 ? -theta : theta , 0, 0 }; - } - rA = Math.atan2(2 * (q1 * q3 - q0 * q2), 2 * (q0 * q1 + q2 * q3 )); - rB = Math.acos(q3 * q3 - q2 * q2 - q1 * q1 + q0 * q0); - rG = Math.atan2( 2 * (q1 * q3 + q0 * q2), 2 * (-q2 * q3 + q0 * q1)); - return new float[] {(float) (rA / RAD_PER_DEG), (float) (rB / RAD_PER_DEG), (float) (rG / RAD_PER_DEG)}; - } - -} diff --git a/src2/javajs/util/Rdr.java b/src2/javajs/util/Rdr.java deleted file mode 100644 index 995a629..0000000 --- a/src2/javajs/util/Rdr.java +++ /dev/null @@ -1,614 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2007-04-05 09:07:28 -0500 (Thu, 05 Apr 2007) $ - * $Revision: 7326 $ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2003-2005 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package javajs.util; - -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; - -import java.util.Map; - -import javajs.api.Interface; - - -import javajs.api.GenericCifDataParser; -import javajs.api.GenericLineReader; -import javajs.api.GenericZipTools; - -/** - * A general helper class for a variety of stream and reader functionality - * including: - * - * stream and byte magic-number decoding for PNG, PNGJ, ZIP, and GZIP streams - * - * various stream/reader methods, including UTF-encoded stream reading - * - * reflection-protected access to a CIF parser and ZIP tools - * - * - * - * - */ -public class Rdr implements GenericLineReader { - - public static class StreamReader extends BufferedReader { - - private BufferedInputStream stream; - - public StreamReader(BufferedInputStream bis, String charSet) throws UnsupportedEncodingException { - super(new InputStreamReader(bis, (charSet == null ? "UTF-8" : charSet))); - stream = bis; - } - - public BufferedInputStream getStream() { - try { - stream.reset(); - } catch (IOException e) { - // ignore - } - return stream; - } - - } - - BufferedReader reader; - - public Rdr(BufferedReader reader) { - this.reader = reader; - } - - @Override - public String readNextLine() throws Exception { - return reader.readLine(); - } - - public static Map readCifData(GenericCifDataParser parser, BufferedReader br) { - return parser.set(null, br, false).getAllCifData(); - } - - - /////////// - - - /** - * - * Read a UTF-8 byte array fully, converting it to a String. - * Called by Jmol's XMLReaders - * - * @param bytes - * @return a UTF-8 string - */ - public static String bytesToUTF8String(byte[] bytes) { - return streamToUTF8String(new BufferedInputStream(new ByteArrayInputStream(bytes))); - } - - /** - * - * Read a UTF-8 stream fully, converting it to a String. - * Called by Jmol's XMLReaders - * - * @param bis - * @return a UTF-8 string - */ - public static String streamToUTF8String(BufferedInputStream bis) { - String[] data = new String[1]; - try { - readAllAsString(getBufferedReader(bis, "UTF-8"), -1, true, data, 0); - } catch (IOException e) { - } - return data[0]; - } - - /** - * Read an input stream fully, saving a byte array, then - * return a buffered reader to those bytes converted to string form. - * - * @param bis - * @param charSet - * @return Reader - * @throws IOException - */ - public static BufferedReader getBufferedReader(BufferedInputStream bis, String charSet) - throws IOException { - // could also just make sure we have a buffered input stream here. - if (getUTFEncodingForStream(bis) == Encoding.NONE) - return new StreamReader(bis, (charSet == null ? "UTF-8" : charSet)); - byte[] bytes = getLimitedStreamBytes(bis, -1); - bis.close(); - return getBR(charSet == null ? fixUTF(bytes) : new String(bytes, charSet)); - } - - /** - * This method is specifically for strings that are marked for UTF 8 or 16. - * - * @param bytes - * @return UTF-decoded bytes - */ - public static String fixUTF(byte[] bytes) { - Encoding encoding = getUTFEncoding(bytes); - if (encoding != Encoding.NONE) - try { - String s = new String(bytes, encoding.name().replace('_', '-')); - switch (encoding) { - case UTF8: - case UTF_16BE: - case UTF_16LE: - // extra byte at beginning removed - s = s.substring(1); - break; - default: - break; - } - return s; - } catch (UnsupportedEncodingException e) { - System.out.println(e); - } - return new String(bytes); - } - - private static Encoding getUTFEncoding(byte[] bytes) { - if (bytes.length >= 3 && (bytes[0] & 0xFF) == 0xEF && (bytes[1] & 0xFF) == 0xBB && (bytes[2] & 0xFF) == 0xBF) - return Encoding.UTF8; - if (bytes.length >= 4 && (bytes[0] & 0xFF) == 0 && (bytes[1] & 0xFF) == 0 - && (bytes[2] & 0xFF) == 0xFE && (bytes[3] & 0xFF) == 0xFF) - return Encoding.UTF_32BE; - if (bytes.length >= 4 && (bytes[0] & 0xFF) == 0xFF && (bytes[1] & 0xFF) == 0xFE - && (bytes[2] & 0xFF) == 0 && (bytes[3] & 0xFF) == 0) - return Encoding.UTF_32LE; - if (bytes.length >= 2 && (bytes[0] & 0xFF) == 0xFF && (bytes[1] & 0xFF) == 0xFE) - return Encoding.UTF_16LE; - if (bytes.length >= 2 && (bytes[0] & 0xFF) == 0xFE && (bytes[1] & 0xFF) == 0xFF) - return Encoding.UTF_16BE; - return Encoding.NONE; - - } - - ////////// stream type checking ////////// - - - private static Encoding getUTFEncodingForStream(BufferedInputStream is) throws IOException { -// /** -// * @j2sNative -// * -// * is.resetStream(); -// * -// */ -// { -// } - byte[] abMagic = new byte[4]; - abMagic[3] = 1; - try{ - is.mark(5); - } catch (Exception e) { - return Encoding.NONE; - } - is.read(abMagic, 0, 4); - is.reset(); - return getUTFEncoding(abMagic); - } - - public static boolean isBase64(SB sb) { - return (sb.indexOf(";base64,") == 0); - } - - public static boolean isCompoundDocumentS(InputStream is) { - return isCompoundDocumentB(getMagic(is, 8)); - } - - public static boolean isCompoundDocumentB(byte[] bytes) { - return (bytes.length >= 8 && (bytes[0] & 0xFF) == 0xD0 - && (bytes[1] & 0xFF) == 0xCF && (bytes[2] & 0xFF) == 0x11 - && (bytes[3] & 0xFF) == 0xE0 && (bytes[4] & 0xFF) == 0xA1 - && (bytes[5] & 0xFF) == 0xB1 && (bytes[6] & 0xFF) == 0x1A - && (bytes[7] & 0xFF) == 0xE1); - } - - public static boolean isBZip2S(InputStream is) { - return isBZip2B(getMagic(is, 3)); - } - - public static boolean isGzipS(InputStream is) { - return isGzipB(getMagic(is, 2)); - } - - public static boolean isBZip2B(byte[] bytes) { - return (bytes != null && bytes.length >= 3 // BZh - && (bytes[0] & 0xFF) == 0x42 && (bytes[1] & 0xFF) == 0x5A && (bytes[2] & 0xFF) == 0x68); -} - - public static boolean isGzipB(byte[] bytes) { - return (bytes != null && bytes.length >= 2 - && (bytes[0] & 0xFF) == 0x1F && (bytes[1] & 0xFF) == 0x8B); - } - - public static boolean isPickleS(InputStream is) { - return isPickleB(getMagic(is, 2)); - } - - public static boolean isPickleB(byte[] bytes) { - return (bytes != null && bytes.length >= 2 - && (bytes[0] & 0xFF) == 0x7D && (bytes[1] & 0xFF) == 0x71); - } - - public static boolean isMessagePackS(InputStream is) { - return isMessagePackB(getMagic(is, 2)); - } - - public static boolean isMessagePackB(byte[] bytes) { - // look for 'map' start, but PNG files start with 0x89, which is - // the MessagePack start for a 9-member map, so in that case we have - // to check that the next byte is not "P" as in <89>PNG - int b; - - return (bytes != null && bytes.length >= 1 && (((b = bytes[0] & 0xFF)) == 0xDE || (b & 0xE0) == 0x80 && bytes[1] != 0x50)); - } - - public static boolean isPngZipStream(InputStream is) { - return isPngZipB(getMagic(is, 55)); - } - - public static boolean isPngZipB(byte[] bytes) { - // \0PNGJ starting at byte 50 - return (bytes[50] == 0 && bytes[51] == 0x50 && bytes[52] == 0x4E && bytes[53] == 0x47 && bytes[54] == 0x4A); - } - - /** - * Check for a ZIP input stream - starting with "PK<03><04>" - * @param is - * @return true if a ZIP stream - */ - public static boolean isZipS(InputStream is) { - return isZipB(getMagic(is, 4)); - } - - public static boolean isZipB(byte[] bytes) { - return (bytes.length >= 4 - && bytes[0] == 0x50 //PK<03><04> - && bytes[1] == 0x4B - && bytes[2] == 0x03 - && bytes[3] == 0x04); - } - - public static byte[] getMagic(InputStream is, int n) { - byte[] abMagic = new byte[n]; -// /** -// * @j2sNative -// * -// * is.resetStream(); -// * -// */ -// { -// } - try { - is.mark(n + 1); - is.read(abMagic, 0, n); - } catch (IOException e) { - } - try { - is.reset(); - } catch (IOException e) { - } - return abMagic; - } - - public static String guessMimeTypeForBytes(byte[] bytes) { - // only options here are JPEG, PNG, GIF, and BMP - switch (bytes.length < 2 ? -1 : bytes[1]) { - case 0: - return "image/jpg"; // 0xFF 0x00 ... - case 0x49: - return "image/gif"; // GIF89a... - case 0x4D: - return "image/BMP"; // BM... - case 0x50: - return "image/png"; - default: - return "image/unknown"; - } - } - - - ////////// stream/byte methods /////////// - - public static BufferedInputStream getBIS(byte[] bytes) { - return new BufferedInputStream(new ByteArrayInputStream(bytes)); - } - - public static BufferedReader getBR(String string) { - return new BufferedReader(new StringReader(string)); - } - - - public static BufferedInputStream toBIS(Object o) { - return (AU.isAB(o) ? getBIS((byte[]) o) - : o instanceof SB ? getBIS(Rdr.getBytesFromSB((SB) o)) - : o instanceof String ? getBIS(((String) o).getBytes()) : null); - } - - - /** - * Drill down into a GZIP stack until no more layers. - * @param jzt - * - * @param bis - * @return non-gzipped buffered input stream. - * - * @throws IOException - */ - public static BufferedInputStream getUnzippedInputStream(GenericZipTools jzt, BufferedInputStream bis) throws IOException { - while (isGzipS(bis)) - bis = new BufferedInputStream(jzt.newGZIPInputStream(bis)); - return bis; - } - - public static BufferedInputStream getUnzippedInputStreamBZip2(GenericZipTools jzt, - BufferedInputStream bis) throws IOException { - while (isBZip2S(bis)) - bis = new BufferedInputStream(jzt.newBZip2InputStream(bis)); - return bis; - } - - - /** - * Allow for base64-encoding check. - * - * @param sb - * @return byte array - */ - public static byte[] getBytesFromSB(SB sb) { - return (isBase64(sb) ? Base64.decodeBase64(sb.substring(8)) : sb.toBytes(0, -1)); - } - - /** - * Read a an entire BufferedInputStream for its bytes, and - * either return them or leave them in the designated output channel. - * - * @param bis - * @param out a destination output channel, or null - * @return byte[] (if out is null) or a message indicating length (if not) - * - * @throws IOException - */ - public static Object getStreamAsBytes(BufferedInputStream bis, - OC out) throws IOException { - byte[] buf = new byte[1024]; - byte[] bytes = (out == null ? new byte[4096] : null); - int len = 0; - int totalLen = 0; - while ((len = bis.read(buf, 0, 1024)) > 0) { - totalLen += len; - if (out == null) { - if (totalLen >= bytes.length) - bytes = AU.ensureLengthByte(bytes, totalLen * 2); - System.arraycopy(buf, 0, bytes, totalLen - len, len); - } else { - out.write(buf, 0, len); - } - } - bis.close(); - if (out == null) { - return AU.arrayCopyByte(bytes, totalLen); - } - return totalLen + " bytes"; - } - - /** - * Read a possibly limited number of bytes (when n > 0) from a stream, - * leaving the stream open. - * - * @param is an input stream, not necessarily buffered. - * @param n the maximum number of bytes to read, or -1 for all - * @return the bytes read - * - * @throws IOException - */ - public static byte[] getLimitedStreamBytes(InputStream is, long n) - throws IOException { - - //Note: You cannot use InputStream.available() to reliably read - // zip data from the web. - - int buflen = (n > 0 && n < 1024 ? (int) n : 1024); - byte[] buf = new byte[buflen]; - byte[] bytes = new byte[n < 0 ? 4096 : (int) n]; - int len = 0; - int totalLen = 0; - if (n < 0) - n = Integer.MAX_VALUE; - while (totalLen < n && (len = is.read(buf, 0, buflen)) > 0) { - totalLen += len; - if (totalLen > bytes.length) - bytes = AU.ensureLengthByte(bytes, totalLen * 2); - System.arraycopy(buf, 0, bytes, totalLen - len, len); - if (n != Integer.MAX_VALUE && totalLen + buflen > bytes.length) - buflen = bytes.length - totalLen; - - } - if (totalLen == bytes.length) - return bytes; - buf = new byte[totalLen]; - System.arraycopy(bytes, 0, buf, 0, totalLen); - return buf; - } - - /** - * This method fills data[i] with string data from a file that may or may not - * be binary even though it is being read by a reader. It is meant to be used - * simple text-based files only. - * - * @param br - * @param nBytesMax - * @param allowBinary - * @param data - * @param i - * @return true if data[i] holds the data; false if data[i] holds an error message. - */ - public static boolean readAllAsString(BufferedReader br, int nBytesMax, boolean allowBinary, String[] data, int i) { - try { - SB sb = SB.newN(8192); - String line; - if (nBytesMax < 0) { - line = br.readLine(); - if (allowBinary || line != null && line.indexOf('\0') < 0 - && (line.length() != 4 || line.charAt(0) != 65533 - || line.indexOf("PNG") != 1)) { - sb.append(line).appendC('\n'); - while ((line = br.readLine()) != null) - sb.append(line).appendC('\n'); - } - } else { - int n = 0; - int len; - while (n < nBytesMax && (line = br.readLine()) != null) { - if (nBytesMax - n < (len = line.length()) + 1) - line = line.substring(0, nBytesMax - n - 1); - sb.append(line).appendC('\n'); - n += len + 1; - } - } - br.close(); - data[i] = sb.toString(); - return true; - } catch (Exception ioe) { - data[i] = ioe.toString(); - return false; - } - } - - - /////////// PNGJ support ///////////// - - - /** - * Look at byte 50 for "\0PNGJxxxxxxxxx+yyyyyyyyy" where xxxxxxxxx is a byte - * offset to the JMOL data and yyyyyyyyy is the length of the data. - * - * @param bis - * @return same stream or byte stream - */ - - /** - * Retrieve the two numbers in a PNG iTXt tag indicating the - * file pointer for the start of the ZIP data as well as its length. - * - * @param bis - * @param pt_count - */ - static void getPngZipPointAndCount(BufferedInputStream bis, int[] pt_count) { - bis.mark(75); - try { - byte[] data = getLimitedStreamBytes(bis, 74); - bis.reset(); - int pt = 0; - for (int i = 64, f = 1; --i > 54; f *= 10) - pt += (data[i] - '0') * f; - int n = 0; - for (int i = 74, f = 1; --i > 64; f *= 10) - n += (data[i] - '0') * f; - pt_count[0] = pt; - pt_count[1] = n; - } catch (Throwable e) { - pt_count[1] = 0; - } - } - - /** - * Either advance a PNGJ stream to its zip file data or pull out the ZIP data - * bytes and create a new stream for them from which a ZIP utility can start - * extracting files. - * - * @param bis - * @param asNewStream - * @return new buffered ByteArrayInputStream, possibly with no data if there is an error - */ - public static BufferedInputStream getPngZipStream(BufferedInputStream bis, boolean asNewStream) { - if (!isPngZipStream(bis)) - return bis; - byte[] data = new byte[0]; - bis.mark(75); - try { - int pt_count[] = new int[2]; - getPngZipPointAndCount(bis, pt_count); - if (pt_count[1] != 0) { - int pt = pt_count[0]; - while (pt > 0) - pt -= bis.skip(pt); - if (!asNewStream) - return bis; - data = getLimitedStreamBytes(bis, pt_count[1]); - } - } catch (Throwable e) { - } finally { - try { - if (asNewStream) - bis.close(); - } catch (Exception e) { - // ignore - } - } - return getBIS(data); - } - - /** We define a request for zip file extraction by vertical bar: - * zipName|interiorFileName. These may be nested if there is a - * zip file contained in a zip file. - * - * @param fileName - * @return filename trimmed of interior fileName - * - */ - public static String getZipRoot(String fileName) { - int pt = fileName.indexOf("|"); - return (pt < 0 ? fileName : fileName.substring(0, pt)); - } - - public static BufferedWriter getBufferedWriter(OutputStream os, String charSetName) { - OutputStreamWriter osw = (OutputStreamWriter) Interface.getInstanceWithParams("java.io.OutputStreamWriter", - new Class[] { java.io.OutputStream.class, String.class }, - new Object[] { os, charSetName == null ? "UTF-8" : charSetName } - ); - /** - * @j2sNative - * return osw.getBufferedWriter(); - * - */ - { - return new BufferedWriter(osw); - } - } - - -} - diff --git a/src2/javajs/util/SB.java b/src2/javajs/util/SB.java deleted file mode 100644 index aed71f3..0000000 --- a/src2/javajs/util/SB.java +++ /dev/null @@ -1,354 +0,0 @@ - -package javajs.util; - -import java.nio.charset.Charset; - -/** - * Interesting thing here is that JavaScript is 3x faster than Java in handling strings. - * - * Java StringBuilder is final, unfortunately. I guess they weren't thinking about Java2Script! - * - * The reason we have to do this that several overloaded append methods is WAY too expensive - * - */ - -public class SB { - - private java.lang.StringBuilder sb; - String s; // used by JavaScript only; no Java references - - //TODO: JS experiment with using array and .push() here - - public SB() { - /** - * @j2sNative - * - * this.s = ""; - * - */ - { - sb = new java.lang.StringBuilder(); - } - } - - public static SB newN(int n) { - /** - * @j2sNative - * return new javajs.util.SB(); - */ - { - // not perfect, because it requires defining sb twice. - // We can do better... - SB sb = new SB(); - sb.sb = new java.lang.StringBuilder(n); - return sb; - } - } - - public static SB newS(String s) { - /** - * @j2sNative - * - * var sb = new javajs.util.SB(); - * sb.s = s; - * return sb; - * - */ - { - SB sb = new SB(); - sb.sb = new java.lang.StringBuilder(s); - return sb; - } - } - - public SB append(String s) { - /** - * @j2sNative - * - * this.s += s - * - */ - { - sb.append(s); - } - return this; - } - - public SB appendC(char c) { - /** - * @j2sNative - * - * this.s += c; - */ - { - sb.append(c); - } - return this; - - } - - public SB appendI(int i) { - /** - * @j2sNative - * - * this.s += i - * - */ - { - sb.append(i); - } - return this; - } - - public SB appendB(boolean b) { - /** - * @j2sNative - * - * this.s += b - * - */ - { - sb.append(b); - } - return this; - } - - /** - * note that JavaScript could drop off the ".0" in "1.0" - * @param f - * @return this - */ - public SB appendF(float f) { - /** - * @j2sNative - * - * var sf = "" + f; - * if (sf.indexOf(".") < 0 && sf.indexOf("e") < 0) - * sf += ".0" ; - * this.s += sf; - * - */ - { - sb.append(f); - } - return this; - } - - public SB appendD(double d) { - /** - * @j2sNative - * - * var sf = "" + d; - * if (sf.indexOf(".") < 0 && sf.indexOf("e") < 0) - * sf += ".0" ; - * this.s += sf; - * - */ - { - sb.append(d); - } - return this; - } - - public SB appendSB(SB buf) { - /** - * @j2sNative - * - * this.s += buf.s; - * - */ - { - sb.append(buf.sb); - } - return this; - } - - public SB appendO(Object data) { - if (data != null) { - /** - * @j2sNative - * - * this.s += data.toString(); - * - */ - { - sb.append(data); - } - } - return this; - } - - public void appendCB(char[] cb, int off, int len) { - /** - * @j2sNative - * - * this.s += cb.slice(off,off+len).join(""); - * - */ - { - sb.append(cb, off, len); - } - } - - @Override - public String toString() { - /** - * @j2sNative - * - * return this.s; - * - */ - { - return sb.toString(); - } - } - - public int length() { - /** - * @j2sNative - * - * return this.s.length; - * - */ - { - return sb.length(); - } - } - - public int indexOf(String s) { - /** - * @j2sNative - * - * return this.s.indexOf(s); - * - */ - { - return sb.indexOf(s); - } - } - - public char charAt(int i) { - /** - * @j2sNative - * - * return this.s.charAt(i); - * - */ - { - return sb.charAt(i); - } - } - - public int charCodeAt(int i) { - /** - * @j2sNative - * - * return this.s.charCodeAt(i); - * - */ - { - return sb.codePointAt(i); - } - } - - public void setLength(int n) { - /** - * @j2sNative - * - * this.s = this.s.substring(0, n); - */ - { - sb.setLength(n); - } - } - - public int lastIndexOf(String s) { - /** - * @j2sNative - * - * return this.s.lastIndexOf(s); - */ - { - return sb.lastIndexOf(s); - } - } - - public int indexOf2(String s, int i) { - /** - * @j2sNative - * - * return this.s.indexOf(s, i); - */ - { - return sb.indexOf(s, i); - } - } - - public String substring(int i) { - /** - * @j2sNative - * - * return this.s.substring(i); - */ - { - return sb.substring(i); - } - } - - public String substring2(int i, int j) { - /** - * @j2sNative - * - * return this.s.substring(i, j); - */ - { - return sb.substring(i, j); - } - } - - /** - * simple byte conversion properly implementing UTF-8. * Used for base64 - * conversion and allows for offset - * - * @param off - * @param len - * or -1 for full length (then off must = 0) - * @return byte[] - */ - public byte[] toBytes(int off, int len) { - if (len == 0) - return new byte[0]; - Charset cs; - /** - * - * just a string in JavaScript - * - * @j2sNative - * - * cs = "UTF-8"; - * - */ - { - cs = Charset.forName("UTF-8"); - } - return (len > 0 ? substring2(off, off + len) - : off == 0 ? toString() - : substring2(off, length() - off)).getBytes(cs); - } - - public void replace(int start, int end, String str) { - /** - * @j2sNative - * - * this.s = this.s.substring(0, start) + str + this.s.substring(end); - */ - { - sb.replace(start, end, str); - } - } - - public void insert(int offset, String str) { - replace(offset, offset, str); - } - -} diff --git a/src2/javajs/util/StringDataReader.java b/src2/javajs/util/StringDataReader.java deleted file mode 100644 index e78a6f8..0000000 --- a/src2/javajs/util/StringDataReader.java +++ /dev/null @@ -1,51 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2011 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package javajs.util; - -import java.io.StringReader; - - - - - -public class StringDataReader extends DataReader { - - public StringDataReader() { - super(); - } - - public StringDataReader(String data) { - super(new StringReader(data)); - } - - @Override - public DataReader setData(Object data) { - return new StringDataReader((String) data); - } -} \ No newline at end of file diff --git a/src2/javajs/util/T3.java b/src2/javajs/util/T3.java deleted file mode 100644 index 6cd5108..0000000 --- a/src2/javajs/util/T3.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - -import java.io.Serializable; - -import javajs.api.JSONEncodable; - -/** - * A generic 3 element tuple that is represented by single precision floating - * point x,y and z coordinates. - * - * @version specification 1.1, implementation $Revision: 1.10 $, $Date: - * 2006/09/08 20:20:20 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 - * for unique constructor and method names - * for the optimization of compiled JavaScript using Java2Script - */ -public abstract class T3 implements JSONEncodable, Serializable { - - public float x, y, z; - - public T3() { - } - - /** - * Sets the value of this tuple to the specified xyz coordinates. - * - * @param x - * the x coordinate - * @param y - * the y coordinate - * @param z - * the z coordinate - */ - public final void set(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - } - - /** - * Sets the value of this tuple from the 3 values specified in the array. - * - * @param t - * the array of length 3 containing xyz in order - */ - public final void setA(float t[]) { - // ArrayIndexOutOfBounds is thrown if t.length < 3 - x = t[0]; - y = t[1]; - z = t[2]; - } - - /** - * Sets the value of this tuple to the value of the Tuple3f argument. - * - * @param t1 - * the tuple to be copied - */ - public final void setT(T3 t1) { - x = t1.x; - y = t1.y; - z = t1.z; - } - - /** - * Sets the value of this tuple to the vector sum of tuples t1 and t2. - * - * @param t1 - * the first tuple - * @param t2 - * the second tuple - */ - public final void add2(T3 t1, T3 t2) { - x = t1.x + t2.x; - y = t1.y + t2.y; - z = t1.z + t2.z; - } - - /** - * Sets the value of this tuple to the vector sum of itself and tuple t1. - * - * @param t1 - * the other tuple - */ - public final void add(T3 t1) { - x += t1.x; - y += t1.y; - z += t1.z; - } - - /** - * Computes the square of the distance between this point and point p1. - * - * @param p1 - * the other point - * @return the square of distance between these two points as a float - */ - public final float distanceSquared(T3 p1) { - double dx = x - p1.x; - double dy = y - p1.y; - double dz = z - p1.z; - return (float) (dx * dx + dy * dy + dz * dz); - } - - /** - * Returns the distance between this point and point p1. - * - * @param p1 - * the other point - * @return the distance between these two points - */ - public final float distance(T3 p1) { - return (float) Math.sqrt(distanceSquared(p1)); - } - - /** - * Sets the value of this tuple to the vector difference of tuple t1 and t2 - * (this = t1 - t2). - * - * @param t1 - * the first tuple - * @param t2 - * the second tuple - */ - public final void sub2(T3 t1, T3 t2) { - x = t1.x - t2.x; - y = t1.y - t2.y; - z = t1.z - t2.z; - } - - /** - * Sets the value of this tuple to the vector difference of itself and tuple - * t1 (this = this - t1). - * - * @param t1 - * the other tuple - */ - public final void sub(T3 t1) { - x -= t1.x; - y -= t1.y; - z -= t1.z; - } - - /** - * Sets the value of this tuple to the scalar multiplication of itself. - * - * @param s - * the scalar value - */ - public final void scale(float s) { - x *= s; - y *= s; - z *= s; - } - - /** - * Add {a b c} - * - * @param a - * @param b - * @param c - */ - public final void add3(float a, float b, float c) { - x += a; - y += b; - z += c; - } - - - /** - * {x*p.x, y*p.y, z*p.z) used for three-way scaling - * - * @param p - */ - public final void scaleT(T3 p) { - x *= p.x; - y *= p.y; - z *= p.z; - } - - - /** - * Sets the value of this tuple to the scalar multiplication of tuple t1 and - * then adds tuple t2 (this = s*t1 + t2). - * - * @param s - * the scalar value - * @param t1 - * the tuple to be multipled - * @param t2 - * the tuple to be added - */ - public final void scaleAdd2(float s, T3 t1, T3 t2) { - x = s * t1.x + t2.x; - y = s * t1.y + t2.y; - z = s * t1.z + t2.z; - } - - - /** - * average of two tuples - * - * @param a - * @param b - */ - public void ave(T3 a, T3 b) { - x = (a.x + b.x) / 2f; - y = (a.y + b.y) / 2f; - z = (a.z + b.z) / 2f; - } - - /** - * Vector dot product. Was in Vector3f; more useful here, though. - * - * @param v - * the other vector - * @return this.dot.v - */ - public final float dot(T3 v) { - return x * v.x + y * v.y + z * v.z; - } - - /** - * Returns the squared length of this vector. - * Was in Vector3f; more useful here, though. - * - * @return the squared length of this vector - */ - public final float lengthSquared() { - return x * x + y * y + z * z; - } - - /** - * Returns the length of this vector. - * Was in Vector3f; more useful here, though. - * - * @return the length of this vector - */ - public final float length() { - return (float) Math.sqrt(lengthSquared()); - } - - /** - * Normalizes this vector in place. - * Was in Vector3f; more useful here, though. - */ - public final void normalize() { - double d = length(); - - // zero-div may occur. - x /= d; - y /= d; - z /= d; - } - - /** - * Sets this tuple to be the vector cross product of vectors v1 and v2. - * - * @param v1 - * the first vector - * @param v2 - * the second vector - */ - public final void cross(T3 v1, T3 v2) { - set(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, v1.x * v2.y - - v1.y * v2.x); - } - - /** - * Returns a hash number based on the data values in this object. Two - * different Tuple3f objects with identical data values (ie, returns true for - * equals(Tuple3f) ) will return the same hash number. Two vectors with - * different data members may return the same hash value, although this is not - * likely. - */ - @Override - public int hashCode() { - long bits = 1L; - bits = 31L * bits + floatToIntBits(x); - bits = 31L * bits + floatToIntBits(y); - bits = 31L * bits + floatToIntBits(z); - return (int) (bits ^ (bits >> 32)); - } - - public static int floatToIntBits(float x) { - return (x == 0 ? 0 : Float.floatToIntBits(x)); - } - - /** - * Returns true if all of the data members of Tuple3f t1 are equal to the - * corresponding data members in this - * - * @param t1 - * the vector with which the comparison is made. - */ - @Override - public boolean equals(Object t1) { - if (!(t1 instanceof T3)) - return false; - T3 t2 = (T3) t1; - return (x == t2.x && y == t2.y && z == t2.z); - } - - /** - * Returns a string that contains the values of this Tuple3f. The form is - * (x,y,z). - * - * @return the String representation - */ - @Override - public String toString() { - return "{" + x + ", " + y + ", " + z + "}"; - } - - @Override - public String toJSON() { - return "[" + x + "," + y + "," + z + "]"; - } -} diff --git a/src2/javajs/util/T3d.java b/src2/javajs/util/T3d.java deleted file mode 100644 index 08d02d7..0000000 --- a/src2/javajs/util/T3d.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - -import java.io.Serializable; - -/** - * A generic 3 element tuple that is represented by double precision floating - * point x,y and z coordinates. - * - * @version specification 1.1, implementation $Revision: 1.9 $, $Date: - * 2006/07/28 17:01:32 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 - * for unique constructor and method names - * for the optimization of compiled JavaScript using Java2Script - */ -public abstract class T3d implements Serializable { - /** - * The x coordinate. - */ - public double x; - - /** - * The y coordinate. - */ - public double y; - - /** - * The z coordinate. - */ - public double z; - - /** - * Constructs and initializes a Tuple3d to (0,0,0). - */ - public T3d() { - } - - /** - * Sets the value of this tuple to the specified xyz coordinates. - * - * @param x - * the x coordinate - * @param y - * the y coordinate - * @param z - * the z coordinate - */ - public final void set(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - } - - /** - * Sets the value of this tuple from the 3 values specified in the array. - * - * @param t - * the array of length 3 containing xyz in order - */ - public final void setA(double t[]) { - // ArrayIndexOutOfBounds is thrown if t.length < 3 - x = t[0]; - y = t[1]; - z = t[2]; - } - - /** - * Sets the value of this tuple to the value of the Tuple3d argument. - * - * @param t1 - * the tuple to be copied - */ - public final void setT(T3d t1) { - x = t1.x; - y = t1.y; - z = t1.z; - } - - /** - * Sets the value of this tuple to the vector sum of tuples t1 and t2. - * - * @param t1 - * the first tuple - * @param t2 - * the second tuple - */ - public final void add2(T3d t1, T3d t2) { - x = t1.x + t2.x; - y = t1.y + t2.y; - z = t1.z + t2.z; - } - - /** - * Sets the value of this tuple to the vector sum of itself and tuple t1. - * - * @param t1 - * the other tuple - */ - public final void add(T3d t1) { - x += t1.x; - y += t1.y; - z += t1.z; - } - - /** - * Sets the value of this tuple to the vector difference of tuple t1 and t2 - * (this = t1 - t2). - * - * @param t1 - * the first tuple - * @param t2 - * the second tuple - */ - public final void sub2(T3d t1, T3d t2) { - x = t1.x - t2.x; - y = t1.y - t2.y; - z = t1.z - t2.z; - } - - /** - * Sets the value of this tuple to the vector difference of itself and tuple - * t1 (this = this - t1). - * - * @param t1 - * the other tuple - */ - public final void sub(T3d t1) { - x -= t1.x; - y -= t1.y; - z -= t1.z; - } - - /** - * Sets the value of this tuple to the scalar multiplication of itself. - * - * @param s - * the scalar value - */ - public final void scale(double s) { - x *= s; - y *= s; - z *= s; - } - - /** - * Sets the value of this tuple to the scalar multiplication of tuple t1 and - * then adds tuple t2 (this = s*t1 + t2). - * - * @param s - * the scalar value - * @param t1 - * the tuple to be multipled - * @param t2 - * the tuple to be added - */ - public final void scaleAdd(double s, T3d t1, T3d t2) { - x = s * t1.x + t2.x; - y = s * t1.y + t2.y; - z = s * t1.z + t2.z; - } - - /** - * Returns a hash number based on the data values in this object. Two - * different Tuple3d objects with identical data values (ie, returns true for - * equals(Tuple3d) ) will return the same hash number. Two vectors with - * different data members may return the same hash value, although this is not - * likely. - */ - @Override - public int hashCode() { - long xbits = doubleToLongBits0(x); - long ybits = doubleToLongBits0(y); - long zbits = doubleToLongBits0(z); - return (int) (xbits ^ (xbits >> 32) ^ ybits ^ (ybits >> 32) ^ zbits ^ (zbits >> 32)); - } - - static long doubleToLongBits0(double d) { - // Check for +0 or -0 - return (d == 0 ? 0 : Double.doubleToLongBits(d)); - } - - /** - * Returns true if all of the data members of Tuple3d t1 are equal to the - * corresponding data members in this - * - * @param t1 - * the vector with which the comparison is made. - */ - @Override - public boolean equals(Object t1) { - if (!(t1 instanceof T3d)) - return false; - T3d t2 = (T3d) t1; - return (this.x == t2.x && this.y == t2.y && this.z == t2.z); - } - - /** - * Returns a string that contains the values of this Tuple3d. The form is - * (x,y,z). - * - * @return the String representation - */ - @Override - public String toString() { - return "{" + x + ", " + y + ", " + z + "}"; - } - -} diff --git a/src2/javajs/util/T3i.java b/src2/javajs/util/T3i.java deleted file mode 100644 index 7fbd3bb..0000000 --- a/src2/javajs/util/T3i.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - -import java.io.Serializable; - -/** - * A 3-element tuple represented by signed integer x,y,z coordinates. - * - * @since Java 3D 1.2 - * @version specification 1.2, implementation $Revision: 1.9 $, $Date: - * 2006/07/28 17:01:32 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique - * constructor and method names for the optimization of compiled - * JavaScript using Java2Script - */ -public abstract class T3i implements Serializable { - - /** - * The x coordinate. - */ - public int x; - - /** - * The y coordinate. - */ - public int y; - - /** - * The z coordinate. - */ - public int z; - - /** - * Constructs and initializes a Tuple3i to (0,0,0). - */ - public T3i() { - } - - /** - * Sets the value of this tuple to to the specified x, y, and z coordinates. - * - * @param x - * the x coordinate. - * @param y - * the y coordinate. - * @param z - * the z coordinate. - */ - public final void set(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - } - - /** - * Sets the value of this tuple to the value of tuple t1. - * - * @param t1 - * the tuple to be copied. - */ - public final void setT(T3i t1) { - x = t1.x; - y = t1.y; - z = t1.z; - } - - /** - * Sets the value of this tuple to the sum of itself and t1. - * - * @param t - * is the other tuple - */ - public final void add(T3i t) { - x += t.x; - y += t.y; - z += t.z; - } - - /** - * Sets the value of this tuple to the scalar multiplication of tuple t1 plus - * tuple t2 (this = s*t1 + t2). - * - * @param s - * the scalar value - * @param t1 - * the tuple to be multipled - * @param t2 - * the tuple to be added - */ - public final void scaleAdd(int s, T3i t1, T3i t2) { - x = s * t1.x + t2.x; - y = s * t1.y + t2.y; - z = s * t1.z + t2.z; - } - - /** - * Returns a hash number based on the data values in this object. Two - * different Tuple3i objects with identical data values (ie, returns true for - * equals(Tuple3i) ) will return the same hash number. Two vectors with - * different data members may return the same hash value, although this is not - * likely. - */ - @Override - public int hashCode() { - return x ^ y ^ z; - } - - /** - * Returns true if the Object o is of type Tuple3i and all of the data members - * of t are equal to the corresponding data members in this Tuple3i. - * - * @param o - * the object with which the comparison is made. - */ - @Override - public boolean equals(Object o) { - if (!(o instanceof T3i)) - return false; - T3i t = (T3i) o; - return (this.x == t.x && this.y == t.y && this.z == t.z); - } - - /** - * Returns a string that contains the values of this Tuple3i. The form is - * (x,y,z). - * - * @return the String representation - */ - @Override - public String toString() { - return "(" + x + ", " + y + ", " + z + ")"; - } - -} diff --git a/src2/javajs/util/T4.java b/src2/javajs/util/T4.java deleted file mode 100644 index 21b2741..0000000 --- a/src2/javajs/util/T4.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - -/** - * A generic 4 element tuple that is represented by single precision floating - * point x,y,z and w coordinates. - * - * @version specification 1.1, implementation $Revision: 1.9 $, $Date: - * 2006/07/28 17:01:32 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 - * for unique constructor and method names - * for the optimization of compiled JavaScript using Java2Script - */ -public abstract class T4 extends T3 { - - /** - * The w coordinate. - */ - public float w; - - /** - * Constructs and initializes a Tuple4f to (0,0,0,0). - * - */ - public T4() { - } - - /** - * Sets the value of this tuple to the specified xyzw coordinates. - * - * @param x - * the x coordinate - * @param y - * the y coordinate - * @param z - * the z coordinate - * @param w - * the w coordinate - */ - public final void set4(float x, float y, float z, float w) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - - /** - * Sets the value of this tuple to the scalar multiplication of itself. - * - * @param s - * the scalar value - */ - public final void scale4(float s) { - scale(s); - w *= s; - } - - /** - * Returns a hash number based on the data values in this object. Two - * different Tuple4f objects with identical data values (ie, returns true for - * equals(Tuple4f) ) will return the same hash number. Two vectors with - * different data members may return the same hash value, although this is not - * likely. - */ - @Override - public int hashCode() { - return T3.floatToIntBits(x) ^ T3.floatToIntBits(y) - ^ T3.floatToIntBits(z) ^ T3.floatToIntBits(w); - } - - /** - * Returns true if all of the data members of Object are equal to the - * corresponding data members in this - * - * @param o - * the vector with which the comparison is made. - */ - @Override - public boolean equals(Object o) { - if (!(o instanceof T4)) - return false; - T4 t = (T4) o; - return (this.x == t.x && this.y == t.y && this.z == t.z && this.w == t.w); - } - - /** - * Returns a string that contains the values of this Tuple4f. The form is - * (x,y,z,w). - * - * @return the String representation - */ - @Override - public String toString() { - return "(" + x + ", " + y + ", " + z + ", " + w + ")"; - } - - @Override - public String toJSON() { - return "[" + x + ", " + y + ", " + z + ", " + w + "]"; - } - -} diff --git a/src2/javajs/util/V3.java b/src2/javajs/util/V3.java deleted file mode 100644 index 51325d2..0000000 --- a/src2/javajs/util/V3.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. - */ -package javajs.util; - - -/** - * A 3-element vector that is represented by single precision floating point - * x,y,z coordinates. If this value represents a normal, then it should be - * normalized. - * - * @version specification 1.1, implementation $Revision: 1.10 $, $Date: - * 2006/10/03 19:52:30 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 - * for unique constructor and method names - * for the optimization of compiled JavaScript using Java2Script - */ -public class V3 extends T3 { - - public V3() { - } - - public static V3 newV(T3 t) { - return V3.new3(t.x, t.y, t.z); - } - - public static V3 newVsub(T3 t1, T3 t2) { - return V3.new3(t1.x - t2.x, t1.y - t2.y,t1.z - t2.z); - } - - public static V3 new3(float x, float y, float z) { - V3 v = new V3(); - v.x = x; - v.y = y; - v.z = z; - return v; - } - - /** - * Returns the angle in radians between this vector and the vector parameter; - * the return value is constrained to the range [0,PI]. - * - * @param v1 - * the other vector - * @return the angle in radians in the range [0,PI] - */ - public final float angle(V3 v1) { - // return (double)Math.acos(dot(v1)/v1.length()/v.length()); - // Numerically, near 0 and PI are very bad condition for acos. - // In 3-space, |atan2(sin,cos)| is much stable. - - double xx = y * v1.z - z * v1.y; - double yy = z * v1.x - x * v1.z; - double zz = x * v1.y - y * v1.x; - double cross = Math.sqrt(xx * xx + yy * yy + zz * zz); - - return (float) Math.abs(Math.atan2(cross, dot(v1))); - } -} diff --git a/src2/javajs/util/V3d.java b/src2/javajs/util/V3d.java deleted file mode 100644 index 9060575..0000000 --- a/src2/javajs/util/V3d.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - Copyright (C) 1997,1998,1999 - Kenji Hiranabe, Eiwa System Management, Inc. - - This program is free software. - Implemented by Kenji Hiranabe(hiranabe@esm.co.jp), - conforming to the Java(TM) 3D API specification by Sun Microsystems. - - Permission to use, copy, modify, distribute and sell this software - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and - that both that copyright notice and this permission notice appear - in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc. - makes no representations about the suitability of this software for any - purpose. It is provided "AS IS" with NO WARRANTY. -*/ -package javajs.util; - - - - -/** - * A 3 element vector that is represented by double precision floating point - * x,y,z coordinates. If this value represents a normal, then it should be - * normalized. - * - * @version specification 1.1, implementation $Revision: 1.9 $, $Date: - * 2006/07/28 17:01:32 $ - * @author Kenji hiranabe - * - * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 - * for unique constructor and method names - * for the optimization of compiled JavaScript using Java2Script - */ -public class V3d extends T3d { - - /** - * Sets this vector to be the vector cross product of vectors v1 and v2. - * - * @param v1 - * the first vector - * @param v2 - * the second vector - */ - public final void cross(V3d v1, V3d v2) { - // store on stack once for aliasing-safty - // i.e. safe when a.cross(a, b) - set(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, v1.x * v2.y - - v1.y * v2.x); - } - - /** - * Normalizes this vector in place. - */ - public final void normalize() { - double d = length(); - - // zero-div may occur. - x /= d; - y /= d; - z /= d; - } - - /** - * Computes the dot product of the this vector and vector v. - * - * @param v - * the other vector - * @return this.dot.v - */ - public final double dot(V3d v) { - return x * v.x + y * v.y + z * v.z; - } - - /** - * Returns the squared length of this vector. - * - * @return the squared length of this vector - */ - public final double lengthSquared() { - return x * x + y * y + z * z; - } - - /** - * Returns the length of this vector. - * - * @return the length of this vector - */ - public final double length() { - return Math.sqrt(lengthSquared()); - } - -} diff --git a/src2/javajs/util/XmlUtil.java b/src2/javajs/util/XmlUtil.java deleted file mode 100644 index 3e30e4b..0000000 --- a/src2/javajs/util/XmlUtil.java +++ /dev/null @@ -1,171 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2006 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package javajs.util; - -/** - * A very simplistic XML generator - */ - -public class XmlUtil { - - public XmlUtil() { - // Jmol's PropertyManager and JvxlCoder classes use reflection - } - public static void openDocument(SB data) { - data.append("\n"); - } - - public static void openTag(SB sb, String name) { - sb.append("<").append(name).append(">\n"); - } - - public static void openTagAttr(SB sb, String name, Object[] attributes) { - appendTagAll(sb, name, attributes, null, false, false); - sb.append("\n"); - } - - public static void closeTag(SB sb, String name) { - sb.append("\n"); - } - - public static void appendTagAll(SB sb, String name, - Object[] attributes, Object data, - boolean isCdata, boolean doClose) { - String closer = ">"; - if (name.endsWith("/")){ - name = name.substring(0, name.length() - 1); - if (data == null) { - closer = "/>\n"; - doClose = false; - } - } - sb.append("<").append(name); - if (attributes != null) - for (int i = 0; i < attributes.length; i++) { - Object o = attributes[i]; - if (o == null) - continue; - if (o instanceof Object[]) - for (int j = 0; j < ((Object[]) o).length; j+= 2) - appendAttrib(sb, ((Object[]) o)[j], ((Object[]) o)[j + 1]); - else - appendAttrib(sb, o, attributes[++i]); - } - sb.append(closer); - if (data != null) { - if (isCdata) - data = wrapCdata(data); - sb.appendO(data); - } - if (doClose) - closeTag(sb, name); - } - - /** - * wrap the string as character data, with replacements for [ noted - * as a list starting with * after the CDATA termination - * - * @param data - * @return wrapped text - */ - public static String wrapCdata(Object data) { - String s = "" + data; - return (s.indexOf("&") < 0 && s.indexOf("<") < 0 ? (s.startsWith("\n") ? "" : "\n") + s - : "", "]]]]>") + "]]>"); - } - - /** - * standard data" - * - * @param sb - * @param name - * @param attributes - * @param data - */ - public static void appendTagObj(SB sb, String name, - Object[] attributes, Object data) { - appendTagAll(sb, name, attributes, data, false, true); - } - - /** - * standard data" - * standard " - * - * @param sb - * @param name - * @param data - */ - public static void appendTag(SB sb, String name, Object data) { - if (data instanceof Object[]) - appendTagAll(sb, name, (Object[]) data, null, false, true); - else - appendTagAll(sb, name, null, data, false, true); - } - - /** - * " - * - * will convert ]]> to ]] > - * - * @param sb - * @param name - * @param attributes - * @param data - */ - public static void appendCdata(SB sb, String name, - Object[] attributes, String data) { - appendTagAll(sb, name, attributes, data, true, true); - } - - /** - * - * @param sb - * @param name - * @param value - */ - public static void appendAttrib(SB sb, Object name, Object value) { - if (value == null) - return; - - // note: <&" are disallowed but not checked for here - - sb.append(" ").appendO(name).append("=\"").appendO(value).append("\""); - } - -// /** -// * @param s -// * @return unwrapped text -// */ -// public static String unwrapCdata(String s) { -// return (s.startsWith("") ? -// PT.rep(s.substring(9, s.length()-3),"]]]]>", "]]>") : s); -// } -// - -} diff --git a/src2/javajs/util/ZipData.java b/src2/javajs/util/ZipData.java deleted file mode 100644 index f20715f..0000000 --- a/src2/javajs/util/ZipData.java +++ /dev/null @@ -1,76 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Copyright (C) 2006 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package javajs.util; - -import java.io.BufferedInputStream; - -import javajs.api.GenericZipTools; - - - - -public class ZipData { - boolean isEnabled = true; - byte[] buf; - int pt; - int nBytes; - - public ZipData(int nBytes) { - this.nBytes = nBytes; - } - - public int addBytes(byte[] byteBuf, int nSectorBytes, int nBytesRemaining) { - if (pt == 0) { - if (!Rdr.isGzipB(byteBuf)) { - isEnabled = false; - return -1; - } - buf = new byte[nBytesRemaining]; - } - int nToAdd = Math.min(nSectorBytes, nBytesRemaining); - System.arraycopy(byteBuf, 0, buf, pt, nToAdd); - pt += nToAdd; - return nBytesRemaining - nToAdd; - } - - public void addTo(GenericZipTools jzt, SB data) { - data.append(getGzippedBytesAsString(jzt, buf)); - } - - static String getGzippedBytesAsString(GenericZipTools jzt, byte[] bytes) { - try { - BufferedInputStream bis = jzt.getUnGzippedInputStream(bytes); - String s = ZipTools.getStreamAsString(bis); - bis.close(); - return s; - } catch (Exception e) { - return ""; - } - } - - -} - diff --git a/src2/javajs/util/ZipTools.java b/src2/javajs/util/ZipTools.java deleted file mode 100644 index a4082ec..0000000 --- a/src2/javajs/util/ZipTools.java +++ /dev/null @@ -1,462 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Some portions of this file have been modified by Robert Hanson hansonr.at.stolaf.edu 2012-2017 - * for use in SwingJS via transpilation into JavaScript using Java2Script. - * - * Copyright (C) 2006 The Jmol Development Team - * - * Contact: jmol-developers@lists.sf.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package javajs.util; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Map; -import java.util.zip.CRC32; -import java.util.zip.GZIPInputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; - -import javajs.api.GenericZipInputStream; -import javajs.api.GenericZipTools; -import javajs.api.Interface; -import javajs.api.ZInputStream; - -import org.apache.tools.bzip2.CBZip2InputStreamFactory; - - -/** - * Note the JSmol/HTML5 must use its own version of java.util.zip.ZipOutputStream. - * - */ -public class ZipTools implements GenericZipTools { - - public ZipTools() { - // for reflection - } - - @Override - public ZInputStream newZipInputStream(InputStream is) { - return newZIS(is); - } - - @SuppressWarnings("resource") - private static ZInputStream newZIS(InputStream is) { - return (is instanceof ZInputStream ? (ZInputStream) is - : is instanceof BufferedInputStream ? new GenericZipInputStream(is) - : new GenericZipInputStream(new BufferedInputStream(is))); - } - - /** - * reads a ZIP file and saves all data in a Hashtable so that the files may be - * organized later in a different order. Also adds a #Directory_Listing entry. - * - * Files are bracketed by BEGIN Directory Entry and END Directory Entry lines, - * similar to CompoundDocument.getAllData. - * - * @param is - * @param subfileList - * @param name0 - * prefix for entry listing - * @param binaryFileList - * |-separated list of files that should be saved as xx xx xx hex byte - * strings. The directory listing is appended with ":asBinaryString" - * @param fileData - */ - @Override - public void getAllZipData(InputStream is, String[] subfileList, - String name0, String binaryFileList, String exclude, - Map fileData) { - ZipInputStream zis = (ZipInputStream) newZIS(is); - ZipEntry ze; - SB listing = new SB(); - binaryFileList = "|" + binaryFileList + "|"; - String prefix = PT.join(subfileList, '/', 1); - String prefixd = null; - if (prefix != null) { - prefixd = prefix.substring(0, prefix.indexOf("/") + 1); - if (prefixd.length() == 0) - prefixd = null; - } - try { - while ((ze = zis.getNextEntry()) != null) { - String name = ze.getName(); - if (prefix != null && prefixd != null - && !(name.equals(prefix) || name.startsWith(prefixd)) - || exclude != null && name.contains(exclude)) - continue; - //System.out.println("ziputil: " + name); - listing.append(name).appendC('\n'); - String sname = "|" + name.substring(name.lastIndexOf("/") + 1) + "|"; - boolean asBinaryString = (binaryFileList.indexOf(sname) >= 0); - byte[] bytes = Rdr.getLimitedStreamBytes(zis, ze.getSize()); - String str; - if (asBinaryString) { - str = getBinaryStringForBytes(bytes); - name += ":asBinaryString"; - } else { - str = Rdr.fixUTF(bytes); - } - str = "BEGIN Directory Entry " + name + "\n" + str - + "\nEND Directory Entry " + name + "\n"; - String key = name0 + "|" + name; - fileData.put(key, str); - } - } catch (Exception e) { - } - fileData.put("#Directory_Listing", listing.toString()); - } - - private String getBinaryStringForBytes(byte[] bytes) { - SB ret = new SB(); - for (int i = 0; i < bytes.length; i++) - ret.append(Integer.toHexString(bytes[i] & 0xFF)).appendC(' '); - return ret.toString(); - } - - /** - * iteratively drills into zip files of zip files to extract file content or - * zip file directory. Also works with JAR files. - * - * Does not return "__MACOS" paths - * - * @param bis - * @param list - * @param listPtr - * @param asBufferedInputStream - * for Pmesh - * @return directory listing or subfile contents - */ - @Override - public Object getZipFileDirectory(BufferedInputStream bis, String[] list, - int listPtr, boolean asBufferedInputStream) { - SB ret; - if (list == null || listPtr >= list.length) - return getZipDirectoryAsStringAndClose(bis); - bis = Rdr.getPngZipStream(bis, true); - String fileName = list[listPtr]; - ZipInputStream zis = new ZipInputStream(bis); - ZipEntry ze; - //System.out.println("fname=" + fileName); - try { - boolean isAll = (fileName.equals(".")); - if (isAll || fileName.lastIndexOf("/") == fileName.length() - 1) { - ret = new SB(); - while ((ze = zis.getNextEntry()) != null) { - String name = ze.getName(); - if (isAll || name.startsWith(fileName)) - ret.append(name).appendC('\n'); - } - String str = ret.toString(); - return (asBufferedInputStream ? Rdr.getBIS(str.getBytes()) : str); - } - int pt = fileName.indexOf(":asBinaryString"); - boolean asBinaryString = (pt > 0); - if (asBinaryString) - fileName = fileName.substring(0, pt); - fileName = fileName.replace('\\', '/'); - while ((ze = zis.getNextEntry()) != null - && !fileName.equals(ze.getName())) { - } - byte[] bytes = (ze == null ? null : Rdr.getLimitedStreamBytes(zis, - ze.getSize())); - ze = null; - zis.close(); - if (bytes == null) - return ""; - if (Rdr.isZipB(bytes) || Rdr.isPngZipB(bytes)) - return getZipFileDirectory(Rdr.getBIS(bytes), list, ++listPtr, - asBufferedInputStream); - if (asBufferedInputStream) - return Rdr.getBIS(bytes); - if (asBinaryString) { - ret = new SB(); - for (int i = 0; i < bytes.length; i++) - ret.append(Integer.toHexString(bytes[i] & 0xFF)).appendC(' '); - return ret.toString(); - } - if (Rdr.isGzipB(bytes)) - bytes = Rdr.getLimitedStreamBytes(getUnGzippedInputStream(bytes), -1); - return Rdr.fixUTF(bytes); - } catch (Exception e) { - return ""; - } - } - - @Override - public byte[] getZipFileContentsAsBytes(BufferedInputStream bis, - String[] list, int listPtr) { - byte[] ret = new byte[0]; - String fileName = list[listPtr]; - if (fileName.lastIndexOf("/") == fileName.length() - 1) - return ret; - try { - bis = Rdr.getPngZipStream(bis, true); - ZipInputStream zis = new ZipInputStream(bis); - ZipEntry ze; - while ((ze = zis.getNextEntry()) != null) { - if (!fileName.equals(ze.getName())) - continue; - byte[] bytes = Rdr.getLimitedStreamBytes(zis, ze.getSize()); - return ((Rdr.isZipB(bytes) || Rdr.isPngZipB(bytes)) && ++listPtr < list.length ? getZipFileContentsAsBytes( - Rdr.getBIS(bytes), list, listPtr) : bytes); - } - } catch (Exception e) { - } - return ret; - } - - @Override - public String getZipDirectoryAsStringAndClose(BufferedInputStream bis) { - SB sb = new SB(); - String[] s = new String[0]; - try { - s = getZipDirectoryOrErrorAndClose(bis, null); - bis.close(); - } catch (Exception e) { - System.out.println(e.toString()); - } - for (int i = 0; i < s.length; i++) - sb.append(s[i]).appendC('\n'); - return sb.toString(); - } - - @Override - public String[] getZipDirectoryAndClose(BufferedInputStream bis, - String manifestID) { - String[] s = new String[0]; - try { - s = getZipDirectoryOrErrorAndClose(bis, manifestID); - bis.close(); - } catch (Exception e) { - System.out.println(e.toString()); - } - return s; - } - - private String[] getZipDirectoryOrErrorAndClose(BufferedInputStream bis, - String manifestID) - throws IOException { - bis = Rdr.getPngZipStream(bis, true); - Lst v = new Lst(); - ZipInputStream zis = new ZipInputStream(bis); - ZipEntry ze; - String manifest = null; - while ((ze = zis.getNextEntry()) != null) { - String fileName = ze.getName(); - if (manifestID != null && fileName.startsWith(manifestID)) - manifest = getStreamAsString(zis); - else if (!fileName.startsWith("__MACOS")) // resource fork not nec. - v.addLast(fileName); - } - zis.close(); - if (manifestID != null) - v.add(0, manifest == null ? "" : manifest + "\n############\n"); - return v.toArray(new String[v.size()]); - } - - public static String getStreamAsString(InputStream is) throws IOException { - return Rdr.fixUTF(Rdr.getLimitedStreamBytes(is, -1)); - } - - @Override - public InputStream newGZIPInputStream(InputStream is) throws IOException { - return new BufferedInputStream(new GZIPInputStream(is, 512)); - } - - @Override - public InputStream newBZip2InputStream(InputStream is) throws IOException { - return new BufferedInputStream(((CBZip2InputStreamFactory) Interface.getInterface("org.apache.tools.bzip2.CBZip2InputStreamFactory")).getStream(is)); - } - - @Override - public BufferedInputStream getUnGzippedInputStream(byte[] bytes) { - try { - return Rdr.getUnzippedInputStream(this, Rdr.getBIS(bytes)); - } catch (Exception e) { - return null; - } - } - - @Override - public void addZipEntry(Object zos, String fileName) throws IOException { - ((ZipOutputStream) zos).putNextEntry(new ZipEntry(fileName)); - } - - @Override - public void closeZipEntry(Object zos) throws IOException { - ((ZipOutputStream) zos).closeEntry(); - } - - @Override - public Object getZipOutputStream(Object bos) { -// /** -// * @j2sNative -// * -// * return javajs.api.Interface.getInterface( -// * "java.util.zip.ZipOutputStream").setZOS(bos); -// * -// */ -// { - return new ZipOutputStream((OutputStream) bos); -// } - } - - @Override - public int getCrcValue(byte[] bytes) { - CRC32 crc = new CRC32(); - crc.update(bytes, 0, bytes.length); - return (int) crc.getValue(); - } - - @Override - public void readFileAsMap(BufferedInputStream bis, Map bdata, String name) { - readFileAsMapStatic(bis, bdata, name); - } - - public static void readFileAsMapStatic(BufferedInputStream bis, - Map bdata, String name) { - int pt = (name == null ? -1 : name.indexOf("|")); - name = (pt >= 0 ? name.substring(pt + 1) : null); - try { - if (Rdr.isPngZipStream(bis)) { - boolean isImage = "_IMAGE_".equals(name); - if (name == null || isImage) - bdata.put((isImage ? "_DATA_" : "_IMAGE_"), new BArray(getPngImageBytes(bis))); - if (!isImage) - cacheZipContentsStatic(bis, name, bdata, true); - } else if (Rdr.isZipS(bis)) { - cacheZipContentsStatic(bis, name, bdata, true); - } else if (name == null){ - bdata.put("_DATA_", new BArray(Rdr.getLimitedStreamBytes(bis, -1))); - } else { - throw new IOException("ZIP file " + name + " not found"); - } - bdata.put("$_BINARY_$", Boolean.TRUE); - } catch (IOException e) { - bdata.clear(); - bdata.put("_ERROR_", e.getMessage()); - } - } - - @Override - public String cacheZipContents(BufferedInputStream bis, - String fileName, - Map cache, - boolean asByteArray) { - return cacheZipContentsStatic(bis, fileName, cache, asByteArray); - } - - /** - * - * @param bis - * @param fileName may end with "/" for a prefix or contain "|xxxx.xxx" for a specific file or be null - * @param cache - * @param asByteArray - * @return - */ - public static String cacheZipContentsStatic(BufferedInputStream bis, - String fileName, Map cache, boolean asByteArray) { - ZipInputStream zis = (ZipInputStream) newZIS(bis); - ZipEntry ze; - SB listing = new SB(); - long n = 0; - boolean isPath = (fileName != null && fileName.endsWith("/")); - boolean oneFile = (asByteArray && !isPath && fileName != null); - int pt = (oneFile ? fileName.indexOf("|") : -1); - String file0 = (pt >= 0 ? fileName : null); - if (pt >= 0) - fileName = fileName.substring(0, pt); - String prefix = (fileName == null ? "" : isPath ? fileName : fileName + "|"); - try { - while ((ze = zis.getNextEntry()) != null) { - String name = ze.getName(); - if (fileName != null) { - if (oneFile) { - if (!name.equalsIgnoreCase(fileName)) - continue; - } else { - listing.append(name).appendC('\n'); - } - } - long nBytes = ze.getSize(); - byte[] bytes = Rdr.getLimitedStreamBytes(zis, nBytes); - if (file0 != null) { - readFileAsMapStatic(Rdr.getBIS(bytes), cache, file0); - return null; - } - n += bytes.length; - Object o = (asByteArray ? new BArray(bytes) : bytes); - cache.put((oneFile ? "_DATA_" : prefix + name), o); - if (oneFile) - break; - } - zis.close(); - } catch (Exception e) { - try { - zis.close(); - } catch (IOException e1) { - } - return null; - } - if (n == 0 || fileName == null) - return null; - System.out.println("ZipTools cached " + n + " bytes from " + fileName); - return listing.toString(); - } - - private static byte[] getPngImageBytes(BufferedInputStream bis) { - try { - if (Rdr.isPngZipStream(bis)) { - int pt_count[] = new int[2]; - Rdr.getPngZipPointAndCount(bis, pt_count); - if (pt_count[1] != 0) - return deActivatePngZipB(Rdr.getLimitedStreamBytes(bis, pt_count[0])); - } - return Rdr.getLimitedStreamBytes(bis, -1); - } catch (IOException e) { - return null; - } - } - - /** - * Once a PNGJ image has been extracted, we want to red-line its - * iTXt "Jmol Type PNGJ" tag, since it is no longer associated with - * ZIP data. - * - * @param bytes - * @return disfigured bytes - * - */ - private static byte[] deActivatePngZipB(byte[] bytes) { - // \0PNGJ starting at byte 50 changed to \0 NGJ - if (Rdr.isPngZipB(bytes)) - bytes[51] = 32; - return bytes; - } - - - -} diff --git a/src2/net/miginfocom/README_SWINGJS.txt b/src2/net/miginfocom/README_SWINGJS.txt deleted file mode 100644 index cec8076..0000000 --- a/src2/net/miginfocom/README_SWINGJS.txt +++ /dev/null @@ -1,10 +0,0 @@ -https://github.com/mikaelgrev/miglayout.git -2018.07.03 BH Latest commit f2a231c - - -Status -====== - -7/3/2018 - -no changes necessary diff --git a/src2/net/miginfocom/layout/AC.java b/src2/net/miginfocom/layout/AC.java deleted file mode 100644 index 2d1032c..0000000 --- a/src2/net/miginfocom/layout/AC.java +++ /dev/null @@ -1,567 +0,0 @@ -package net.miginfocom.layout; - -import java.io.*; -import java.util.ArrayList; - -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** A constraint that holds the column or row constraints for the grid. It also holds the gaps between the rows and columns. - *

- * This class is a holder and builder for a number of {@link net.miginfocom.layout.DimConstraint}s. - *

- * For a more thorough explanation of what these constraints do, and how to build the constraints, see the White Paper or Cheat Sheet at www.migcomponents.com. - *

- * Note that there are two way to build this constraint. Through String (e.g. "[100]3[200,fill]" or through API (E.g. - * new AC().size("100").gap("3").size("200").fill(). - */ -public final class AC implements Externalizable -{ - private final ArrayList cList = new ArrayList(1); - - private transient int curIx = 0; - - /** Constructor. Creates an instance that can be configured manually. Will be initialized with a default - * {@link net.miginfocom.layout.DimConstraint}. - */ - public AC() - { - cList.add(new DimConstraint()); - } - - /** Property. The different {@link net.miginfocom.layout.DimConstraint}s that this object consists of. - * These DimConstraints contains all information in this class. - *

- * Yes, we are embarrassingly aware that the method is misspelled. - * @return The different {@link net.miginfocom.layout.DimConstraint}s that this object consists of. A new list and - * never null. - */ - public final DimConstraint[] getConstaints() - { - return cList.toArray(new DimConstraint[cList.size()]); - } - - /** Sets the different {@link net.miginfocom.layout.DimConstraint}s that this object should consists of. - *

- * Yes, we are embarrassingly aware that the method is misspelled. - * @param constr The different {@link net.miginfocom.layout.DimConstraint}s that this object consists of. The list - * will be copied for storage. null or and empty array will reset the constraints to one DimConstraint - * with default values. - */ - public final void setConstaints(DimConstraint[] constr) - { - if (constr == null || constr.length < 1 ) - constr = new DimConstraint[] {new DimConstraint()}; - - cList.clear(); - cList.ensureCapacity(constr.length); - for (DimConstraint c : constr) - cList.add(c); - } - - /** Returns the number of rows/columns that this constraints currently have. - * @return The number of rows/columns that this constraints currently have. At least 1. - */ - public int getCount() - { - return cList.size(); - } - - /** Sets the total number of rows/columns to size. If the number of rows/columns is already more - * than size nothing will happen. - * @param size The total number of rows/columns - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC count(int size) - { - makeSize(size); - return this; - } - - /** Specifies that the current row/column should not be grid-like. The while row/column will have its components layed out - * in one single cell. It is the same as to say that the cells in this column/row will all be merged (a.k.a spanned). - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC noGrid() - { - return noGrid(curIx); - } - - /** Specifies that the indicated rows/columns should not be grid-like. The while row/column will have its components layed out - * in one single cell. It is the same as to say that the cells in this column/row will all be merged (a.k.a spanned). - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC noGrid(int... indexes) - { - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setNoGrid(true); - } - return this; - } - - /** Sets the current row/column to i. If the current number of rows/columns is less than i a call - * to {@link #count(int)} will set the size accordingly. - *

- * The next call to any of the constraint methods (e.g. {@link net.miginfocom.layout.AC#noGrid}) will be carried - * out on this new row/column. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param i The new current row/column. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC index(int i) - { - makeSize(i); - curIx = i; - return this; - } - - /** Specifies that the current row/column's component should grow by default. It does not affect the size of the row/column. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC fill() - { - return fill(curIx); - } - - /** Specifies that the indicated rows'/columns' component should grow by default. It does not affect the size of the row/column. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC fill(int... indexes) - { - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setFill(true); - } - return this; - } - -// /** Specifies that the current row/column should be put in the end group s and will thus share the same ending -// * coordinate within the group. -// *

-// * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. -// * @param s A name to associate on the group that should be the same for other rows/columns in the same group. -// * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). -// */ -// public final AxisConstraint endGroup(String s) -// { -// return endGroup(s, curIx); -// } -// -// /** Specifies that the indicated rows/columns should be put in the end group s and will thus share the same ending -// * coordinate within the group. -// *

-// * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. -// * @param s A name to associate on the group that should be the same for other rows/columns in the same group. -// * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. -// * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). -// */ -// public final AxisConstraint endGroup(String s, int... indexes) -// { -// for (int i = indexes.length - 1; i >= 0; i--) { -// int ix = indexes[i]; -// makeSize(ix); -// cList.get(ix).setEndGroup(s); -// } -// return this; -// } - - /** Specifies that the current row/column should be put in the size group s and will thus share the same size - * constraints as the other components in the group. - *

- * Same as sizeGroup("") - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final AC sizeGroup() - { - return sizeGroup("", curIx); - } - - /** Specifies that the current row/column should be put in the size group s and will thus share the same size - * constraints as the other components in the group. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s A name to associate on the group that should be the same for other rows/columns in the same group. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC sizeGroup(String s) - { - return sizeGroup(s, curIx); - } - - /** Specifies that the indicated rows/columns should be put in the size group s and will thus share the same size - * constraints as the other components in the group. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s A name to associate on the group that should be the same for other rows/columns in the same group. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC sizeGroup(String s, int... indexes) - { - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setSizeGroup(s); - } - return this; - } - - /** Specifies the current row/column's min and/or preferred and/or max size. E.g. "10px" or "50:100:200". - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s The minimum and/or preferred and/or maximum size of this row. The string will be interpreted - * as a BoundSize. For more info on how BoundSize is formatted see the documentation. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC size(String s) - { - return size(s, curIx); - } - - /** Specifies the indicated rows'/columns' min and/or preferred and/or max size. E.g. "10px" or "50:100:200". - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The minimum and/or preferred and/or maximum size of this row. The string will be interpreted - * as a BoundSize. For more info on how BoundSize is formatted see the documentation. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC size(String size, int... indexes) - { - BoundSize bs = ConstraintParser.parseBoundSize(size, false, true); - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setSize(bs); - } - return this; - } - - /** Specifies the gap size to be the default one AND moves to the next column/row. The method is called .gap() - * rather the more natural .next() to indicate that it is very much related to the other .gap(..) methods. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC gap() - { - curIx++; - makeSize(curIx); - return this; - } - - /** Specifies the gap size to size AND moves to the next column/row. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size minimum and/or preferred and/or maximum size of the gap between this and the next row/column. - * The string will be interpreted as a BoundSize. For more info on how BoundSize is formatted see the documentation. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC gap(String size) - { - return gap(size, curIx++); - } - - /** Specifies the indicated rows'/columns' gap size to size. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size minimum and/or preferred and/or maximum size of the gap between this and the next row/column. - * The string will be interpreted as a BoundSize. For more info on how BoundSize is formatted see the documentation. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC gap(String size, int... indexes) - { - BoundSize bsa = size != null ? ConstraintParser.parseBoundSize(size, true, true) : null; - - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix + 1); - if (bsa != null) - cList.get(ix).setGapAfter(bsa); - } - return this; - } - - /** Specifies the current row/column's columns default alignment for its components. It does not affect the positioning - * or size of the columns/row itself. For columns it is the horizontal alignment (e.g. "left") and for rows it is the vertical - * alignment (e.g. "top"). - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param side The default side to align the components. E.g. "top" or "left", or "leading" or "trailing" or "bottom" or "right". - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC align(String side) - { - return align(side, curIx); - } - - /** Specifies the indicated rows'/columns' columns default alignment for its components. It does not affect the positioning - * or size of the columns/row itself. For columns it is the horizontal alignment (e.g. "left") and for rows it is the vertical - * alignment (e.g. "top"). - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param side The default side to align the components. E.g. "top" or "left", or "before" or "after" or "bottom" or "right". - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC align(String side, int... indexes) - { - UnitValue al = ConstraintParser.parseAlignKeywords(side, true); - if (al == null) - al = ConstraintParser.parseAlignKeywords(side, false); - - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setAlign(al); - } - return this; - } - - /** Specifies the current row/column's grow priority. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The new grow priority. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC growPrio(int p) - { - return growPrio(p, curIx); - } - - /** Specifies the indicated rows'/columns' grow priority. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The new grow priority. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC growPrio(int p, int... indexes) - { - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setGrowPriority(p); - } - return this; - } - - /** Specifies the current row/column's grow weight within columns/rows with the grow priority 100f. - *

- * Same as grow(100f) - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final AC grow() - { - return grow(100f, curIx); - } - - /** Specifies the current row/column's grow weight within columns/rows with the same grow priority. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param w The new grow weight. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC grow(float w) - { - return grow(w, curIx); - } - - /** Specifies the indicated rows'/columns' grow weight within columns/rows with the same grow priority. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param w The new grow weight. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC grow(float w, int... indexes) - { - Float gw = new Float(w); - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setGrow(gw); - } - return this; - } - - /** Specifies the current row/column's shrink priority. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The new shrink priority. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC shrinkPrio(int p) - { - return shrinkPrio(p, curIx); - } - - /** Specifies the indicated rows'/columns' shrink priority. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The new shrink priority. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - */ - public final AC shrinkPrio(int p, int... indexes) - { - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setShrinkPriority(p); - } - return this; - } - - /** Specifies that the current row/column's shrink weight within the columns/rows with the shrink priority 100f. - *

- * Same as shrink(100f). - *

- * For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final AC shrink() - { - return shrink(100f, curIx); - } - - /** Specifies that the current row/column's shrink weight within the columns/rows with the same shrink priority. - *

- * For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com. - * @param w The shrink weight. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final AC shrink(float w) - { - return shrink(w, curIx); - } - - /** Specifies the indicated rows'/columns' shrink weight within the columns/rows with the same shrink priority. - *

- * For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com. - * @param w The shrink weight. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final AC shrink(float w, int... indexes) - { - Float sw = new Float(w); - for (int i = indexes.length - 1; i >= 0; i--) { - int ix = indexes[i]; - makeSize(ix); - cList.get(ix).setShrink(sw); - } - return this; - } - - /** Specifies that the current row/column's shrink weight within the columns/rows with the same shrink priority. - *

- * For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com. - * @param w The shrink weight. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - * @deprecated in 3.7.2. Use {@link #shrink(float)} instead. - */ - public final AC shrinkWeight(float w) - { - return shrink(w); - } - - /** Specifies the indicated rows'/columns' shrink weight within the columns/rows with the same shrink priority. - *

- * For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com. - * @param w The shrink weight. - * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint. - * @return this so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill(). - * @deprecated in 3.7.2. Use {@link #shrink(float, int...)} instead. - */ - public final AC shrinkWeight(float w, int... indexes) - { - return shrink(w, indexes); - } - - private void makeSize(int sz) - { - if (cList.size() <= sz) { - cList.ensureCapacity(sz); - for (int i = cList.size(); i <= sz; i++) - cList.add(new DimConstraint()); - } - } - - // ************************************************ - // Persistence Delegate and Serializable combined. - // ************************************************ - - private Object readResolve() throws ObjectStreamException - { - return LayoutUtil.getSerializedObject(this); - } - - @Override - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException - { - LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in)); - } - - @Override - public void writeExternal(ObjectOutput out) throws IOException - { - if (getClass() == AC.class) - LayoutUtil.writeAsXML(out, this); - } -} \ No newline at end of file diff --git a/src2/net/miginfocom/layout/AnimSpec.java b/src2/net/miginfocom/layout/AnimSpec.java deleted file mode 100644 index c1ece4f..0000000 --- a/src2/net/miginfocom/layout/AnimSpec.java +++ /dev/null @@ -1,107 +0,0 @@ -package net.miginfocom.layout; - -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - */ - -import java.io.Serializable; - -/** - * @author Mikael Grev, MiG InfoCom AB - * Date: 14-09-24 - * Time: 17:05 - */ -public class AnimSpec implements Serializable -{ -// public static final AnimSpec OFF = new AnimSpec(-1, 0, 0); - public static final AnimSpec DEF = new AnimSpec(0, 0, 0.2f, 0.2f); - - private final int prio; - private final int durMillis; - private final float easeIn, easeOut; - - /** - * @param prio The animation priority. When added with the general animation priority of the layout the animation will - * be done if the resulting value is > 0. - * @param durMillis Duration in milliseconds. <=0 means default value should be used and > 0 is the number of millis - * @param easeIn 0 is linear (no ease). 1 is max ease. Always clamped between these values. - * @param easeOut 0 is linear (no ease). 1 is max ease. Always clamped between these values. - */ - public AnimSpec(int prio, int durMillis, float easeIn, float easeOut) - { - this.prio = prio; - this.durMillis = durMillis; - this.easeIn = LayoutUtil.clamp(easeIn, 0, 1); - this.easeOut = LayoutUtil.clamp(easeOut, 0, 1); - } - - /** - * @return The animation priority. When added with the general animation priority of the layout the animation will - * be done if the resulting value is > 0. - */ - public int getPriority() - { - return prio; - } - - /** - * @param defMillis Default used if the millis in the spec is set to "default". - * @return Duration in milliseconds. <=0 means default value should be used and > 0 is the number of millis - */ - public int getDurationMillis(int defMillis) - { - return durMillis > 0 ? durMillis : defMillis; - } - - /** - * @return Duration in milliseconds. <= 0 means default value should be used and > 0 is the number of millis - */ - public int getDurationMillis() - { - return durMillis; - } - - /** - * @return A value between 0 and 1 where 0 is no ease in and 1 is maximum ease in. - */ - public float getEaseIn() - { - return easeIn; - } - - /** - * @return A value between 0 and 1 where 0 is no ease out and 1 is maximum ease out. - */ - public float getEaseOut() - { - return easeOut; - } -} diff --git a/src2/net/miginfocom/layout/BoundSize.java b/src2/net/miginfocom/layout/BoundSize.java deleted file mode 100644 index 5bc0948..0000000 --- a/src2/net/miginfocom/layout/BoundSize.java +++ /dev/null @@ -1,293 +0,0 @@ -package net.miginfocom.layout; - -import java.beans.Encoder; -import java.beans.Expression; -import java.beans.PersistenceDelegate; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.ObjectStreamException; -import java.io.Serializable; - -/** A size that contains minimum, preferred and maximum size of type {@link UnitValue}. - *

- * This class is a simple value container and it is immutable. - *

- * If a size is missing (i.e., null) that boundary should be considered "not in use". - *

- * You can create a BoundSize from a String with the use of {@link ConstraintParser#parseBoundSize(String, boolean, boolean)} - */ -public class BoundSize implements Serializable -{ - public static final BoundSize NULL_SIZE = new BoundSize(null, null); - public static final BoundSize ZERO_PIXEL = new BoundSize(UnitValue.ZERO, "0px"); - - private final transient UnitValue min; - private final transient UnitValue pref; - private final transient UnitValue max; - private final transient boolean gapPush; - - /** Constructor that use the same value for min/preferred/max size. - * @param minMaxPref The value to use for min/preferred/max size. - * @param createString The string used to create the BoundsSize. - */ - public BoundSize(UnitValue minMaxPref, String createString) - { - this(minMaxPref, minMaxPref, minMaxPref, createString); - } - - /** Constructor. This method is here for serialization only and should normally not be used. Use - * {@link ConstraintParser#parseBoundSize(String, boolean, boolean)} instead. - * @param min The minimum size. May be null. - * @param preferred The preferred size. May be null. - * @param max The maximum size. May be null. - * @param createString The string used to create the BoundsSize. - */ - public BoundSize(UnitValue min, UnitValue preferred, UnitValue max, String createString) // Bound to old delegate!!!!! - { - this(min, preferred, max, false, createString); - } - - /** Constructor. This method is here for serialization only and should normally not be used. Use - * {@link ConstraintParser#parseBoundSize(String, boolean, boolean)} instead. - * @param min The minimum size. May be null. - * @param preferred The preferred size. May be null. - * @param max The maximum size. May be null. - * @param gapPush If the size should be hinted as "pushing" and thus want to occupy free space if no one else is claiming it. - * @param createString The string used to create the BoundsSize. - */ - public BoundSize(UnitValue min, UnitValue preferred, UnitValue max, boolean gapPush, String createString) - { - this.min = min; - this.pref = preferred; - this.max = max; - this.gapPush = gapPush; - - LayoutUtil.putCCString(this, createString); // this escapes!! - } - - /** Returns the minimum size as sent into the constructor. - * @return The minimum size as sent into the constructor. May be null. - */ - public final UnitValue getMin() - { - return min; - } - - /** Returns the preferred size as sent into the constructor. - * @return The preferred size as sent into the constructor. May be null. - */ - public final UnitValue getPreferred() - { - return pref; - } - - /** Returns the maximum size as sent into the constructor. - * @return The maximum size as sent into the constructor. May be null. - */ - public final UnitValue getMax() - { - return max; - } - - /** If the size should be hinted as "pushing" and thus want to occupy free space if no one else is claiming it. - * @return The value. - */ - public boolean getGapPush() - { - return gapPush; - } - - /** Returns if this bound size has no min, preferred and maximum size set (they are all null) - * @return If unset. - */ - public boolean isUnset() - { - // Most common case by far is this == ZERO_PIXEL... - return this == ZERO_PIXEL || (pref == null && min == null && max == null && gapPush == false); - } - - /** Makes sure that size is within min and max of this size. - * @param size The size to constrain. - * @param refValue The reference to use for relative sizes. - * @param parent The parent container. - * @return The size, constrained within min and max. - */ - public int constrain(int size, float refValue, ContainerWrapper parent) - { - if (max != null) - size = Math.min(size, max.getPixels(refValue, parent, parent)); - if (min != null) - size = Math.max(size, min.getPixels(refValue, parent, parent)); - return size; - } - - /** Returns the minimum, preferred or maximum size for this bounded size. - * @param sizeType The type. LayoutUtil.MIN, LayoutUtil.PREF or LayoutUtil.MAX. - * @return - */ - final UnitValue getSize(int sizeType) - { - switch(sizeType) { - case LayoutUtil.MIN: - return min; - case LayoutUtil.PREF: - return pref; - case LayoutUtil.MAX: - return max; - default: - throw new IllegalArgumentException("Unknown size: " + sizeType); - } - } - - /** Convert the bound sizes to pixels. - *

- * null bound sizes will be 0 for min and preferred and {@link net.miginfocom.layout.LayoutUtil#INF} for max. - * @param refSize The reference size. - * @param parent The parent. Not null. - * @param comp The component, if applicable, can be null. - * @return An array of length three (min,pref,max). - */ - final int[] getPixelSizes(float refSize, ContainerWrapper parent, ComponentWrapper comp) - { - return new int[] { - min != null ? min.getPixels(refSize, parent, comp) : 0, - pref != null ? pref.getPixels(refSize, parent, comp) : 0, - max != null ? max.getPixels(refSize, parent, comp) : LayoutUtil.INF - }; - } - - /** Returns the a constraint string that can be re-parsed to be the exact same UnitValue. - * @return A String. Never null. - */ - String getConstraintString() - { - String cs = LayoutUtil.getCCString(this); - if (cs != null) - return cs; - - if (min == pref && pref == max) - return min != null ? (min.getConstraintString() + "!") : "null"; - - StringBuilder sb = new StringBuilder(16); - - if (min != null) - sb.append(min.getConstraintString()).append(':'); - - if (pref != null) { - if (min == null && max != null) - sb.append(":"); - sb.append(pref.getConstraintString()); - } else if (min != null) { - sb.append('n'); - } - - if (max != null) - sb.append(sb.length() == 0 ? "::" : ":").append(max.getConstraintString()); - - if (gapPush) { - if (sb.length() > 0) - sb.append(':'); - sb.append("push"); - } - - return sb.toString(); - } - - void checkNotLinked() - { - if (isLinked()) - throw new IllegalArgumentException("Size may not contain links"); - } - - boolean isLinked() - { - return min != null && min.isLinkedDeep() || pref != null && pref.isLinkedDeep() || max != null && max.isLinkedDeep(); - } - - boolean isAbsolute() - { - return (min == null || min.isAbsoluteDeep()) && (pref == null || pref.isAbsoluteDeep()) && (max == null || max.isAbsoluteDeep()); - } - - public String toString() - { - return "BoundSize{" + "min=" + min + ", pref=" + pref + ", max=" + max + ", gapPush=" + gapPush +'}'; - } - -// static { -// if(LayoutUtil.HAS_BEANS){ -// LayoutUtil.setDelegate(BoundSize.class, new PersistenceDelegate() { -// @Override -// protected Expression instantiate(Object oldInstance, Encoder out) -// { -// BoundSize bs = (BoundSize) oldInstance; -// if (Grid.TEST_GAPS) { -// return new Expression(oldInstance, BoundSize.class, "new", new Object[] { -// bs.getMin(), bs.getPreferred(), bs.getMax(), bs.getGapPush(), bs.getConstraintString() -// }); -// } else { -// return new Expression(oldInstance, BoundSize.class, "new", new Object[] { -// bs.getMin(), bs.getPreferred(), bs.getMax(), bs.getConstraintString() -// }); -// } -// } -// }); -// } -// } - - // ************************************************ - // Persistence Delegate and Serializable combined. - // ************************************************ - - private static final long serialVersionUID = 1L; - - protected Object readResolve() throws ObjectStreamException - { - return LayoutUtil.getSerializedObject(this); - } - - private void writeObject(ObjectOutputStream out) throws IOException - { -// if (getClass() == BoundSize.class) -// LayoutUtil.writeAsXML(out, this); - } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException - { -// LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in)); - } -} diff --git a/src2/net/miginfocom/layout/CC.java b/src2/net/miginfocom/layout/CC.java deleted file mode 100644 index 7206733..0000000 --- a/src2/net/miginfocom/layout/CC.java +++ /dev/null @@ -1,1881 +0,0 @@ -package net.miginfocom.layout; - -import java.io.*; -import java.util.ArrayList; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** A simple value holder for one component's constraint. - */ -public final class CC implements Externalizable -{ - private static final BoundSize DEF_GAP = BoundSize.NULL_SIZE; // Only used to denote default wrap/newline gap. - - static final String[] DOCK_SIDES = {"north", "west", "south", "east"}; - - // See the getters and setters for information about the properties below. - - private int dock = -1; - - private UnitValue[] pos = null; // [x1, y1, x2, y2] - - private UnitValue[] padding = null; // top, left, bottom, right - - private UnitValue[] visualPadding = null; // top, left, bottom, right - - private Boolean flowX = null; - - private int skip = 0; - - private int split = 1; - - private int spanX = 1, spanY = 1; - - private int cellX = -1, cellY = 0; // If cellX is -1 then cellY is also considered -1. cellY is never negative. - - private String tag = null; - - private String id = null; - - private int hideMode = -1; - - private DimConstraint hor = new DimConstraint(); - - private DimConstraint ver = new DimConstraint(); - - private BoundSize newline = null; - - private BoundSize wrap = null; - - private boolean boundsInGrid = true; - - private boolean external = false; - - private Float pushX = null, pushY = null; - - private AnimSpec animSpec = AnimSpec.DEF; - - - // ***** Tmp cache field - - private static final String[] EMPTY_ARR = new String[0]; - - private transient String[] linkTargets = null; - - /** Empty constructor. - */ - public CC() - { - } - - String[] getLinkTargets() - { - if (linkTargets == null) { - final ArrayList targets = new ArrayList(2); - - if (pos != null) { - for (int i = 0; i < pos.length ; i++) - addLinkTargetIDs(targets, pos[i]); - } - - linkTargets = targets.size() == 0 ? EMPTY_ARR : targets.toArray(new String[targets.size()]); - } - return linkTargets; - } - - private void addLinkTargetIDs(ArrayList targets, UnitValue uv) - { - if (uv != null) { - String linkId = uv.getLinkTargetId(); - if (linkId != null) { - targets.add(linkId); - } else { - for (int i = uv.getSubUnitCount() - 1; i >= 0; i--) { - UnitValue subUv = uv.getSubUnitValue(i); - if (subUv.isLinkedDeep()) - addLinkTargetIDs(targets, subUv); - } - } - } - } - - // ********************************************************** - // Chaining constraint setters - // ********************************************************** - - /** Specifies that the component should be put in the end group s and will thus share the same ending - * coordinate as them within the group. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s A name to associate on the group that should be the same for other rows/columns in the same group. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC endGroupX(String s) - { - hor.setEndGroup(s); - return this; - } - - /** Specifies that the component should be put in the size group s and will thus share the same size - * as them within the group. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s A name to associate on the group that should be the same for other rows/columns in the same group. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC sizeGroupX(String s) - { - hor.setSizeGroup(s); - return this; - } - - /** The minimum size for the component. The value will override any value that is set on the component itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The size expressed as a UnitValue. E.g. "100px" or "200mm". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC minWidth(String size) - { - hor.setSize(LayoutUtil.derive(hor.getSize(), ConstraintParser.parseUnitValue(size, true), null, null)); - return this; - } - - /** The size for the component as a min and/or preferred and/or maximum size. The value will override any value that is set on - * the component itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The size expressed as a BoundSize. E.g. "50:100px:200mm" or "100px". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC width(String size) - { - hor.setSize(ConstraintParser.parseBoundSize(size, false, true)); - return this; - } - - /** The maximum size for the component. The value will override any value that is set on the component itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The size expressed as a UnitValue. E.g. "100px" or "200mm". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC maxWidth(String size) - { - hor.setSize(LayoutUtil.derive(hor.getSize(), null, null, ConstraintParser.parseUnitValue(size, true))); - return this; - } - - - /** The horizontal gap before and/or after the component. The gap is towards cell bounds and/or other component bounds. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param before The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @param after The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC gapX(String before, String after) - { - if (before != null) - hor.setGapBefore(ConstraintParser.parseBoundSize(before, true, true)); - - if (after != null) - hor.setGapAfter(ConstraintParser.parseBoundSize(after, true, true)); - - return this; - } - - /** Same functionality as getHorizontal().setAlign(ConstraintParser.parseUnitValue(unitValue, true)) only this method - * returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param align The align keyword or for instance "100px". E.g "left", "right", "leading" or "trailing". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC alignX(String align) - { - hor.setAlign(ConstraintParser.parseUnitValueOrAlign(align, true, null)); - return this; - } - - /** The grow priority compared to other components in the same cell. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The grow priority. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC growPrioX(int p) - { - hor.setGrowPriority(p); - return this; - } - - /** Grow priority for the component horizontally and optionally vertically. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param widthHeight The new shrink weight and height. 1-2 arguments, never null. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC growPrio(int ... widthHeight) - { - switch (widthHeight.length) { - default: - throw new IllegalArgumentException("Illegal argument count: " + widthHeight.length); - case 2: - growPrioY(widthHeight[1]); - case 1: - growPrioX(widthHeight[0]); - } - return this; - } - - /** Grow weight for the component horizontally. It default to weight 100. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #growX(float) - */ - public final CC growX() - { - hor.setGrow(ResizeConstraint.WEIGHT_100); - return this; - } - - /** Grow weight for the component horizontally. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param w The new grow weight. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC growX(float w) - { - hor.setGrow(new Float(w)); - return this; - } - - /** grow weight for the component horizontally and optionally vertically. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param widthHeight The new shrink weight and height. 1-2 arguments, never null. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC grow(float ... widthHeight) - { - switch (widthHeight.length) { - default: - throw new IllegalArgumentException("Illegal argument count: " + widthHeight.length); - case 2: - growY(widthHeight[1]); - case 1: - growX(widthHeight[0]); - } - return this; - } - - /** The shrink priority compared to other components in the same cell. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The shrink priority. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC shrinkPrioX(int p) - { - hor.setShrinkPriority(p); - return this; - } - - /** Shrink priority for the component horizontally and optionally vertically. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param widthHeight The new shrink weight and height. 1-2 arguments, never null. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC shrinkPrio(int ... widthHeight) - { - switch (widthHeight.length) { - default: - throw new IllegalArgumentException("Illegal argument count: " + widthHeight.length); - case 2: - shrinkPrioY(widthHeight[1]); - case 1: - shrinkPrioX(widthHeight[0]); - } - return this; - } - - /** Shrink weight for the component horizontally. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param w The new shrink weight. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC shrinkX(float w) - { - hor.setShrink(new Float(w)); - return this; - } - - /** Shrink weight for the component horizontally and optionally vertically. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param widthHeight The new shrink weight and height. 1-2 arguments, never null. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC shrink(float ... widthHeight) - { - switch (widthHeight.length) { - default: - throw new IllegalArgumentException("Illegal argument count: " + widthHeight.length); - case 2: - shrinkY(widthHeight[1]); - case 1: - shrinkX(widthHeight[0]); - } - return this; - } - - /** The end group that this component should be placed in. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s The name of the group. If null that means no group (default) - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC endGroupY(String s) - { - ver.setEndGroup(s); - return this; - } - - /** The end group(s) that this component should be placed in. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param xy The end group for x and y respectively. 1-2 arguments, not null. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC endGroup(String ... xy) - { - switch (xy.length) { - default: - throw new IllegalArgumentException("Illegal argument count: " + xy.length); - case 2: - endGroupY(xy[1]); - case 1: - endGroupX(xy[0]); - } - return this; - } - - /** The size group that this component should be placed in. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s The name of the group. If null that means no group (default) - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC sizeGroupY(String s) - { - ver.setSizeGroup(s); - return this; - } - - /** The size group(s) that this component should be placed in. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param xy The size group for x and y respectively. 1-2 arguments, not null. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC sizeGroup(String ... xy) - { - switch (xy.length) { - default: - throw new IllegalArgumentException("Illegal argument count: " + xy.length); - case 2: - sizeGroupY(xy[1]); - case 1: - sizeGroupX(xy[0]); - } - return this; - } - - /** The minimum size for the component. The value will override any value that is set on the component itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The size expressed as a UnitValue. E.g. "100px" or "200mm". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC minHeight(String size) - { - ver.setSize(LayoutUtil.derive(ver.getSize(), ConstraintParser.parseUnitValue(size, false), null, null)); - return this; - } - - /** The size for the component as a min and/or preferred and/or maximum size. The value will override any value that is set on - * the component itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The size expressed as a BoundSize. E.g. "50:100px:200mm" or "100px". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC height(String size) - { - ver.setSize(ConstraintParser.parseBoundSize(size, false, false)); - return this; - } - - /** The maximum size for the component. The value will override any value that is set on the component itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The size expressed as a UnitValue. E.g. "100px" or "200mm". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC maxHeight(String size) - { - ver.setSize(LayoutUtil.derive(ver.getSize(), null, null, ConstraintParser.parseUnitValue(size, false))); - return this; - } - - /** The vertical gap before (normally above) and/or after (normally below) the component. The gap is towards cell bounds and/or other component bounds. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param before The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @param after The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC gapY(String before, String after) - { - if (before != null) - ver.setGapBefore(ConstraintParser.parseBoundSize(before, true, false)); - - if (after != null) - ver.setGapAfter(ConstraintParser.parseBoundSize(after, true, false)); - - return this; - } - - /** Same functionality as getVertical().setAlign(ConstraintParser.parseUnitValue(unitValue, true)) only this method - * returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param align The align keyword or for instance "100px". E.g "top" or "bottom". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC alignY(String align) - { - ver.setAlign(ConstraintParser.parseUnitValueOrAlign(align, false, null)); - return this; - } - - /** The grow priority compared to other components in the same cell. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The grow priority. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC growPrioY(int p) - { - ver.setGrowPriority(p); - return this; - } - - /** Grow weight for the component vertically. Defaults to 100. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #growY(Float) - */ - public final CC growY() - { - ver.setGrow(ResizeConstraint.WEIGHT_100); - return this; - } - - /** Grow weight for the component vertically. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param w The new grow weight. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC growY(float w) - { - ver.setGrow(w); - return this; - } - - /** Grow weight for the component vertically. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param w The new grow weight. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - @Deprecated - public final CC growY(Float w) - { - ver.setGrow(w); - return this; - } - - /** The shrink priority compared to other components in the same cell. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The shrink priority. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC shrinkPrioY(int p) - { - ver.setShrinkPriority(p); - return this; - } - - /** Shrink weight for the component horizontally. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param w The new shrink weight. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC shrinkY(float w) - { - ver.setShrink(new Float(w)); - return this; - } - - /** How this component, if hidden (not visible), should be treated. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param mode The mode. Default to the mode in the {@link net.miginfocom.layout.LC}. - * 0 == Normal. Bounds will be calculated as if the component was visible.
- * 1 == If hidden the size will be 0, 0 but the gaps remain.
- * 2 == If hidden the size will be 0, 0 and gaps set to zero.
- * 3 == If hidden the component will be disregarded completely and not take up a cell in the grid.. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC hideMode(int mode) - { - setHideMode(mode); - return this; - } - - /** The id used to reference this component in some constraints. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s The id or null. May consist of a groupID and an componentID which are separated by a dot: ".". E.g. "grp1.id1". - * The dot should never be first or last if present. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - */ - public final CC id(String s) - { - setId(s); - return this; - } - - /** Same functionality as {@link #setTag(String tag)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param tag The new tag. May be null. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setTag(String) - */ - public final CC tag(String tag) - { - setTag(tag); - return this; - } - - /** Set the cell(s) that the component should occupy in the grid. Same functionality as {@link #setCellX(int col)} and - * {@link #setCellY(int row)} together with {@link #setSpanX(int width)} and {@link #setSpanY(int height)}. This method - * returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param colRowWidthHeight cellX, cellY, spanX, spanY respectively. 1-4 arguments, not null. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setCellX(int) - * @see #setCellY(int) - * @see #setSpanX(int) - * @see #setSpanY(int) - * @since 3.7.2. Replacing cell(int, int) and cell(int, int, int, int) - */ - public final CC cell(int ... colRowWidthHeight) - { - switch (colRowWidthHeight.length) { - default: - throw new IllegalArgumentException("Illegal argument count: " + colRowWidthHeight.length); - case 4: - setSpanY(colRowWidthHeight[3]); - case 3: - setSpanX(colRowWidthHeight[2]); - case 2: - setCellY(colRowWidthHeight[1]); - case 1: - setCellX(colRowWidthHeight[0]); - } - return this; - } - - /** Same functionality as spanX(cellsX).spanY(cellsY) which means this cell will span cells in both x and y. - * This method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * Since 3.7.2 this takes an array/vararg whereas it previously only took two specific values, xSpan and ySpan. - * @param cells spanX and spanY, when present, and in that order. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setSpanY(int) - * @see #setSpanX(int) - * @see #spanY() - * @see #spanX() - * @since 3.7.2 Replaces span(int, int). - */ - public final CC span(int ... cells) - { - if (cells == null || cells.length == 0) { - setSpanX(LayoutUtil.INF); - setSpanY(1); - } else if (cells.length == 1) { - setSpanX(cells[0]); - setSpanY(1); - } else { - setSpanX(cells[0]); - setSpanY(cells[1]); - } - return this; - } - - /** Corresponds exactly to the "gap left right top bottom" keyword. - * @param args Same as for the "gap" keyword. Length 1-4, never null buf elements can be null. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC gap(String ... args) - { - switch (args.length) { - default: - throw new IllegalArgumentException("Illegal argument count: " + args.length); - case 4: - gapBottom(args[3]); - case 3: - gapTop(args[2]); - case 2: - gapRight(args[1]); - case 1: - gapLeft(args[0]); - } - return this; - } - - /** Sets the horizontal gap before the component. - *

- * Note! This is currently same as gapLeft(). This might change in 4.x. - * @param boundsSize The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC gapBefore(String boundsSize) - { - hor.setGapBefore(ConstraintParser.parseBoundSize(boundsSize, true, true)); - return this; - } - - /** Sets the horizontal gap after the component. - *

- * Note! This is currently same as gapRight(). This might change in 4.x. - * @param boundsSize The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC gapAfter(String boundsSize) - { - hor.setGapAfter(ConstraintParser.parseBoundSize(boundsSize, true, true)); - return this; - } - - /** Sets the gap above the component. - * @param boundsSize The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC gapTop(String boundsSize) - { - ver.setGapBefore(ConstraintParser.parseBoundSize(boundsSize, true, false)); - return this; - } - - /** Sets the gap to the left the component. - * @param boundsSize The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC gapLeft(String boundsSize) - { - hor.setGapBefore(ConstraintParser.parseBoundSize(boundsSize, true, true)); - return this; - } - - /** Sets the gap below the component. - * @param boundsSize The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC gapBottom(String boundsSize) - { - ver.setGapAfter(ConstraintParser.parseBoundSize(boundsSize, true, false)); - return this; - } - - /** Sets the gap to the right of the component. - * @param boundsSize The size of the gap expressed as a BoundSize. E.g. "50:100px:200mm" or "100px!". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final CC gapRight(String boundsSize) - { - hor.setGapAfter(ConstraintParser.parseBoundSize(boundsSize, true, true)); - return this; - } - - /** Same functionality as calling {@link #setSpanY(int)} with LayoutUtil.INF which means this cell will span the rest of the column. - * This method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setSpanY(int) - * @see #spanY() - */ - public final CC spanY() - { - return spanY(LayoutUtil.INF); - } - - /** Same functionality as {@link #setSpanY(int)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param cells The number of cells to span (i.e. merge). - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setSpanY(int) - */ - public final CC spanY(int cells) - { - setSpanY(cells); - return this; - } - - /** Same functionality as {@link #setSpanX(int)} which means this cell will span the rest of the row. - * This method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setSpanX(int) - * @see #spanX() - */ - public final CC spanX() - { - return spanX(LayoutUtil.INF); - } - - /** Same functionality as {@link #setSpanX(int)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param cells The number of cells to span (i.e. merge). - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setSpanY(int) - */ - public final CC spanX(int cells) - { - setSpanX(cells); - return this; - } - - /** Same functionality as pushX().pushY() which means this cell will push in both x and y dimensions. - * This method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setPushX(Float) - * @see #setPushX(Float) - * @see #pushY() - * @see #pushX() - */ - public final CC push() - { - return pushX().pushY(); - } - - /** Same functionality as pushX(weightX).pushY(weightY) which means this cell will push in both x and y dimensions. - * This method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param weightX The weight used in the push. - * @param weightY The weight used in the push. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setPushY(Float) - * @see #setPushX(Float) - * @see #pushY() - * @see #pushX() - */ - public final CC push(Float weightX, Float weightY) - { - return pushX(weightX).pushY(weightY); - } - - /** Same functionality as {@link #setPushY(Float)} which means this cell will push the rest of the column. - * This method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setPushY(Float) - */ - public final CC pushY() - { - return pushY(ResizeConstraint.WEIGHT_100); - } - - /** Same functionality as {@link #setPushY(Float weight)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param weight The weight used in the push. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setPushY(Float) - */ - public final CC pushY(Float weight) - { - setPushY(weight); - return this; - } - - /** Same functionality as {@link #setPushX(Float)} which means this cell will push the rest of the row. - * This method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setPushX(Float) - */ - public final CC pushX() - { - return pushX(ResizeConstraint.WEIGHT_100); - } - - /** Same functionality as {@link #setPushX(Float weight)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param weight The weight used in the push. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setPushY(Float) - */ - public final CC pushX(Float weight) - { - setPushX(weight); - return this; - } - - /** Same functionality as {@link #setSplit(int parts)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param parts The number of parts (i.e. component slots) the cell should be divided into. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setSplit(int) - */ - public final CC split(int parts) - { - setSplit(parts); - return this; - } - - /** Same functionality as split(LayoutUtil.INF), which means split until one of the keywords that breaks the split is found for - * a component after this one (e.g. wrap, newline and skip). - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setSplit(int) - * @since 3.7.2 - */ - public final CC split() - { - setSplit(LayoutUtil.INF); - return this; - } - - /** Same functionality as {@link #setSkip(int)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param cells How many cells in the grid that should be skipped before the component that this constraint belongs to - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setSkip(int) - */ - public final CC skip(int cells) - { - setSkip(cells); - return this; - } - - /** Same functionality as skip(1). - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setSkip(int) - * @since 3.7.2 - */ - public final CC skip() - { - setSkip(1); - return this; - } - - /** Same functionality as calling {@link #setExternal(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setExternal(boolean) - */ - public final CC external() - { - setExternal(true); - return this; - } - - /** Same functionality as calling {@link #setFlowX(Boolean)} with Boolean.TRUE only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setFlowX(Boolean) - */ - public final CC flowX() - { - setFlowX(Boolean.TRUE); - return this; - } - - /** Same functionality as calling {@link #setFlowX(Boolean)} with Boolean.FALSE only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setFlowX(Boolean) - */ - public final CC flowY() - { - setFlowX(Boolean.FALSE); - return this; - } - - - /** Same functionality as {@link #growX()} and {@link #growY()}. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #growX() - * @see #growY() - */ - public final CC grow() - { - growX(); - growY(); - return this; - } - - /** Same functionality as calling {@link #setNewline(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setNewline(boolean) - */ - public final CC newline() - { - setNewline(true); - return this; - } - - /** Same functionality as {@link #setNewlineGapSize(BoundSize)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param gapSize The gap size that will override the gap size in the row/column constraints if != null. E.g. "5px" or "unrel". - * If null or "" the newline size will be set to the default size and turned on. This is different compared to - * {@link #setNewlineGapSize(BoundSize)}. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setNewlineGapSize(BoundSize) - */ - public final CC newline(String gapSize) - { - BoundSize bs = ConstraintParser.parseBoundSize(gapSize, true, (flowX != null && flowX == false)); - if (bs != null) { - setNewlineGapSize(bs); - } else { - setNewline(true); - } - return this; - } - - /** Same functionality as calling {@link #setWrap(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setWrap(boolean) - */ - public final CC wrap() - { - setWrap(true); - return this; - } - - /** Same functionality as {@link #setWrapGapSize(BoundSize)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param gapSize The gap size that will override the gap size in the row/column constraints if != null. E.g. "5px" or "unrel". - * If null or "" the wrap size will be set to the default size and turned on. This is different compared to - * {@link #setWrapGapSize(BoundSize)}. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setWrapGapSize(BoundSize) - */ - public final CC wrap(String gapSize) - { - BoundSize bs = ConstraintParser.parseBoundSize(gapSize, true, (flowX != null && flowX == false)); - if (bs != null) { - setWrapGapSize(bs); - } else { - setWrap(true); - } - return this; - } - - /** Same functionality as calling {@link #setDockSide(int)} with 0 only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setDockSide(int) - */ - public final CC dockNorth() - { - setDockSide(0); - return this; - } - - /** Same functionality as calling {@link #setDockSide(int)} with 1 only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setDockSide(int) - */ - public final CC dockWest() - { - setDockSide(1); - return this; - } - - /** Same functionality as calling {@link #setDockSide(int)} with 2 only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setDockSide(int) - */ - public final CC dockSouth() - { - setDockSide(2); - return this; - } - - /** Same functionality as calling {@link #setDockSide(int)} with 3 only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setDockSide(int) - */ - public final CC dockEast() - { - setDockSide(3); - return this; - } - - /** Sets the x-coordinate for the component. This is used to set the x coordinate position to a specific value. The component - * bounds is still precalculated to the grid cell and this method should be seen as a way to correct the x position. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param x The x position as a UnitValue. E.g. "10" or "40mm" or "container.x+10". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setPos(UnitValue[]) - * @see #setBoundsInGrid(boolean) - */ - public final CC x(String x) - { - return corrPos(x, 0); - } - - /** Sets the y-coordinate for the component. This is used to set the y coordinate position to a specific value. The component - * bounds is still precalculated to the grid cell and this method should be seen as a way to correct the y position. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param y The y position as a UnitValue. E.g. "10" or "40mm" or "container.x+10". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setPos(UnitValue[]) - * @see #setBoundsInGrid(boolean) - */ - public final CC y(String y) - { - return corrPos(y, 1); - } - - /** Sets the x2-coordinate for the component (right side). This is used to set the x2 coordinate position to a specific value. The component - * bounds is still precalculated to the grid cell and this method should be seen as a way to correct the x position. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param x2 The x2 side's position as a UnitValue. E.g. "10" or "40mm" or "container.x2 - 10". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setPos(UnitValue[]) - * @see #setBoundsInGrid(boolean) - */ - public final CC x2(String x2) - { - return corrPos(x2, 2); - } - - /** Sets the y2-coordinate for the component (bottom side). This is used to set the y2 coordinate position to a specific value. The component - * bounds is still precalculated to the grid cell and this method should be seen as a way to correct the y position. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param y2 The y2 side's position as a UnitValue. E.g. "10" or "40mm" or "container.x2 - 10". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setPos(UnitValue[]) - * @see #setBoundsInGrid(boolean) - */ - public final CC y2(String y2) - { - return corrPos(y2, 3); - } - - private final CC corrPos(String uv, int ix) - { - UnitValue[] b = getPos(); - if (b == null) - b = new UnitValue[4]; - - b[ix] = ConstraintParser.parseUnitValue(uv, (ix % 2 == 0)); - setPos(b); - - setBoundsInGrid(true); - return this; - } - - /** Same functionality as {@link #x(String x)} and {@link #y(String y)} together. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param x The x position as a UnitValue. E.g. "10" or "40mm" or "container.x+10". - * @param y The y position as a UnitValue. E.g. "10" or "40mm" or "container.x+10". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setPos(UnitValue[]) - */ - public final CC pos(String x, String y) - { - UnitValue[] b = getPos(); - if (b == null) - b = new UnitValue[4]; - - b[0] = ConstraintParser.parseUnitValue(x, true); - b[1] = ConstraintParser.parseUnitValue(y, false); - setPos(b); - - setBoundsInGrid(false); - return this; - } - - /** Same functionality as {@link #x(String x)}, {@link #y(String y)}, {@link #y2(String y)} and {@link #y2(String y)} together. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param x The x position as a UnitValue. E.g. "10" or "40mm" or "container.x+10". - * @param y The y position as a UnitValue. E.g. "10" or "40mm" or "container.x+10". - * @param x2 The x2 side's position as a UnitValue. E.g. "10" or "40mm" or "container.x2 - 10". - * @param y2 The y2 side's position as a UnitValue. E.g. "10" or "40mm" or "container.x2 - 10". - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setPos(UnitValue[]) - */ - public final CC pos(String x, String y, String x2, String y2) - { - setPos(new UnitValue[] { - ConstraintParser.parseUnitValue(x, true), - ConstraintParser.parseUnitValue(y, false), - ConstraintParser.parseUnitValue(x2, true), - ConstraintParser.parseUnitValue(y2, false), - }); - setBoundsInGrid(false); - return this; - } - - /** Same functionality as {@link #setPadding(UnitValue[])} but the unit values as absolute pixels. This method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param top The top padding that will be added to the y coordinate at the last stage in the layout. - * @param left The top padding that will be added to the x coordinate at the last stage in the layout. - * @param bottom The top padding that will be added to the y2 coordinate at the last stage in the layout. - * @param right The top padding that will be added to the x2 coordinate at the last stage in the layout. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setTag(String) - */ - public final CC pad(int top, int left, int bottom, int right) - { - setPadding(new UnitValue[] { - new UnitValue(top), new UnitValue(left), new UnitValue(bottom), new UnitValue(right) - }); - return this; - } - - /** Same functionality as setPadding(ConstraintParser.parseInsets(pad, false))} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param pad The string to parse. E.g. "10 10 10 10" or "20". If less than 4 groups the last will be used for the missing. - * @return this so it is possible to chain calls. E.g. new ComponentConstraint().noGrid().gap().fill(). - * @see #setTag(String) - */ - public final CC pad(String pad) - { - setPadding(pad != null ? ConstraintParser.parseInsets(pad, false) : null); - return this; - } - - // ********************************************************** - // Bean properties - // ********************************************************** - - /** Returns the horizontal dimension constraint for this component constraint. It has constraints for the horizontal size - * and grow/shrink priorities and weights. - *

- * Note! If any changes is to be made it must be made direct when the object is returned. It is not allowed to save the - * constraint for later use. - * @return The current dimension constraint. Never null. - */ - public DimConstraint getHorizontal() - { - return hor; - } - - /** Sets the horizontal dimension constraint for this component constraint. It has constraints for the horizontal size - * and grow/shrink priorities and weights. - * @param h The new dimension constraint. If null it will be reset to new DimConstraint(); - */ - public void setHorizontal(DimConstraint h) - { - hor = h != null ? h : new DimConstraint(); - } - - /** Returns the vertical dimension constraint for this component constraint. It has constraints for the vertical size - * and grow/shrink priorities and weights. - *

- * Note! If any changes is to be made it must be made direct when the object is returned. It is not allowed to save the - * constraint for later use. - * @return The current dimension constraint. Never null. - */ - public DimConstraint getVertical() - { - return ver; - } - - /** Sets the vertical dimension constraint for this component constraint. It has constraints for the vertical size - * and grow/shrink priorities and weights. - * @param v The new dimension constraint. If null it will be reset to new DimConstraint(); - */ - public void setVertical(DimConstraint v) - { - ver = v != null ? v : new DimConstraint(); - } - - /** Returns the vertical or horizontal dim constraint. - *

- * Note! If any changes is to be made it must be made direct when the object is returned. It is not allowed to save the - * constraint for later use. - * @param isHor If the horizontal constraint should be returned. - * @return The dim constraint. Never null. - */ - public DimConstraint getDimConstraint(boolean isHor) - { - return isHor ? hor : ver; - } - - /** Returns the absolute positioning of one or more of the edges. This will be applied last in the layout cycle and will not - * affect the flow or grid positions. The positioning is relative to the parent and can not (as padding) be used - * to adjust the edges relative to the old value. May be null and elements may be null. - * null value(s) for the x2 and y2 will be interpreted as to keep the preferred size and thus the x1 - * and x2 will just absolutely positions the component. - *

- * Note that {@link #setBoundsInGrid(boolean)} changes the interpretation of this property slightly. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value as a new array, free to modify. - */ - public UnitValue[] getPos() - { - return pos != null ? new UnitValue[] {pos[0], pos[1], pos[2], pos[3]} : null; - } - - /** Sets absolute positioning of one or more of the edges. This will be applied last in the layout cycle and will not - * affect the flow or grid positions. The positioning is relative to the parent and can not (as padding) be used - * to adjust the edges relative to the old value. May be null and elements may be null. - * null value(s) for the x2 and y2 will be interpreted as to keep the preferred size and thus the x1 - * and x2 will just absolutely positions the component. - *

- * Note that {@link #setBoundsInGrid(boolean)} changes the interpretation of this property slightly. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param pos UnitValue[] {x, y, x2, y2}. Must be null or of length 4. Elements can be null. - */ - public void setPos(UnitValue[] pos) - { - this.pos = pos != null ? new UnitValue[] {pos[0], pos[1], pos[2], pos[3]} : null; - linkTargets = null; - } - - /** Returns if the absolute pos value should be corrections to the component that is in a normal cell. If false - * the value of pos is truly absolute in that it will not affect the grid or have a default bounds in the grid. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - * @see #getPos() - */ - public boolean isBoundsInGrid() - { - return boundsInGrid; - } - - /** Sets if the absolute pos value should be corrections to the component that is in a normal cell. If false - * the value of pos is truly absolute in that it will not affect the grid or have a default bounds in the grid. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param b true for bounds taken from the grid position. false is default. - * @see #setPos(UnitValue[]) - */ - void setBoundsInGrid(boolean b) - { - this.boundsInGrid = b; - } - - /** Returns the absolute cell position in the grid or -1 if cell positioning is not used. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public int getCellX() - { - return cellX; - } - - /** Set an absolute cell x-position in the grid. If >= 0 this point points to the absolute cell that this constaint's component should occupy. - * If there's already a component in that cell they will split the cell. The flow will then continue after this cell. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param x The x-position or -1 to disable cell positioning. - */ - public void setCellX(int x) - { - cellX = x; - } - - /** Returns the absolute cell position in the grid or -1 if cell positioning is not used. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public int getCellY() - { - return cellX < 0 ? -1 : cellY; - } - - /** Set an absolute cell x-position in the grid. If >= 0 this point points to the absolute cell that this constaint's component should occupy. - * If there's already a component in that cell they will split the cell. The flow will then continue after this cell. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param y The y-position or -1 to disable cell positioning. - */ - public void setCellY(int y) - { - if (y < 0) - cellX = -1; - cellY = y < 0 ? 0 : y; - } - - /** Sets the docking side. -1 means no docking.
- * Valid sides are: north = 0, west = 1, south = 2, east = 3. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current side. - */ - public int getDockSide() - { - return dock; - } - - /** Sets the docking side. -1 means no docking.
- * Valid sides are: north = 0, west = 1, south = 2, east = 3. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param side -1 or 0-3. - */ - public void setDockSide(int side) - { - if (side < -1 || side > 3) - throw new IllegalArgumentException("Illegal dock side: " + side); - dock = side; - } - - /** Returns if this component should have its bounds handled by an external source and not this layout manager. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public boolean isExternal() - { - return external; - } - - /** If this boolean is true this component is not handled in any way by the layout manager and the component can have its bounds set by an external - * handler which is normally by the use of some component.setBounds(x, y, width, height) directly (for Swing). - *

- * The bounds will not affect the minimum and preferred size of the container. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param b true means that the bounds are not changed. - */ - public void setExternal(boolean b) - { - this.external = b; - } - - /** Returns if the flow in the cell is in the horizontal dimension. Vertical if false. Only the first - * component is a cell can set the flow. - *

- * If null the flow direction is inherited by from the {@link net.miginfocom.layout.LC}. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public Boolean getFlowX() - { - return flowX; - } - - /** Sets if the flow in the cell is in the horizontal dimension. Vertical if false. Only the first - * component is a cell can set the flow. - *

- * If null the flow direction is inherited by from the {@link net.miginfocom.layout.LC}. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param b Boolean.TRUE means horizontal flow in the cell. - */ - public void setFlowX(Boolean b) - { - this.flowX = b; - } - - /** Sets how a component that is hidden (not visible) should be treated by default. - * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The mode:
- * 0 == Normal. Bounds will be calculated as if the component was visible.
- * 1 == If hidden the size will be 0, 0 but the gaps remain.
- * 2 == If hidden the size will be 0, 0 and gaps set to zero.
- * 3 == If hidden the component will be disregarded completely and not take up a cell in the grid.. - */ - public int getHideMode() - { - return hideMode; - } - - /** Sets how a component that is hidden (not visible) should be treated by default. - * @param mode The mode:
- * 0 == Normal. Bounds will be calculated as if the component was visible.
- * 1 == If hidden the size will be 0, 0 but the gaps remain.
- * 2 == If hidden the size will be 0, 0 and gaps set to zero.
- * 3 == If hidden the component will be disregarded completely and not take up a cell in the grid.. - */ - public void setHideMode(int mode) - { - if (mode < -1 || mode > 3) - throw new IllegalArgumentException("Wrong hideMode: " + mode); - - hideMode = mode; - } - - /** Returns the id used to reference this component in some constraints. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The id or null. May consist of a groupID and an componentID which are separated by a dot: ".". E.g. "grp1.id1". - * The dot should never be first or last if present. - */ - public String getId() - { - return id; - } - - /** Sets the id used to reference this component in some constraints. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param id The id or null. May consist of a groupID and an componentID which are separated by a dot: ".". E.g. "grp1.id1". - * The dot should never be first or last if present. - */ - public void setId(String id) - { - this.id = id; - } - - /** Returns the absolute resizing in the last stage of the layout cycle. May be null and elements may be null. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. null or of length 4. - */ - public UnitValue[] getPadding() - { - return padding != null ? new UnitValue[] {padding[0], padding[1], padding[2], padding[3]} : null; - } - - /** Sets the absolute resizing in the last stage of the layout cycle. These values are added to the edges and can thus for - * instance be used to grow or reduce the size or move the component an absolute number of pixels. May be null - * and elements may be null. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param sides top, left, bottom right. Must be null or of length 4. - */ - public void setPadding(UnitValue[] sides) - { - this.padding = sides != null ? new UnitValue[] {sides[0], sides[1], sides[2], sides[3]} : null; - } - - /** Returns the visual padding used when laying out this Component. May be null and elements may be null. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. null or of length 4. - */ - public UnitValue[] getVisualPadding() - { - return visualPadding != null ? new UnitValue[] {visualPadding[0], visualPadding[1], visualPadding[2], visualPadding[3]} : null; - } - - /** Sets the visual padding used when laying out this Component. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param sides top, left, bottom right. Must be null or of length 4. - */ - public void setVisualPadding(UnitValue[] sides) - { - this.visualPadding = sides != null ? new UnitValue[] {sides[0], sides[1], sides[2], sides[3]} : null; - } - - /** Returns how many cells in the grid that should be skipped before the component that this constraint belongs to. - *

- * Note that only the first component will be checked for this property. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. 0 if no skip. - */ - public int getSkip() - { - return skip; - } - - /** Sets how many cells in the grid that should be skipped before the component that this constraint belongs to. - *

- * Note that only the first component will be checked for this property. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param cells How many cells in the grid that should be skipped before the component that this constraint belongs to - */ - public void setSkip(int cells) - { - this.skip = cells; - } - - /** Returns the number of cells the cell that this constraint's component will span in the indicated dimension. 1 is default and - * means that it only spans the current cell. LayoutUtil.INF is used to indicate a span to the end of the column/row. - *

- * Note that only the first component will be checked for this property. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public int getSpanX() - { - return spanX; - } - - /** Sets the number of cells the cell that this constraint's component will span in the indicated dimension. 1 is default and - * means that it only spans the current cell. LayoutUtil.INF is used to indicate a span to the end of the column/row. - *

- * Note that only the first component will be checked for this property. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param cells The number of cells to span (i.e. merge). - */ - public void setSpanX(int cells) - { - this.spanX = cells; - } - - /** Returns the number of cells the cell that this constraint's component will span in the indicated dimension. 1 is default and - * means that it only spans the current cell. LayoutUtil.INF is used to indicate a span to the end of the column/row. - *

- * Note that only the first component will be checked for this property. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public int getSpanY() - { - return spanY; - } - - /** Sets the number of cells the cell that this constraint's component will span in the indicated dimension. 1 is default and - * means that it only spans the current cell. LayoutUtil.INF is used to indicate a span to the end of the column/row. - *

- * Note that only the first component will be checked for this property. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param cells The number of cells to span (i.e. merge). - */ - public void setSpanY(int cells) - { - this.spanY = cells; - } - - /** "pushx" indicates that the column that this component is in (this first if the component spans) should default to growing. - * If any other column has been set to grow this push value on the component does nothing as the column's explicit grow weight - * will take precedence. Push is normally used when the grid has not been defined in the layout. - *

- * If multiple components in a column has push weights set the largest one will be used for the column. - * @return The current push value. Default is null. - */ - public Float getPushX() - { - return pushX; - } - - /** "pushx" indicates that the column that this component is in (this first if the component spans) should default to growing. - * If any other column has been set to grow this push value on the component does nothing as the column's explicit grow weight - * will take precedence. Push is normally used when the grid has not been defined in the layout. - *

- * If multiple components in a column has push weights set the largest one will be used for the column. - * @param weight The new push value. Default is null. - */ - public void setPushX(Float weight) - { - this.pushX = weight; - } - - /** "pushx" indicates that the row that this component is in (this first if the component spans) should default to growing. - * If any other row has been set to grow this push value on the component does nothing as the row's explicit grow weight - * will take precedence. Push is normally used when the grid has not been defined in the layout. - *

- * If multiple components in a row has push weights set the largest one will be used for the row. - * @return The current push value. Default is null. - */ - public Float getPushY() - { - return pushY; - } - - /** "pushx" indicates that the row that this component is in (this first if the component spans) should default to growing. - * If any other row has been set to grow this push value on the component does nothing as the row's explicit grow weight - * will take precedence. Push is normally used when the grid has not been defined in the layout. - *

- * If multiple components in a row has push weights set the largest one will be used for the row. - * @param weight The new push value. Default is null. - */ - public void setPushY(Float weight) - { - this.pushY = weight; - } - - /** Returns in how many parts the current cell (that this constraint's component will be in) should be split in. If for instance - * it is split in two, the next component will also share the same cell. Note that the cell can also span a number of - * cells, which means that you can for instance span three cells and split that big cell for two components. Split can be - * set to a very high value to make all components in the same row/column share the same cell (e.g. LayoutUtil.INF). - *

- * Note that only the first component will be checked for this property. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public int getSplit() - { - return split; - } - - /** Sets in how many parts the current cell (that this constraint's component will be in) should be split in. If for instance - * it is split in two, the next component will also share the same cell. Note that the cell can also span a number of - * cells, which means that you can for instance span three cells and split that big cell for two components. Split can be - * set to a very high value to make all components in the same row/column share the same cell (e.g. LayoutUtil.INF). - *

- * Note that only the first component will be checked for this property. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param parts The number of parts (i.e. component slots) the cell should be divided into. - */ - public void setSplit(int parts) - { - this.split = parts; - } - - /** Tags the component with metadata. Currently only used to tag buttons with for instance "cancel" or "ok" to make them - * show up in the correct order depending on platform. See {@link PlatformDefaults#setButtonOrder(String)} for information. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. May be null. - */ - public String getTag() - { - return tag; - } - - /** Optional tag that gives more context to this constraint's component. It is for instance used to tag buttons in a - * button bar with the button type such as "ok", "help" or "cancel". - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param tag The new tag. May be null. - */ - public void setTag(String tag) - { - this.tag = tag; - } - - /** Returns if the flow should wrap to the next line/column after the component that this constraint belongs to. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public boolean isWrap() - { - return wrap != null; - } - - /** Sets if the flow should wrap to the next line/column after the component that this constraint belongs to. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param b true means wrap after. - */ - public void setWrap(boolean b) - { - wrap = b ? (wrap == null ? DEF_GAP : wrap) : null; - } - - /** Returns the wrap size if it is a custom size. If wrap was set to true with {@link #setWrap(boolean)} then this method will - * return null since that means that the gap size should be the default one as defined in the rows spec. - * @return The custom gap size. NOTE! Will return null for both no wrap and default wrap. - * @see #isWrap() - * @see #setWrap(boolean) - * @since 2.4.2 - */ - public BoundSize getWrapGapSize() - { - return wrap == DEF_GAP ? null : wrap; - } - - /** Set the wrap size and turns wrap on if != null. - * @param s The custom gap size. NOTE! null will not turn on or off wrap, it will only set the wrap gap size to "default". - * A non-null value will turn on wrap though. - * @see #isWrap() - * @see #setWrap(boolean) - * @since 2.4.2 - */ - public void setWrapGapSize(BoundSize s) - { - wrap = s == null ? (wrap != null ? DEF_GAP : null) : s; - } - - /** Returns if the flow should wrap to the next line/column before the component that this constraint belongs to. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current value. - */ - public boolean isNewline() - { - return newline != null; - } - - /** Sets if the flow should wrap to the next line/column before the component that this constraint belongs to. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param b true means wrap before. - */ - public void setNewline(boolean b) - { - newline = b ? (newline == null ? DEF_GAP : newline) : null; - } - - /** Returns the newline size if it is a custom size. If newline was set to true with {@link #setNewline(boolean)} then this method will - * return null since that means that the gap size should be the default one as defined in the rows spec. - * @return The custom gap size. NOTE! Will return null for both no newline and default newline. - * @see #isNewline() - * @see #setNewline(boolean) - * @since 2.4.2 - */ - public BoundSize getNewlineGapSize() - { - return newline == DEF_GAP ? null : newline; - } - - /** Set the newline size and turns newline on if != null. - * @param s The custom gap size. NOTE! null will not turn on or off newline, it will only set the newline gap size to "default". - * A non-null value will turn on newline though. - * @see #isNewline() - * @see #setNewline(boolean) - * @since 2.4.2 - */ - public void setNewlineGapSize(BoundSize s) - { - newline = s == null ? (newline != null ? DEF_GAP : null) : s; - } - - /** Returns the animation spec. Default is a spec where animation is off (prio 0). - * @return Never null. - */ - public AnimSpec getAnimSpec() - { - return animSpec; - } - - - // ************************************************ - // Persistence Delegate and Serializable combined. - // ************************************************ - - private Object readResolve() throws ObjectStreamException - { - return LayoutUtil.getSerializedObject(this); - } - - @Override - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException - { - LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in)); - } - - @Override - public void writeExternal(ObjectOutput out) throws IOException - { - if (getClass() == CC.class) - LayoutUtil.writeAsXML(out, this); - } -} \ No newline at end of file diff --git a/src2/net/miginfocom/layout/ComponentWrapper.java b/src2/net/miginfocom/layout/ComponentWrapper.java deleted file mode 100644 index 7a97297..0000000 --- a/src2/net/miginfocom/layout/ComponentWrapper.java +++ /dev/null @@ -1,305 +0,0 @@ -package net.miginfocom.layout; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** A class that wraps the important parts of a Component. - *

- * NOTE!.equals() and .hashcode() should be forwarded to the wrapped component. E.g. - *

- * 	public int hashCode()
-	{
-		return getComponent().hashCode();
-	}
-
-	public final boolean equals(Object o)
-	{
-		 if (o instanceof ComponentWrapper == false)
-			 return false;
-
-		 return getComponent().equals(((ComponentWrapper) o).getComponent());
-	}
- * 
- */ -public interface ComponentWrapper -{ - static final int TYPE_UNSET = -1; - public static final int TYPE_UNKNOWN = 0; - public static final int TYPE_CONTAINER = 1; - public static final int TYPE_LABEL = 2; - public static final int TYPE_TEXT_FIELD = 3; - public static final int TYPE_TEXT_AREA = 4; - public static final int TYPE_BUTTON = 5; - public static final int TYPE_LIST = 6; - public static final int TYPE_TABLE = 7; - public static final int TYPE_SCROLL_PANE = 8; - public static final int TYPE_IMAGE = 9; - public static final int TYPE_PANEL = 10; - public static final int TYPE_COMBO_BOX = 11; - public static final int TYPE_SLIDER = 12; - public static final int TYPE_SPINNER = 13; - public static final int TYPE_PROGRESS_BAR = 14; - public static final int TYPE_TREE = 15; - public static final int TYPE_CHECK_BOX = 16; - public static final int TYPE_SCROLL_BAR = 17; - public static final int TYPE_SEPARATOR = 18; - public static final int TYPE_TABBED_PANE = 19; - - /** Returns the actual object that this wrapper is aggregating. This might be needed for getting - * information about the object that the wrapper interface does not provide. - *

- * If this is a container the container should be returned instead. - * @return The actual object that this wrapper is aggregating. Not null. - */ - public abstract Object getComponent(); - - /** Returns the current x coordinate for this component. - * @return The current x coordinate for this component. - */ - public abstract int getX(); - - /** Returns the current y coordinate for this component. - * @return The current y coordinate for this component. - */ - public abstract int getY(); - - /** Returns the current width for this component. - * @return The current width for this component. - */ - public abstract int getWidth(); - - /** Returns the current height for this component. - * @return The current height for this component. - */ - public abstract int getHeight(); - - /** Returns the screen x-coordinate for the upper left coordinate of the component layout-able bounds. - * @return The screen x-coordinate for the upper left coordinate of the component layout-able bounds. - */ - public abstract int getScreenLocationX(); - - /** Returns the screen y-coordinate for the upper left coordinate of the component layout-able bounds. - * @return The screen y-coordinate for the upper left coordinate of the component layout-able bounds. - */ - public abstract int getScreenLocationY(); - - /** Returns the minimum width of the component. - * @param hHint The Size hint for the other dimension. An implementation can use this value or the - * current size for the widget in this dimension, or a combination of both, to calculate the correct size.
- * Use -1 to denote that there is no hint. This corresponds with SWT.DEFAULT. - * @return The minimum width of the component. - * @since 3.5. Added the hint as a parameter knowing that a correction and recompilation is necessary for - * any implementing classes. This change was worth it though. - */ - public abstract int getMinimumWidth(int hHint); - - /** Returns the minimum height of the component. - * @param wHint The Size hint for the other dimension. An implementation can use this value or the - * current size for the widget in this dimension, or a combination of both, to calculate the correct size.
- * Use -1 to denote that there is no hint. This corresponds with SWT.DEFAULT. - * @return The minimum height of the component. - * @since 3.5. Added the hint as a parameter knowing that a correction and recompilation is necessary for - * any implementing classes. This change was worth it though. - */ - public abstract int getMinimumHeight(int wHint); - - /** Returns the preferred width of the component. - * @param hHint The Size hint for the other dimension. An implementation can use this value or the - * current size for the widget in this dimension, or a combination of both, to calculate the correct size.
- * Use -1 to denote that there is no hint. This corresponds with SWT.DEFAULT. - * @return The preferred width of the component. - * @since 3.5. Added the hint as a parameter knowing that a correction and recompilation is necessary for - * any implementing classes. This change was worth it though. - */ - public abstract int getPreferredWidth(int hHint); - - /** Returns the preferred height of the component. - * @param wHint The Size hint for the other dimension. An implementation can use this value or the - * current size for the widget in this dimension, or a combination of both, to calculate the correct size.
- * Use -1 to denote that there is no hint. This corresponds with SWT.DEFAULT. - * @return The preferred height of the component. - * @since 3.5. Added the hint as a parameter knowing that a correction and recompilation is necessary for - * any implementing classes. This change was worth it though. - */ - public abstract int getPreferredHeight(int wHint); - - /** Returns the maximum width of the component. - * @param hHint The Size hint for the other dimension. An implementation can use this value or the - * current size for the widget in this dimension, or a combination of both, to calculate the correct size.
- * Use -1 to denote that there is no hint. This corresponds with SWT.DEFAULT. - * @return The maximum width of the component. - * @since 3.5. Added the hint as a parameter knowing that a correction and recompilation is necessary for - * any implementing classes. This change was worth it though. - */ - public abstract int getMaximumWidth(int hHint); - - /** Returns the maximum height of the component. - * @param wHint The Size hint for the other dimension. An implementation can use this value or the - * current size for the widget in this dimension, or a combination of both, to calculate the correct size.
- * Use -1 to denote that there is no hint. This corresponds with SWT.DEFAULT. - * @return The maximum height of the component. - * @since 3.5. Added the hint as a parameter knowing that a correction and recompilation is necessary for - * any implementing classes. This change was worth it though. - */ - public abstract int getMaximumHeight(int wHint); - - /** Sets the component's bounds. - * @param x The x coordinate. - * @param y The y coordinate. - * @param width The width. - * @param height The height. - */ - public abstract void setBounds(int x, int y, int width, int height); - - /** Returns if the component's visibility is set to true. This should not return if the component is - * actually visible, but if the visibility is set to true or not. - * @return true means visible. - */ - public abstract boolean isVisible(); - - /** Returns the baseline for the component given the suggested height. - * @param width The width to calculate for if other than the current. If -1 the current size should be used. - * @param height The height to calculate for if other than the current. If -1 the current size should be used. - * @return The baseline from the top or -1 if not applicable. - */ - public abstract int getBaseline(int width, int height); - - /** Returns if the component has a baseline and if it can be retrieved. Should for instance return - * false for Swing before mustang. - * @return If the component has a baseline and if it can be retrieved. - */ - public abstract boolean hasBaseline(); - - /** Returns the container for this component. - * @return The container for this component. Will return null if the component has no parent. - */ - public abstract ContainerWrapper getParent(); - - /** Returns the pixel unit factor for the horizontal or vertical dimension. - *

- * The factor is 1 for both dimensions on the normal font in a JPanel on Windows. The factor should increase with a bigger "X". - *

- * This is the Swing version: - *

-	 * Rectangle2D r = fm.getStringBounds("X", parent.getGraphics());
-	 * wFactor = r.getWidth() / 6;
-	 * hFactor = r.getHeight() / 13.27734375f;
-	 * 
- * @param isHor If it is the horizontal factor that should be returned. - * @return The factor. - */ - public abstract float getPixelUnitFactor(boolean isHor); - - /** Returns the DPI (Dots Per Inch) of the screen the component is currently in or for the default - * screen if the component is not visible. - *

- * If headless mode {@link net.miginfocom.layout.PlatformDefaults#getDefaultDPI} will be returned. - * @return The DPI. - */ - public abstract int getHorizontalScreenDPI(); - - /** Returns the DPI (Dots Per Inch) of the screen the component is currently in or for the default - * screen if the component is not visible. - *

- * If headless mode {@link net.miginfocom.layout.PlatformDefaults#getDefaultDPI} will be returned. - * @return The DPI. - */ - public abstract int getVerticalScreenDPI(); - - /** Returns the pixel size of the screen that the component is currently in or for the default - * screen if the component is not visible or null. - *

- * If in headless mode 1024 is returned. - * @return The screen size. E.g. 1280. - */ - public abstract int getScreenWidth(); - - /** Returns the pixel size of the screen that the component is currently in or for the default - * screen if the component is not visible or null. - *

- * If in headless mode 768 is returned. - * @return The screen size. E.g. 1024. - */ - public abstract int getScreenHeight(); - - /** Returns a String id that can be used to reference the component in link constraints. This value should - * return the default id for the component. The id can be set for a component in the constraints and if - * so the value returned by this method will never be used. If there are no sensible id for the component - * null should be returned. - *

- * For instance the Swing implementation returns the string returned from Component.getName(). - * @return The string link id or null. - */ - public abstract String getLinkId(); - - /** Returns a hash code that should be reasonably different for anything that might change the layout. This value is used to - * know if the component layout needs to clear any caches. - * @return A hash code that should be reasonably different for anything that might change the layout. Returns -1 if the widget is - * disposed. - */ - public abstract int getLayoutHashCode(); - - /** Returns the padding on a component by component basis. This method can be overridden to return padding to compensate for example for - * borders that have shadows or where the outer most pixel is not the visual "edge" to align to. - *

- * Default implementation returns null for all components except for Windows XP's JTabbedPane which will return new Insets(0, 0, 2, 2). - *

- * NOTE! To reduce generated garbage the returned padding should never be changed so that the same insets can be returned many times. - * @return null if no padding. NOTE! To reduce generated garbage the returned padding should never be changed so that - * the same insets can be returned many times. [top, left, bottom, right] - */ - public int[] getVisualPadding(); - - /** Paints component outline to indicate where it is. - * @param showVisualPadding If the visual padding should be shown in the debug drawing. - */ - public abstract void paintDebugOutline(boolean showVisualPadding); - - /** Returns the type of component that this wrapper is wrapping. - *

- * This method can be invoked often so the result should be cached. - *

- * @param disregardScrollPane Is true any wrapping scroll pane should be disregarded and the type - * of the scrolled component should be returned. - * @return The type of component that this wrapper is wrapping. E.g. {@link #TYPE_LABEL}. - */ - public abstract int getComponentType(boolean disregardScrollPane); - - /** Returns in what way the min/pref/max sizes relates to it's height or width for the current settings of the component (like wrapText). - * If the min/pref/max height depends on it's width return {@link net.miginfocom.layout.LayoutUtil#HORIZONTAL} - * If the min/pref/max width depends on it's height (not common) return {@link net.miginfocom.layout.LayoutUtil#VERTICAL} - * If there is no connection between the preferred min/pref/max and the size of the component return -1. - * @since 5.0 - */ - public abstract int getContentBias(); -} \ No newline at end of file diff --git a/src2/net/miginfocom/layout/ConstraintParser.java b/src2/net/miginfocom/layout/ConstraintParser.java deleted file mode 100644 index f819fde..0000000 --- a/src2/net/miginfocom/layout/ConstraintParser.java +++ /dev/null @@ -1,1481 +0,0 @@ -package net.miginfocom.layout; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** Parses string constraints. - */ -public final class ConstraintParser -{ - private ConstraintParser() - { - } - - /** Parses the layout constraints and stores the parsed values in the transient (cache) member variables. - * @param s The String to parse. Should not be null and must be lower case and trimmed. - * @throws RuntimeException if the constraint was not valid. - * @return The parsed constraint. Never null. - */ - public static LC parseLayoutConstraint(String s) - { - LC lc = new LC(); - if (s.isEmpty()) - return lc; - - String[] parts = toTrimmedTokens(s, ','); - - // First check for "ltr" or "rtl" since that will affect the interpretation of the other constraints. - for (int i = 0; i < parts.length; i++) { - String part = parts[i]; - if (part == null) - continue; - - int len = part.length(); - if (len == 3 || len == 11) { // Optimization - if (part.equals("ltr") || part.equals("rtl") || part.equals("lefttoright") || part.equals("righttoleft")) { - lc.setLeftToRight(part.charAt(0) == 'l' ? Boolean.TRUE : Boolean.FALSE); - parts[i] = null; // So we will not try to interpret it again - } - - if (part.equals("ttb") || part.equals("btt") || part.equals("toptobottom") || part.equals("bottomtotop")) { - lc.setTopToBottom(part.charAt(0) == 't'); - parts[i] = null; // So we will not try to interpret it again - } - } - } - - for (String part : parts) { - if (part == null || part.length() == 0) - continue; - - try { - int ix = -1; - char c = part.charAt(0); - - if (c == 'w' || c == 'h') { - - ix = startsWithLenient(part, "wrap", -1, true); - if (ix > -1) { - String num = part.substring(ix).trim(); - lc.setWrapAfter(num.length() != 0 ? Integer.parseInt(num) : 0); - continue; - } - - boolean isHor = c == 'w'; - if (isHor && (part.startsWith("w ") || part.startsWith("width "))) { - String sz = part.substring(part.charAt(1) == ' ' ? 2 : 6).trim(); - lc.setWidth(parseBoundSize(sz, false, true)); - continue; - } - - if (!isHor && (part.startsWith("h ") || part.startsWith("height "))) { - String uvStr = part.substring(part.charAt(1) == ' ' ? 2 : 7).trim(); - lc.setHeight(parseBoundSize(uvStr, false, false)); - continue; - } - - if (part.length() > 5) { - String sz = part.substring(5).trim(); - if (part.startsWith("wmin ")) { - lc.minWidth(sz); - continue; - } else if (part.startsWith("wmax ")) { - lc.maxWidth(sz); - continue; - } else if (part.startsWith("hmin ")) { - lc.minHeight(sz); - continue; - } else if (part.startsWith("hmax ")) { - lc.maxHeight(sz); - continue; - } - } - - if (part.startsWith("hidemode ")) { - lc.setHideMode(Integer.parseInt(part.substring(9))); - continue; - } - } - - if (c == 'g') { - if (part.startsWith("gapx ")) { - lc.setGridGapX(parseBoundSize(part.substring(5).trim(), true, true)); - continue; - } - - if (part.startsWith("gapy ")) { - lc.setGridGapY(parseBoundSize(part.substring(5).trim(), true, false)); - continue; - } - - if (part.startsWith("gap ")) { - String[] gaps = toTrimmedTokens(part.substring(4).trim(), ' '); - lc.setGridGapX(parseBoundSize(gaps[0], true, true)); - lc.setGridGapY(gaps.length > 1 ? parseBoundSize(gaps[1], true, false) : lc.getGridGapX()); - continue; - } - } - - if (c == 'd') { - ix = startsWithLenient(part, "debug", 5, true); - if (ix > -1) { - String millis = part.substring(ix).trim(); - lc.setDebugMillis(millis.length() > 0 ? Integer.parseInt(millis) : 1000); - continue; - } - } - - if (c == 'n') { - if (part.equals("nogrid")) { - lc.setNoGrid(true); - continue; - } - - if (part.equals("nocache")) { - lc.setNoCache(true); - continue; - } - - if (part.equals("novisualpadding")) { - lc.setVisualPadding(false); - continue; - } - } - - if (c == 'f') { - if (part.equals("fill") || part.equals("fillx") || part.equals("filly")) { - lc.setFillX(part.length() == 4 || part.charAt(4) == 'x'); - lc.setFillY(part.length() == 4 || part.charAt(4) == 'y'); - continue; - } - - if (part.equals("flowy")) { - lc.setFlowX(false); - continue; - } - - if (part.equals("flowx")) { - lc.setFlowX(true); // This is the default but added for consistency - continue; - } - } - - if (c == 'i') { - ix = startsWithLenient(part, "insets", 3, true); - if (ix > -1) { - String insStr = part.substring(ix).trim(); - UnitValue[] ins = parseInsets(insStr, true); - LayoutUtil.putCCString(ins, insStr); - lc.setInsets(ins); - continue; - } - } - - if (c == 'a') { - ix = startsWithLenient(part, new String[]{"aligny", "ay"}, new int[]{6, 2}, true); - if (ix > -1) { - UnitValue align = parseUnitValueOrAlign(part.substring(ix).trim(), false, null); - if (align == UnitValue.BASELINE_IDENTITY) - throw new IllegalArgumentException("'baseline' can not be used to align the whole component group."); - lc.setAlignY(align); - continue; - } - - ix = startsWithLenient(part, new String[]{"alignx", "ax"}, new int[]{6, 2}, true); - if (ix > -1) { - lc.setAlignX(parseUnitValueOrAlign(part.substring(ix).trim(), true, null)); - continue; - } - - ix = startsWithLenient(part, "align", 2, true); - if (ix > -1) { - String[] gaps = toTrimmedTokens(part.substring(ix).trim(), ' '); - lc.setAlignX(parseUnitValueOrAlign(gaps[0], true, null)); - if (gaps.length > 1) { - UnitValue align = parseUnitValueOrAlign(gaps[1], false, null); - if (align == UnitValue.BASELINE_IDENTITY) - throw new IllegalArgumentException("'baseline' can not be used to align the whole component group."); - lc.setAlignY(align); - } - continue; - } - } - - if (c == 'p') { - if (part.startsWith("packalign ")) { - String[] packs = toTrimmedTokens(part.substring(10).trim(), ' '); - lc.setPackWidthAlign(packs[0].length() > 0 ? Float.parseFloat(packs[0]) : 0.5f); - if (packs.length > 1) - lc.setPackHeightAlign(Float.parseFloat(packs[1])); - continue; - } - - if (part.startsWith("pack ") || part.equals("pack")) { - String ps = part.substring(4).trim(); - String[] packs = toTrimmedTokens(ps.length() > 0 ? ps : "pref pref", ' '); - lc.setPackWidth(parseBoundSize(packs[0], false, true)); - if (packs.length > 1) - lc.setPackHeight(parseBoundSize(packs[1], false, false)); - - continue; - } - } - - if (lc.getAlignX() == null) { - UnitValue alignX = parseAlignKeywords(part, true); - if (alignX != null) { - lc.setAlignX(alignX); - continue; - } - } - - UnitValue alignY = parseAlignKeywords(part, false); - if (alignY != null) { - lc.setAlignY(alignY); - continue; - } - - throw new IllegalArgumentException("Unknown Constraint: '" + part + "'\n"); - - } catch (Exception ex) { - throw new IllegalArgumentException("Illegal Constraint: '" + part + "'\n" + ex.getMessage()); - } - } - -// lc = (LC) serializeTest(lc); - - return lc; - } - - /** Parses the column or rows constraints. They normally looks something like "[min:pref]rel[10px][]". - * @param s The string to parse. Not null. - * @return An array of {@link DimConstraint}s that is as many are there exist "[...]" sections in the string that is parsed. - * @throws RuntimeException if the constraint was not valid. - */ - public static AC parseRowConstraints(String s) - { - return parseAxisConstraint(s, false); - } - - /** Parses the column or rows constraints. They normally looks something like "[min:pref]rel[10px][]". - * @param s The string to parse. Not null. - * @return An array of {@link DimConstraint}s that is as many are there exist "[...]" sections in the string that is parsed. - * @throws RuntimeException if the constraint was not valid. - */ - public static AC parseColumnConstraints(String s) - { - return parseAxisConstraint(s, true); - } - - /** Parses the column or rows constraints. They normally looks something like "[min:pref]rel[10px][]". - * @param s The string to parse. Not null. - * @param isCols If this for columns rather than rows. - * @return An array of {@link DimConstraint}s that is as many are there exist "[...]" sections in the string that is parsed. - * @throws RuntimeException if the constraint was not valid. - */ - private static AC parseAxisConstraint(String s, boolean isCols) - { - s = s.trim(); - - if (s.length() == 0) - return new AC(); // Short circuit for performance. - - s = s.toLowerCase(); - - ArrayList parts = getRowColAndGapsTrimmed(s); - - BoundSize[] gaps = new BoundSize[(parts.size() >> 1) + 1]; - for (int i = 0, iSz = parts.size(), gIx = 0; i < iSz; i += 2, gIx++) - gaps[gIx] = parseBoundSize(parts.get(i), true, isCols); - - DimConstraint[] colSpecs = new DimConstraint[parts.size() >> 1]; - for (int i = 0, gIx = 0; i < colSpecs.length; i++, gIx++) { - if (gIx >= gaps.length - 1) - gIx = gaps.length - 2; - - colSpecs[i] = parseDimConstraint(parts.get((i << 1) + 1), gaps[gIx], gaps[gIx + 1], isCols); - } - - AC ac = new AC(); - ac.setConstaints(colSpecs); - -// ac = (AC) serializeTest(ac); - - return ac; - } - - /** Parses a single column or row constraint. - * @param s The single constraint to parse. May look something like "min:pref,fill,grow". Should not be null and must - * be lower case and trimmed. - * @param gapBefore The default gap "before" the column/row constraint. Can be overridden with a "gap" section within s. - * @param gapAfter The default gap "after" the column/row constraint. Can be overridden with a "gap" section within s. - * @param isCols If the constraints are column constraints rather than row constraints. - * @return A single constraint. Never null. - * @throws RuntimeException if the constraint was not valid. - */ - private static DimConstraint parseDimConstraint(String s, BoundSize gapBefore, BoundSize gapAfter, boolean isCols) - { - DimConstraint dimConstraint = new DimConstraint(); - - // Default values. - dimConstraint.setGapBefore(gapBefore); - dimConstraint.setGapAfter(gapAfter); - - String[] parts = toTrimmedTokens(s, ','); - for (int i = 0; i < parts.length; i++) { - String part = parts[i]; - try { - if (part.length() == 0) - continue; - - if (part.equals("fill")) { - dimConstraint.setFill(true); -// dimConstraint.setAlign(null); // Can not have both fill and alignment (changed for 3.5 since it can have "growy 0") - continue; - } - - if (part.equals("nogrid")) { - dimConstraint.setNoGrid(true); - continue; - } - - int ix = -1; - char c = part.charAt(0); - - if (c == 's') { - ix = startsWithLenient(part, new String[] {"sizegroup", "sg"}, new int[] {5, 2}, true); - if (ix > -1) { - dimConstraint.setSizeGroup(part.substring(ix).trim()); - continue; - } - - - ix = startsWithLenient(part, new String[] {"shrinkprio", "shp"}, new int[] {10, 3}, true); - if (ix > -1) { - dimConstraint.setShrinkPriority(Integer.parseInt(part.substring(ix).trim())); - continue; - } - - ix = startsWithLenient(part, "shrink", 6, true); - if (ix > -1) { - dimConstraint.setShrink(parseFloat(part.substring(ix).trim(), ResizeConstraint.WEIGHT_100)); - continue; - } - } - - if (c == 'g') { - ix = startsWithLenient(part, new String[] {"growpriority", "gp"}, new int[] {5, 2}, true); - if (ix > -1) { - dimConstraint.setGrowPriority(Integer.parseInt(part.substring(ix).trim())); - continue; - } - - ix = startsWithLenient(part, "grow", 4, true); - if (ix > -1) { - dimConstraint.setGrow(parseFloat(part.substring(ix).trim(), ResizeConstraint.WEIGHT_100)); - continue; - } - } - - if (c == 'a') { - ix = startsWithLenient(part, "align", 2, true); - if (ix > -1) { -// if (dimConstraint.isFill() == false) // Swallow, but ignore if fill is set. (changed for 3.5 since it can have "growy 0") - dimConstraint.setAlign(parseUnitValueOrAlign(part.substring(ix).trim(), isCols, null)); - continue; - } - } - - UnitValue align = parseAlignKeywords(part, isCols); - if (align != null) { -// if (dimConstraint.isFill() == false) // Swallow, but ignore if fill is set. (changed for 3.5 since it can have "growy 0") - dimConstraint.setAlign(align); - continue; - } - - // Only min:pref:max still left that is ok - dimConstraint.setSize(parseBoundSize(part, false, isCols)); - - } catch (Exception ex) { - throw new IllegalArgumentException("Illegal constraint: '" + part + "'\n" + ex.getMessage()); - } - } - return dimConstraint; - } - - /** Parses all component constraints and stores the parsed values in the transient (cache) member variables. - * @param constrMap The constraints as Strings. Strings must be lower case and trimmed - * @return The parsed constraints. Never null. - */ - public static Map parseComponentConstraints(Map constrMap) - { - HashMap flowConstrMap = new HashMap(); - - for (Iterator> it = constrMap.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = it.next(); - flowConstrMap.put(entry.getKey(), parseComponentConstraint(entry.getValue())); - } - - return flowConstrMap; - } - - /** Parses one component constraint and returns the parsed value. - * @param s The string to parse. Must be lower case and trimmed. - * @throws RuntimeException if the constraint was not valid. - * @return The parsed constraint. Never null. - */ - public static CC parseComponentConstraint(String s) - { - CC cc = new CC(); - - if (s == null || s.isEmpty()) - return cc; - - String[] parts = toTrimmedTokens(s, ','); - - for (String part : parts) { - try { - if (part.length() == 0) - continue; - - int ix = -1; - char c = part.charAt(0); - - if (c == 'n') { - if (part.equals("north")) { - cc.setDockSide(0); - continue; - } - - if (part.equals("newline")) { - cc.setNewline(true); - continue; - } - - if (part.startsWith("newline ")) { - String gapSz = part.substring(7).trim(); - cc.setNewlineGapSize(parseBoundSize(gapSz, true, true)); - continue; - } - } - - if (c == 'f' && (part.equals("flowy") || part.equals("flowx"))) { - cc.setFlowX(part.charAt(4) == 'x' ? Boolean.TRUE : Boolean.FALSE); - continue; - } - - if (c == 's') { - ix = startsWithLenient(part, "skip", 4, true); - if (ix > -1) { - String num = part.substring(ix).trim(); - cc.setSkip(num.length() != 0 ? Integer.parseInt(num) : 1); - continue; - } - - ix = startsWithLenient(part, "split", 5, true); - if (ix > -1) { - String split = part.substring(ix).trim(); - cc.setSplit(split.length() > 0 ? Integer.parseInt(split) : LayoutUtil.INF); - continue; - } - - if (part.equals("south")) { - cc.setDockSide(2); - continue; - } - - ix = startsWithLenient(part, new String[]{"spany", "sy"}, new int[]{5, 2}, true); - if (ix > -1) { - cc.setSpanY(parseSpan(part.substring(ix).trim())); - continue; - } - - ix = startsWithLenient(part, new String[]{"spanx", "sx"}, new int[]{5, 2}, true); - if (ix > -1) { - cc.setSpanX(parseSpan(part.substring(ix).trim())); - continue; - } - - ix = startsWithLenient(part, "span", 4, true); - if (ix > -1) { - String[] spans = toTrimmedTokens(part.substring(ix).trim(), ' '); - cc.setSpanX(spans[0].length() > 0 ? Integer.parseInt(spans[0]) : LayoutUtil.INF); - cc.setSpanY(spans.length > 1 ? Integer.parseInt(spans[1]) : 1); - continue; - } - - ix = startsWithLenient(part, "shrinkx", 7, true); - if (ix > -1) { - cc.getHorizontal().setShrink(parseFloat(part.substring(ix).trim(), ResizeConstraint.WEIGHT_100)); - continue; - } - - ix = startsWithLenient(part, "shrinky", 7, true); - if (ix > -1) { - cc.getVertical().setShrink(parseFloat(part.substring(ix).trim(), ResizeConstraint.WEIGHT_100)); - continue; - } - - ix = startsWithLenient(part, "shrink", 6, false); - if (ix > -1) { - String[] shrinks = toTrimmedTokens(part.substring(ix).trim(), ' '); - cc.getHorizontal().setShrink(parseFloat(shrinks[0], ResizeConstraint.WEIGHT_100)); - if (shrinks.length > 1) - cc.getVertical().setShrink(parseFloat(shrinks[1], ResizeConstraint.WEIGHT_100)); - continue; - } - - ix = startsWithLenient(part, new String[]{"shrinkprio", "shp"}, new int[]{10, 3}, true); - if (ix > -1) { - String sp = part.substring(ix).trim(); - if (sp.startsWith("x") || sp.startsWith("y")) { // To handle "gpx", "gpy", "shrinkpriorityx", shrinkpriorityy" - (sp.startsWith("x") ? cc.getHorizontal() : cc.getVertical()).setShrinkPriority(Integer.parseInt(sp.substring(2))); - } else { - String[] shrinks = toTrimmedTokens(sp, ' '); - cc.getHorizontal().setShrinkPriority(Integer.parseInt(shrinks[0])); - if (shrinks.length > 1) - cc.getVertical().setShrinkPriority(Integer.parseInt(shrinks[1])); - } - continue; - } - - ix = startsWithLenient(part, new String[]{"sizegroupx", "sizegroupy", "sgx", "sgy"}, new int[]{9, 9, 2, 2}, true); - if (ix > -1) { - String sg = part.substring(ix).trim(); - char lc = part.charAt(ix - 1); - if (lc != 'y') - cc.getHorizontal().setSizeGroup(sg); - if (lc != 'x') - cc.getVertical().setSizeGroup(sg); - continue; - } - } - - if (c == 'g') { - ix = startsWithLenient(part, "growx", 5, true); - if (ix > -1) { - cc.getHorizontal().setGrow(parseFloat(part.substring(ix).trim(), ResizeConstraint.WEIGHT_100)); - continue; - } - - ix = startsWithLenient(part, "growy", 5, true); - if (ix > -1) { - cc.getVertical().setGrow(parseFloat(part.substring(ix).trim(), ResizeConstraint.WEIGHT_100)); - continue; - } - - ix = startsWithLenient(part, "grow", 4, false); - if (ix > -1) { - String[] grows = toTrimmedTokens(part.substring(ix).trim(), ' '); - cc.getHorizontal().setGrow(parseFloat(grows[0], ResizeConstraint.WEIGHT_100)); - cc.getVertical().setGrow(parseFloat(grows.length > 1 ? grows[1] : "", ResizeConstraint.WEIGHT_100)); - continue; - } - - ix = startsWithLenient(part, new String[]{"growprio", "gp"}, new int[]{8, 2}, true); - if (ix > -1) { - String gp = part.substring(ix).trim(); - char c0 = gp.length() > 0 ? gp.charAt(0) : ' '; - if (c0 == 'x' || c0 == 'y') { // To handle "gpx", "gpy", "growpriorityx", growpriorityy" - (c0 == 'x' ? cc.getHorizontal() : cc.getVertical()).setGrowPriority(Integer.parseInt(gp.substring(2))); - } else { - String[] grows = toTrimmedTokens(gp, ' '); - cc.getHorizontal().setGrowPriority(Integer.parseInt(grows[0])); - if (grows.length > 1) - cc.getVertical().setGrowPriority(Integer.parseInt(grows[1])); - } - continue; - } - - if (part.startsWith("gap")) { - BoundSize[] gaps = parseGaps(part); // Changes order!! - if (gaps[0] != null) - cc.getVertical().setGapBefore(gaps[0]); - if (gaps[1] != null) - cc.getHorizontal().setGapBefore(gaps[1]); - if (gaps[2] != null) - cc.getVertical().setGapAfter(gaps[2]); - if (gaps[3] != null) - cc.getHorizontal().setGapAfter(gaps[3]); - continue; - } - } - - if (c == 'a') { - ix = startsWithLenient(part, new String[]{"aligny", "ay"}, new int[]{6, 2}, true); - if (ix > -1) { - cc.getVertical().setAlign(parseUnitValueOrAlign(part.substring(ix).trim(), false, null)); - continue; - } - - ix = startsWithLenient(part, new String[]{"alignx", "ax"}, new int[]{6, 2}, true); - if (ix > -1) { - cc.getHorizontal().setAlign(parseUnitValueOrAlign(part.substring(ix).trim(), true, null)); - continue; - } - - ix = startsWithLenient(part, "align", 2, true); - if (ix > -1) { - String[] gaps = toTrimmedTokens(part.substring(ix).trim(), ' '); - cc.getHorizontal().setAlign(parseUnitValueOrAlign(gaps[0], true, null)); - if (gaps.length > 1) - cc.getVertical().setAlign(parseUnitValueOrAlign(gaps[1], false, null)); - continue; - } - } - - if ((c == 'x' || c == 'y') && part.length() > 2) { - char c2 = part.charAt(1); - if (c2 == ' ' || (c2 == '2' && part.charAt(2) == ' ')) { - if (cc.getPos() == null) { - cc.setPos(new UnitValue[4]); - } else if (cc.isBoundsInGrid() == false) { - throw new IllegalArgumentException("Cannot combine 'position' with 'x/y/x2/y2' keywords."); - } - - int edge = (c == 'x' ? 0 : 1) + (c2 == '2' ? 2 : 0); - UnitValue[] pos = cc.getPos(); - pos[edge] = parseUnitValue(part.substring(2).trim(), null, c == 'x'); - cc.setPos(pos); - cc.setBoundsInGrid(true); - continue; - } - } - - if (c == 'c') { - ix = startsWithLenient(part, "cell", 4, true); - if (ix > -1) { - String[] grs = toTrimmedTokens(part.substring(ix).trim(), ' '); - if (grs.length < 2) - throw new IllegalArgumentException("At least two integers must follow " + part); - cc.setCellX(Integer.parseInt(grs[0])); - cc.setCellY(Integer.parseInt(grs[1])); - if (grs.length > 2) - cc.setSpanX(Integer.parseInt(grs[2])); - if (grs.length > 3) - cc.setSpanY(Integer.parseInt(grs[3])); - continue; - } - } - - if (c == 'p') { - ix = startsWithLenient(part, "pos", 3, true); - if (ix > -1) { - if (cc.getPos() != null && cc.isBoundsInGrid()) - throw new IllegalArgumentException("Can not combine 'pos' with 'x/y/x2/y2' keywords."); - - String[] pos = toTrimmedTokens(part.substring(ix).trim(), ' '); - UnitValue[] bounds = new UnitValue[4]; - for (int j = 0; j < pos.length; j++) - bounds[j] = parseUnitValue(pos[j], null, j % 2 == 0); - - if (bounds[0] == null && bounds[2] == null || bounds[1] == null && bounds[3] == null) - throw new IllegalArgumentException("Both x and x2 or y and y2 can not be null!"); - - cc.setPos(bounds); - cc.setBoundsInGrid(false); - continue; - } - - ix = startsWithLenient(part, "pad", 3, true); - if (ix > -1) { - UnitValue[] p = parseInsets(part.substring(ix).trim(), false); - cc.setPadding(new UnitValue[]{ - p[0], - p.length > 1 ? p[1] : null, - p.length > 2 ? p[2] : null, - p.length > 3 ? p[3] : null}); - continue; - } - - ix = startsWithLenient(part, "pushx", 5, true); - if (ix > -1) { - cc.setPushX(parseFloat(part.substring(ix).trim(), ResizeConstraint.WEIGHT_100)); - continue; - } - - ix = startsWithLenient(part, "pushy", 5, true); - if (ix > -1) { - cc.setPushY(parseFloat(part.substring(ix).trim(), ResizeConstraint.WEIGHT_100)); - continue; - } - - ix = startsWithLenient(part, "push", 4, false); - if (ix > -1) { - String[] pushs = toTrimmedTokens(part.substring(ix).trim(), ' '); - cc.setPushX(parseFloat(pushs[0], ResizeConstraint.WEIGHT_100)); - cc.setPushY(parseFloat(pushs.length > 1 ? pushs[1] : "", ResizeConstraint.WEIGHT_100)); - continue; - } - } - - if (c == 't') { - ix = startsWithLenient(part, "tag", 3, true); - if (ix > -1) { - cc.setTag(part.substring(ix).trim()); - continue; - } - } - - if (c == 'w' || c == 'h') { - if (part.equals("wrap")) { - cc.setWrap(true); - continue; - } - - if (part.startsWith("wrap ")) { - String gapSz = part.substring(5).trim(); - cc.setWrapGapSize(parseBoundSize(gapSz, true, true)); - continue; - } - - boolean isHor = c == 'w'; - if (isHor && (part.startsWith("w ") || part.startsWith("width "))) { - String uvStr = part.substring(part.charAt(1) == ' ' ? 2 : 6).trim(); - cc.getHorizontal().setSize(parseBoundSize(uvStr, false, true)); - continue; - } - - if (!isHor && (part.startsWith("h ") || part.startsWith("height "))) { - String uvStr = part.substring(part.charAt(1) == ' ' ? 2 : 7).trim(); - cc.getVertical().setSize(parseBoundSize(uvStr, false, false)); - continue; - } - - if (part.startsWith("wmin ") || part.startsWith("wmax ") || part.startsWith("hmin ") || part.startsWith("hmax ")) { - String uvStr = part.substring(5).trim(); - if (uvStr.length() > 0) { - UnitValue uv = parseUnitValue(uvStr, null, isHor); - boolean isMin = part.charAt(3) == 'n'; - DimConstraint dc = isHor ? cc.getHorizontal() : cc.getVertical(); - dc.setSize(new BoundSize( - isMin ? uv : dc.getSize().getMin(), - dc.getSize().getPreferred(), - isMin ? (dc.getSize().getMax()) : uv, - uvStr - )); - continue; - } - } - - if (part.equals("west")) { - cc.setDockSide(1); - continue; - } - - if (part.startsWith("hidemode ")) { - cc.setHideMode(Integer.parseInt(part.substring(9))); - continue; - } - } - - if (c == 'i' && part.startsWith("id ")) { - cc.setId(part.substring(3).trim()); - int dIx = cc.getId().indexOf('.'); - if (dIx == 0 || dIx == cc.getId().length() - 1) - throw new IllegalArgumentException("Dot must not be first or last!"); - - continue; - } - - if (c == 'e') { - if (part.equals("east")) { - cc.setDockSide(3); - continue; - } - - if (part.equals("external")) { - cc.setExternal(true); - continue; - } - - ix = startsWithLenient(part, new String[]{"endgroupx", "endgroupy", "egx", "egy"}, new int[]{-1, -1, -1, -1}, true); - if (ix > -1) { - String sg = part.substring(ix).trim(); - char lc = part.charAt(ix - 1); - DimConstraint dc = (lc == 'x' ? cc.getHorizontal() : cc.getVertical()); - dc.setEndGroup(sg); - continue; - } - } - - if (c == 'd') { - if (part.equals("dock north")) { - cc.setDockSide(0); - continue; - } - if (part.equals("dock west")) { - cc.setDockSide(1); - continue; - } - if (part.equals("dock south")) { - cc.setDockSide(2); - continue; - } - if (part.equals("dock east")) { - cc.setDockSide(3); - continue; - } - - if (part.equals("dock center")) { - cc.getHorizontal().setGrow(100f); - cc.getVertical().setGrow(100f); - cc.setPushX(100f); - cc.setPushY(100f); - continue; - } - } - - if (c == 'v') { - ix = startsWithLenient(part, new String[] {"visualpadding", "vp"}, new int[] {3, 2}, true); - if (ix > -1) { - UnitValue[] p = parseInsets(part.substring(ix).trim(), false); - cc.setVisualPadding(new UnitValue[] { - p[0], - p.length > 1 ? p[1] : null, - p.length > 2 ? p[2] : null, - p.length > 3 ? p[3] : null}); - continue; - } - } - - UnitValue horAlign = parseAlignKeywords(part, true); - if (horAlign != null) { - cc.getHorizontal().setAlign(horAlign); - continue; - } - - UnitValue verAlign = parseAlignKeywords(part, false); - if (verAlign != null) { - cc.getVertical().setAlign(verAlign); - continue; - } - - throw new IllegalArgumentException("Unknown keyword."); - - } catch (Exception ex) { - throw new IllegalArgumentException("Error parsing Constraint: '" + part + "'", ex); - } - } - -// cc = (CC) serializeTest(cc); - - return cc; - } - - /** Parses insets which consists of 1-4 UnitValues. - * @param s The string to parse. E.g. "10 10 10 10" or "20". If less than 4 groups the last will be used for the missing. - * @param acceptPanel If "panel" and "dialog" should be accepted. They are used to access platform defaults. - * @return An array of length 4 with the parsed insets. - * @throws IllegalArgumentException if the parsing could not be done. - */ - public static UnitValue[] parseInsets(String s, boolean acceptPanel) - { - if (s.length() == 0 || s.equals("dialog") || s.equals("panel")) { - if (acceptPanel == false) - throw new IllegalArgumentException("Insets now allowed: " + s + "\n"); - - boolean isPanel = s.startsWith("p"); - UnitValue[] ins = new UnitValue[4]; - for (int j = 0; j < 4; j++) - ins[j] = isPanel ? PlatformDefaults.getPanelInsets(j) : PlatformDefaults.getDialogInsets(j); - - return ins; - } else { - String[] insS = toTrimmedTokens(s, ' '); - UnitValue[] ins = new UnitValue[4]; - for (int j = 0; j < 4; j++) { - UnitValue insSz = parseUnitValue(insS[j < insS.length ? j : insS.length - 1], UnitValue.ZERO, j % 2 == 1); - ins[j] = insSz != null ? insSz : PlatformDefaults.getPanelInsets(j); - } - return ins; - } - } - - /** Parses gaps. - * @param s The string that contains gap information. Should start with "gap". - * @return The gaps as specified in s. Indexed: [top,left,bottom,right][min,pref,max] or - * [before,after][min,pref,max] if oneDim is true. - */ - private static BoundSize[] parseGaps(String s) - { - BoundSize[] ret = new BoundSize[4]; - - int ix = startsWithLenient(s, "gaptop", -1, true); - if (ix > -1) { - s = s.substring(ix).trim(); - ret[0] = parseBoundSize(s, true, false); - return ret; - } - - ix = startsWithLenient(s, "gapleft", -1, true); - if (ix > -1) { - s = s.substring(ix).trim(); - ret[1] = parseBoundSize(s, true, true); - return ret; - } - - ix = startsWithLenient(s, "gapbottom", -1, true); - if (ix > -1) { - s = s.substring(ix).trim(); - ret[2] = parseBoundSize(s, true, false); - return ret; - } - - ix = startsWithLenient(s, "gapright", -1, true); - if (ix > -1) { - s = s.substring(ix).trim(); - ret[3] = parseBoundSize(s, true, true); - return ret; - } - - ix = startsWithLenient(s, "gapbefore", -1, true); - if (ix > -1) { - s = s.substring(ix).trim(); - ret[1] = parseBoundSize(s, true, true); - return ret; - } - - ix = startsWithLenient(s, "gapafter", -1, true); - if (ix > -1) { - s = s.substring(ix).trim(); - ret[3] = parseBoundSize(s, true, true); - return ret; - } - - ix = startsWithLenient(s, new String[] {"gapx", "gapy"}, null, true); - if (ix > -1) { - boolean x = s.charAt(3) == 'x'; - String[] gaps = toTrimmedTokens(s.substring(ix).trim(), ' '); - ret[x ? 1 : 0] = parseBoundSize(gaps[0], true, x); - if (gaps.length > 1) - ret[x ? 3 : 2] = parseBoundSize(gaps[1], true, !x); - return ret; - } - - ix = startsWithLenient(s, "gap ", 1, true); - if (ix > -1) { - String[] gaps = toTrimmedTokens(s.substring(ix).trim(), ' '); - - ret[1] = parseBoundSize(gaps[0], true, true); // left - if (gaps.length > 1) { - ret[3] = parseBoundSize(gaps[1], true, false); // right - if (gaps.length > 2) { - ret[0] = parseBoundSize(gaps[2], true, true); // top - if (gaps.length > 3) - ret[2] = parseBoundSize(gaps[3], true, false); // bottom - } - } - return ret; - } - - throw new IllegalArgumentException("Unknown Gap part: '" + s + "'"); - } - - private static int parseSpan(String s) - { - return s.length() > 0 ? Integer.parseInt(s) : LayoutUtil.INF; - } - - private static Float parseFloat(String s, Float nullVal) - { - return s.length() > 0 ? new Float(Float.parseFloat(s)) : nullVal; - } - - /** Parses a single "min:pref:max" value. May look something like "10px:20lp:30%" or "pref!". - * @param s The string to parse. Not null. - * @param isGap If this bound size is a gap (different empty string handling). - * @param isHor If the size is for the horizontal dimension. - * @return A bound size that may be null if the string was "null", "n" or null. - */ - public static BoundSize parseBoundSize(String s, boolean isGap, boolean isHor) - { - if (s.length() == 0 || s.equals("null") || s.equals("n")) - return null; - - String cs = s; - boolean push = false; - if (s.endsWith("push")) { - push = true; - int l = s.length(); - s = s.substring(0, l - (s.endsWith(":push") ? 5 : 4)); - if (s.length() == 0) - return new BoundSize(null, null, null, true, cs); - } - - String[] sizes = toTrimmedTokens(s, ':'); - String s0 = sizes[0]; - - if (sizes.length == 1) { - boolean hasEM = s0.endsWith("!"); - if (hasEM) - s0 = s0.substring(0, s0.length() - 1); - UnitValue uv = parseUnitValue(s0, null, isHor); - return new BoundSize(((isGap || hasEM) ? uv : null), uv, (hasEM ? uv : null), push, cs); - - } else if (sizes.length == 2) { - return new BoundSize(parseUnitValue(s0, null, isHor), parseUnitValue(sizes[1], null, isHor), null, push, cs); - } else if (sizes.length == 3) { - return new BoundSize(parseUnitValue(s0, null, isHor), parseUnitValue(sizes[1], null, isHor), parseUnitValue(sizes[2], null, isHor), push, cs); - } else { - throw new IllegalArgumentException("Min:Preferred:Max size section must contain 0, 1 or 2 colons. '" + cs + "'"); - } - } - - /** Parses a single unit value that may also be an alignment as parsed by {@link #parseAlignKeywords(String, boolean)}. - * @param s The string to parse. Not null. May look something like "10px" or "5dlu". - * @param isHor If the value is for the horizontal dimension. - * @param emptyReplacement A replacement if s is empty. May be null. - * @return The parsed unit value. May be null. - */ - public static UnitValue parseUnitValueOrAlign(String s, boolean isHor, UnitValue emptyReplacement) - { - if (s.length() == 0) - return emptyReplacement; - - UnitValue align = parseAlignKeywords(s, isHor); - if (align != null) - return align; - - return parseUnitValue(s, emptyReplacement, isHor); - } - - /** Parses a single unit value. E.g. "10px" or "5in" - * @param s The string to parse. Not null. May look something like "10px" or "5dlu". - * @param isHor If the value is for the horizontal dimension. - * @return The parsed unit value. null is empty string, - */ - public static UnitValue parseUnitValue(String s, boolean isHor) - { - return parseUnitValue(s, null, isHor); - } - - /** Parses a single unit value. - * @param s The string to parse. May be null. May look something like "10px" or "5dlu". - * @param emptyReplacement A replacement s is empty or null. May be null. - * @param isHor If the value is for the horizontal dimension. - * @return The parsed unit value. May be null. - */ - private static UnitValue parseUnitValue(String s, UnitValue emptyReplacement, boolean isHor) - { - if (s == null || s.length() == 0) - return emptyReplacement; - - String cs = s; // Save creation string. - char c0 = s.charAt(0); - - // Remove start and end parentheses, if there. - if (c0 == '(' && s.charAt(s.length() - 1) == ')') - s = s.substring(1, s.length() - 1); - - if (c0 == 'n' && (s.equals("null") || s.equals("n"))) - return null; - - if (c0 == 'i' && s.equals("inf")) - return UnitValue.INF; - - int oper = getOper(s); - boolean inline = oper == UnitValue.ADD || oper == UnitValue.SUB || oper == UnitValue.MUL || oper == UnitValue.DIV; - - if (oper != UnitValue.STATIC) { // It is a multi-value - - String[] uvs; - if (inline == false) { // If the format is of type "opr(xxx,yyy)" (compared to in-line "10%+15px") - String sub = s.substring(4, s.length() - 1).trim(); - uvs = toTrimmedTokens(sub, ','); - if (uvs.length == 1) - return parseUnitValue(sub, null, isHor); - } else { - char delim; - if (oper == UnitValue.ADD) { - delim = '+'; - } else if (oper == UnitValue.SUB) { - delim = '-'; - } else if (oper == UnitValue.MUL) { - delim = '*'; - } else { // div left - delim = '/'; - } - uvs = toTrimmedTokens(s, delim); - if (uvs.length > 2) { // More than one +-*/. - String last = uvs[uvs.length - 1]; - String first = s.substring(0, s.length() - last.length() - 1); - uvs = new String[] {first, last}; - } - } - - if (uvs.length != 2) - throw new IllegalArgumentException("Malformed UnitValue: '" + s + "'"); - - UnitValue sub1 = parseUnitValue(uvs[0], null, isHor); - UnitValue sub2 = parseUnitValue(uvs[1], null, isHor); - - if (sub1 == null || sub2 == null) - throw new IllegalArgumentException("Malformed UnitValue. Must be two sub-values: '" + s + "'"); - - return new UnitValue(isHor, oper, sub1, sub2, cs); - } else { - try { - String[] numParts = getNumTextParts(s); - float value = numParts[0].length() > 0 ? Float.parseFloat(numParts[0]) : 1; // e.g. "related" has no number part.. - - return new UnitValue(value, numParts[1], isHor, oper, cs); - - } catch(Exception e) { - throw new IllegalArgumentException("Malformed UnitValue: '" + s + "'", e); - } - } - } - - /** Parses alignment keywords and returns the appropriate UnitValue. - * @param s The string to parse. Not null. - * @param isHor If alignments for horizontal is checked. false means vertical. - * @return The unit value or null if not recognized (no exception). - */ - static UnitValue parseAlignKeywords(String s, boolean isHor) - { - if (startsWithLenient(s, "center", 1, false) != -1) - return UnitValue.CENTER; - - if (isHor) { - if (startsWithLenient(s, "left", 1, false) != -1) - return UnitValue.LEFT; - - if (startsWithLenient(s, "right", 1, false) != -1) - return UnitValue.RIGHT; - - if (startsWithLenient(s, "leading", 4, false) != -1) - return UnitValue.LEADING; - - if (startsWithLenient(s, "trailing", 5, false) != -1) - return UnitValue.TRAILING; - - if (startsWithLenient(s, "label", 5, false) != -1) - return UnitValue.LABEL; - - } else { - - if (startsWithLenient(s, "baseline", 4, false) != -1) - return UnitValue.BASELINE_IDENTITY; - - if (startsWithLenient(s, "top", 1, false) != -1) - return UnitValue.TOP; - - if (startsWithLenient(s, "bottom", 1, false) != -1) - return UnitValue.BOTTOM; - } - - return null; - } - - /** Splits a text-number combination such as "hello 10.0" into {"hello", "10.0"}. - * @param s The string to split. Not null. Needs be be reasonably formatted since the method - * only finds the first 0-9 or . and cuts the string in half there. - * @return Always length 2 and no null elements. Elements are "" if no part found. - */ - private static String[] getNumTextParts(String s) - { - for (int i = 0, iSz = s.length(); i < iSz; i++) { - char c = s.charAt(i); - if (c == ' ') - throw new IllegalArgumentException("Space in UnitValue: '" + s + "'"); - - if ((c < '0' || c > '9') && c != '.' && c != '-') - return new String[] {s.substring(0, i).trim(), s.substring(i).trim()}; - } - return new String[] {s, ""}; - } - - /** Returns the operation depending on the start character. - * @param s The string to check. Not null. - * @return E.g. UnitValue.ADD, UnitValue.SUB or UnitValue.STATIC. Returns negative value for in-line operations. - */ - private static int getOper(String s) - { - int len = s.length(); - if (len < 3) - return UnitValue.STATIC; - - if (len > 5 && s.charAt(3) == '(' && s.charAt(len - 1) == ')') { - if (s.startsWith("min(")) - return UnitValue.MIN; - - if (s.startsWith("max(")) - return UnitValue.MAX; - - if (s.startsWith("mid(")) - return UnitValue.MID; - } - - // Try in-line add/sub. E.g. "pref+10px". - for (int j = 0; j < 2; j++) { // First +- then */ (precedence) - for (int i = len - 1, p = 0; i > 0; i--) { - char c = s.charAt(i); - if (c == ')') { - p++; - } else if (c == '(') { - p--; - } else if (p == 0) { - if (j == 0) { - if (c == '+') - return UnitValue.ADD; - if (c == '-') - return UnitValue.SUB; - } else { - if (c == '*') - return UnitValue.MUL; - if (c == '/') - return UnitValue.DIV; - } - } - } - } - return UnitValue.STATIC; - } - - /** Returns if a string shares at least a specified numbers starting characters with a number of matches. - *

- * This method just exercise {@link #startsWithLenient(String, String, int, boolean)} with every one of - * matches and minChars. - * @param s The string to check. Not null. - * @param matches A number of possible starts for s. - * @param minChars The minimum number of characters to match for every element in matches. Needs - * to be of same length as matches. Can be null. - * @param acceptTrailing If after the required number of characters are matched on recognized characters that are not - * in one of the the matches string should be accepted. For instance if "abczz" should be matched with - * "abcdef" and min chars 3. - * @return The index of the first unmatched character if minChars was reached or -1 if a match was not - * found. - */ - private static int startsWithLenient(String s, String[] matches, int[] minChars, boolean acceptTrailing) - { - for (int i = 0; i < matches.length; i++) { - int minChar = minChars != null ? minChars[i] : -1; - int ix = startsWithLenient(s, matches[i], minChar, acceptTrailing); - if (ix > -1) - return ix; - } - return -1; - } - - /** Returns if a string shares at least a specified numbers starting characters with a match. - * @param s The string to check. Not null and must be trimmed. - * @param match The possible start for s. Not null and must be trimmed. - * @param minChars The mimimum number of characters to match to s for it this to be considered a match. -1 means - * the full length of match. - * @param acceptTrailing If after the required number of charecters are matched unrecognized characters that are not - * in one of the the matches string should be accepted. For instance if "abczz" should be matched with - * "abcdef" and min chars 3. - * @return The index of the first unmatched character if minChars was reached or -1 if a match was not - * found. - */ - private static int startsWithLenient(String s, String match, int minChars, boolean acceptTrailing) - { - if (s.charAt(0) != match.charAt(0)) // Fast sanity check. - return -1; - - if (minChars == -1) - minChars = match.length(); - - int sSz = s.length(); - if (sSz < minChars) - return -1; - - int mSz = match.length(); - int sIx = 0; - for (int mIx = 0; mIx < mSz; sIx++, mIx++) { - while (sIx < sSz && (s.charAt(sIx) == ' ' || s.charAt(sIx) == '_')) // Disregard spaces and _ - sIx++; - - if (sIx >= sSz || s.charAt(sIx) != match.charAt(mIx)) - return mIx >= minChars && (acceptTrailing || sIx >= sSz) && (sIx >= sSz || s.charAt(sIx - 1) == ' ') ? sIx : -1; - } - return sIx >= sSz || acceptTrailing ||s.charAt(sIx) == ' ' ? sIx : -1; - } - - /** Parses a string and returns it in those parts of the string that are separated with a sep character. - *

- * separator characters within parentheses will not be counted or handled in any way, whatever the depth. - *

- * A space separator will be a hit to one or more spaces and thus not return empty strings. - * @param s The string to parse. If it starts and/or ends with a sep the first and/or last element returned will be "". If - * two sep are next to each other and empty element will be "between" the periods. The sep themselves will never be returned. - * @param sep The separator char. - * @return Those parts of the string that are separated with sep. Never null and at least of size 1 - * @since 6.7.2 Changed so more than one space in a row works as one space. - */ - private static String[] toTrimmedTokens(String s, char sep) - { - int toks = 0, sSize = s.length(); - boolean disregardDoubles = sep == ' '; - - // Count the sep:s - int p = 0; - for(int i = 0; i < sSize; i++) { - char c = s.charAt(i); - if (c == '(') { - p++; - } else if (c == ')') { - p--; - } else if (p == 0 && c == sep) { - toks++; - while (disregardDoubles && i < sSize - 1 && s.charAt(i + 1) == ' ') - i++; - } - if (p < 0) - throw new IllegalArgumentException("Unbalanced parentheses: '" + s + "'"); - } - if (p != 0) - throw new IllegalArgumentException("Unbalanced parentheses: '" + s + "'"); - - if (toks == 0) - return new String [] {s.trim()}; - - String[] retArr = new String[toks + 1]; - - int st = 0, pNr = 0; - p = 0; - for (int i = 0; i < sSize; i++) { - - char c = s.charAt(i); - if (c == '(') { - p++; - } else if (c == ')') { - p--; - } else if (p == 0 && c == sep) { - retArr[pNr++] = s.substring(st, i).trim(); - st = i + 1; - while (disregardDoubles && i < sSize - 1 && s.charAt(i + 1) == ' ') - i++; - } - } - - retArr[pNr++] = s.substring(st, sSize).trim(); - return retArr; - } - - /** Parses "AAA[BBB]CCC[DDD]EEE" into {"AAA", "BBB", "CCC", "DDD", "EEE", "FFF"}. Handles empty parts. Will always start and end outside - * a [] block so that the number of returned elemets will always be uneven and at least of length 3. - *

- * "|" is interpreted as "][". - * @param s The string. Might be "" but not null. Should be trimmed. - * @return The string divided into elements. Never null and at least of length 3. - * @throws IllegalArgumentException If a [] mismatch of some kind. (If not same [ as ] count or if the interleave.) - */ - private static ArrayList getRowColAndGapsTrimmed(String s) - { - if (s.indexOf('|') != -1) - s = s.replaceAll("\\|", "]["); - - ArrayList retList = new ArrayList(Math.max(s.length() >> 2 + 1, 3)); // Approx return length. - int s0 = 0, s1 = 0; // '[' and ']' count. - int st = 0; // Start of "next token to add". - for (int i = 0, iSz = s.length(); i < iSz; i++) { - char c = s.charAt(i); - if (c == '[') { - s0++; - } else if (c == ']') { - s1++; - } else { - continue; - } - - if (s0 != s1 && (s0 - 1) != s1) - break; // Wrong [ or ] found. Break for throw. - - retList.add(s.substring(st, i).trim()); - st = i + 1; - } - if (s0 != s1) - throw new IllegalArgumentException("'[' and ']' mismatch in row/column format string: " + s); - - if (s0 == 0) { - retList.add(""); - retList.add(s); - retList.add(""); - } else if (retList.size() % 2 == 0) { - retList.add(s.substring(st, s.length())); - } - - return retList; - } - - /** Makes null "", trims and converts to lower case. - * @param s The string - * @return Not null. - */ - public static String prepare(String s) - { - return s != null ? s.trim().toLowerCase() : ""; - } - -// /** Tests to serialize and deserialize the object with both XMLEncoder/Decoder and through Serializable -// * @param o The object to serialize -// * @return The same object after a tri through the process. -// */ -// public static final Object serializeTest(Object o) -// { -// try { -// ByteArrayOutputStream barr = new ByteArrayOutputStream(); -// XMLEncoder enc = new XMLEncoder(barr); -// enc.writeObject(o); -// enc.close(); -// -// XMLDecoder dec = new XMLDecoder(new ByteArrayInputStream(barr.toByteArray())); -// o = dec.readObject(); -// dec.close(); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// -// try { -// ByteArrayOutputStream barr = new ByteArrayOutputStream(); -// ObjectOutputStream oos = new ObjectOutputStream(barr); -// oos.writeObject(o); -// oos.close(); -// -// ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray())); -// o = ois.readObject(); -// ois.close(); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// -// return o; -// } -} diff --git a/src2/net/miginfocom/layout/ContainerWrapper.java b/src2/net/miginfocom/layout/ContainerWrapper.java deleted file mode 100644 index e6b53e0..0000000 --- a/src2/net/miginfocom/layout/ContainerWrapper.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.miginfocom.layout; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** A class that wraps a container that contains components. - */ -public interface ContainerWrapper extends ComponentWrapper -{ - /** Returns the components of the container that wrapper is wrapping. - * @return The components of the container that wrapper is wrapping. Never null. - */ - public abstract ComponentWrapper[] getComponents(); - - /** Returns the number of components that this parent has. - * @return The number of components that this parent has. - */ - public abstract int getComponentCount(); - - /** Returns the LayoutHandler (in Swing terms) that is handling the layout of this container. - * If there exist no such class the method should return the same as {@link #getComponent()}, which is the - * container itself. - * @return The layout handler instance. Never null. - */ - public abstract Object getLayout(); - - /** Returns if this container is using left-to-right component ordering. - * @return If this container is using left-to-right component ordering. - */ - public abstract boolean isLeftToRight(); - - /** Paints a cell to indicate where it is. - * @param x The x coordinate to start the drawing. - * @param y The x coordinate to start the drawing. - * @param width The width to draw/fill - * @param height The height to draw/fill - */ - public abstract void paintDebugCell(int x, int y, int width, int height); -} diff --git a/src2/net/miginfocom/layout/DimConstraint.java b/src2/net/miginfocom/layout/DimConstraint.java deleted file mode 100644 index c36d88c..0000000 --- a/src2/net/miginfocom/layout/DimConstraint.java +++ /dev/null @@ -1,477 +0,0 @@ -package net.miginfocom.layout; - -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.io.ObjectStreamException; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** A simple value holder for a constraint for one dimension. - */ -public final class DimConstraint implements Externalizable -{ - /** How this entity can be resized in the dimension that this constraint represents. - */ - final ResizeConstraint resize = new ResizeConstraint(); - - // Look at the properties' getter/setter methods for explanation - - private String sizeGroup = null; // A "context" compared with equals. - - private BoundSize size = BoundSize.NULL_SIZE; // Min, pref, max. Never null, but sizes can be null. - - private BoundSize gapBefore = null, gapAfter = null; - - private UnitValue align = null; - - - // ************** Only applicable on components! ******************* - - private String endGroup = null; // A "context" compared with equals. - - - // ************** Only applicable on rows/columns! ******************* - - private boolean fill = false; - - private boolean noGrid = false; - - /** Empty constructor. - */ - public DimConstraint() - { - } - - /** Returns the grow priority. Relative priority is used for determining which entities gets the extra space first. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The grow priority. - */ - public int getGrowPriority() - { - return resize.growPrio; - } - - /** Sets the grow priority. Relative priority is used for determining which entities gets the extra space first. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The new grow priority. - */ - public void setGrowPriority(int p) - { - resize.growPrio = p; - } - - /** Returns the grow weight.

- * Grow weight is how flexible the entity should be, relative to other entities, when it comes to growing. null or - * zero mean it will never grow. An entity that has twice the grow weight compared to another entity will get twice - * as much of available space. - *

- * GrowWeight are only compared within the same GrowPrio. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current grow weight. - */ - public Float getGrow() - { - return resize.grow; - } - - /** Sets the grow weight.

- * Grow weight is how flexible the entity should be, relative to other entities, when it comes to growing. null or - * zero mean it will never grow. An entity that has twice the grow weight compared to another entity will get twice - * as much of available space. - *

- * GrowWeight are only compared within the same GrowPrio. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param weight The new grow weight. - */ - public void setGrow(Float weight) - { - resize.grow = weight; - } - - /** Returns the shrink priority. Relative priority is used for determining which entities gets smaller first when space is scarce. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The shrink priority. - */ - public int getShrinkPriority() - { - return resize.shrinkPrio; - } - - /** Sets the shrink priority. Relative priority is used for determining which entities gets smaller first when space is scarce. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param p The new shrink priority. - */ - public void setShrinkPriority(int p) - { - resize.shrinkPrio = p; - } - - /** Returns the shrink priority. Relative priority is used for determining which entities gets smaller first when space is scarce. - * Shrink weight is how flexible the entity should be, relative to other entities, when it comes to shrinking. null or - * zero mean it will never shrink (default). An entity that has twice the shrink weight compared to another entity will get twice - * as much of available space. - *

- * Shrink(Weight) are only compared within the same ShrinkPrio. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current shrink weight. - */ - public Float getShrink() - { - return resize.shrink; - } - - /** Sets the shrink priority. Relative priority is used for determining which entities gets smaller first when space is scarce. - * Shrink weight is how flexible the entity should be, relative to other entities, when it comes to shrinking. null or - * zero mean it will never shrink (default). An entity that has twice the shrink weight compared to another entity will get twice - * as much of available space. - *

- * Shrink(Weight) are only compared within the same ShrinkPrio. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param weight The new shrink weight. - */ - public void setShrink(Float weight) - { - resize.shrink = weight; - } - - public UnitValue getAlignOrDefault(boolean isCols) - { - if (align != null) - return align; - - if (isCols) - return UnitValue.LEADING; - - return fill || PlatformDefaults.getDefaultRowAlignmentBaseline() == false ? UnitValue.CENTER : UnitValue.BASELINE_IDENTITY; - } - - /** Returns the alignment used either as a default value for sub-entities or for this entity. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The alignment. - */ - public UnitValue getAlign() - { - return align; - } - - /** Sets the alignment used wither as a default value for sub-entities or for this entity. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param uv The new shrink priority. E.g. {@link UnitValue#CENTER} or {@link net.miginfocom.layout.UnitValue#LEADING}. - */ - public void setAlign(UnitValue uv) - { - this.align = uv; - } - - /** Returns the gap after this entity. The gap is an empty space and can have a min/preferred/maximum size so that it can shrink and - * grow depending on available space. Gaps are against other entities' edges and not against other entities' gaps. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The gap after this entity - */ - public BoundSize getGapAfter() - { - return gapAfter; - } - - /** Sets the gap after this entity. The gap is an empty space and can have a min/preferred/maximum size so that it can shrink and - * grow depending on available space. Gaps are against other entities' edges and not against other entities' gaps. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The new gap. - * @see net.miginfocom.layout.ConstraintParser#parseBoundSize(String, boolean, boolean) - */ - public void setGapAfter(BoundSize size) - { - this.gapAfter = size; - } - - boolean hasGapAfter() - { - return gapAfter != null && gapAfter.isUnset() == false; - } - - boolean isGapAfterPush() - { - return gapAfter != null && gapAfter.getGapPush(); - } - - /** Returns the gap before this entity. The gap is an empty space and can have a min/preferred/maximum size so that it can shrink and - * grow depending on available space. Gaps are against other entities' edges and not against other entities' gaps. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The gap before this entity - */ - public BoundSize getGapBefore() - { - return gapBefore; - } - - /** Sets the gap before this entity. The gap is an empty space and can have a min/preferred/maximum size so that it can shrink and - * grow depending on available space. Gaps are against other entities' edges and not against other entities' gaps. - *

- * See also {@link net.miginfocom.layout.ConstraintParser#parseBoundSize(String, boolean, boolean)}. - * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The new gap. - */ - public void setGapBefore(BoundSize size) - { - this.gapBefore = size; - } - - boolean hasGapBefore() - { - return gapBefore != null && gapBefore.isUnset() == false; - } - - boolean isGapBeforePush() - { - return gapBefore != null && gapBefore.getGapPush(); - } - - /** Returns the min/preferred/max size for the entity in the dimension that this object describes. - *

- * See also {@link net.miginfocom.layout.ConstraintParser#parseBoundSize(String, boolean, boolean)}. - * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current size. Never null since v3.5. - */ - public BoundSize getSize() - { - return size; - } - - /** Sets the min/preferred/max size for the entity in the dimension that this object describes. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param size The new size. May be null. - */ - public void setSize(BoundSize size) - { - if (size != null) - size.checkNotLinked(); - this.size = size; - } - - /** Returns the size group that this entity should be in for the dimension that this object is describing. - * If this constraint is in a size group that is specified here. null means no size group - * and all other values are legal. Comparison with .equals(). Components/columns/rows in the same size group - * will have the same min/preferred/max size; that of the largest in the group for the first two and the - * smallest for max. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current size group. May be null. - */ - public String getSizeGroup() - { - return sizeGroup; - } - - /** Sets the size group that this entity should be in for the dimension that this object is describing. - * If this constraint is in a size group that is specified here. null means no size group - * and all other values are legal. Comparison with .equals(). Components/columns/rows in the same size group - * will have the same min/preferred/max size; that of the largest in the group for the first two and the - * smallest for max. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s The new size group. null disables size grouping. - */ - public void setSizeGroup(String s) - { - sizeGroup = s; - } - - // ************** Only applicable on components ! ******************* - - /** Returns the end group that this entity should be in for the dimension that this object is describing. - * If this constraint is in an end group that is specified here. null means no end group - * and all other values are legal. Comparison with .equals(). Components in the same end group - * will have the same end coordinate. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return The current end group. null may be returned. - */ - public String getEndGroup() - { - return endGroup; - } - - /** Sets the end group that this entity should be in for the dimension that this object is describing. - * If this constraint is in an end group that is specified here. null means no end group - * and all other values are legal. Comparison with .equals(). Components in the same end group - * will have the same end coordinate. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s The new end group. null disables end grouping. - */ - public void setEndGroup(String s) - { - endGroup = s; - } - - // ************** Not applicable on components below ! ******************* - - /** Returns if the component in the row/column that this constraint should default be grown in the same dimension that - * this constraint represents (width for column and height for a row). - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return true means that components should grow. - */ - public boolean isFill() - { - return fill; - } - - /** Sets if the component in the row/column that this constraint should default be grown in the same dimension that - * this constraint represents (width for column and height for a row). - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param b true means that components should grow. - */ - public void setFill(boolean b) - { - fill = b; - } - - /** Returns if the row/column should default to flow and not to grid behaviour. This means that the whole row/column - * will be one cell and all components will end up in that cell. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return true means that the whole row/column should be one cell. - */ - public boolean isNoGrid() - { - return noGrid; - } - - /** Sets if the row/column should default to flow and not to grid behaviour. This means that the whole row/column - * will be one cell and all components will end up in that cell. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param b true means that the whole row/column should be one cell. - */ - public void setNoGrid(boolean b) - { - this.noGrid = b; - } - - /** Returns the gaps as pixel values. - * @param parent The parent. Used to get the pixel values. - * @param defGap The default gap to use if there is no gap set on this object (i.e. it is null). - * @param refSize The reference size used to get the pixel sizes. - * @param before IF it is the gap before rather than the gap after to return. - * @return The [min,preferred,max] sizes for the specified gap. Uses {@link net.miginfocom.layout.LayoutUtil#NOT_SET} - * for gap sizes that are null. Returns null if there was no gap specified. A new and free to use array. - */ - int[] getRowGaps(ContainerWrapper parent, BoundSize defGap, int refSize, boolean before) - { - BoundSize gap = before ? gapBefore : gapAfter; - if (gap == null || gap.isUnset()) - gap = defGap; - - if (gap == null || gap.isUnset()) - return null; - - int[] ret = new int[3]; - for (int i = LayoutUtil.MIN; i <= LayoutUtil.MAX; i++) { - UnitValue uv = gap.getSize(i); - ret[i] = uv != null ? uv.getPixels(refSize, parent, null) : LayoutUtil.NOT_SET; - } - return ret; - } - - /** Returns the gaps as pixel values. - * @param parent The parent. Used to get the pixel values. - * @param comp The component that the gap is for. If not for a component it is null. - * @param adjGap The gap that the adjacent component, if any, has towards comp. - * @param adjacentComp The adjacent component if any. May be null. - * @param refSize The reference size used to get the pixel sizes. - * @param adjacentSide What side the adjacentComp is on. 0 = top, 1 = left, 2 = bottom, 3 = right. - * @param tag The tag string that the component might be tagged with in the component constraints. May be null. - * @param isLTR If it is left-to-right. - * @return The [min,preferred,max] sizes for the specified gap. Uses {@link net.miginfocom.layout.LayoutUtil#NOT_SET} - * for gap sizes that are null. Returns null if there was no gap specified. A new and free to use array. - */ - int[] getComponentGaps(ContainerWrapper parent, ComponentWrapper comp, BoundSize adjGap, ComponentWrapper adjacentComp, String tag, int refSize, int adjacentSide, boolean isLTR) - { - BoundSize gap = adjacentSide < 2 ? gapBefore : gapAfter; - - boolean hasGap = gap != null && gap.getGapPush(); - if ((gap == null || gap.isUnset()) && (adjGap == null || adjGap.isUnset()) && comp != null) - gap = PlatformDefaults.getDefaultComponentGap(comp, adjacentComp, adjacentSide + 1, tag, isLTR); - - if (gap == null) - return hasGap ? new int[] {0, 0, LayoutUtil.NOT_SET} : null; - - int[] ret = new int[3]; - for (int i = LayoutUtil.MIN; i <= LayoutUtil.MAX; i++) { - UnitValue uv = gap.getSize(i); - ret[i] = uv != null ? uv.getPixels(refSize, parent, null) : LayoutUtil.NOT_SET; - } - return ret; - } - - // ************************************************ - // Persistence Delegate and Serializable combined. - // ************************************************ - - private Object readResolve() throws ObjectStreamException - { - return LayoutUtil.getSerializedObject(this); - } - - @Override - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException - { - LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in)); - } - - @Override - public void writeExternal(ObjectOutput out) throws IOException - { - if (getClass() == DimConstraint.class) - LayoutUtil.writeAsXML(out, this); - } -} diff --git a/src2/net/miginfocom/layout/Grid.java b/src2/net/miginfocom/layout/Grid.java deleted file mode 100644 index ec56de4..0000000 --- a/src2/net/miginfocom/layout/Grid.java +++ /dev/null @@ -1,2496 +0,0 @@ -package net.miginfocom.layout; - - -import java.lang.ref.WeakReference; -import java.util.*; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** Holds components in a grid. Does most of the logic behind the layout manager. - */ -public final class Grid -{ - public static final boolean TEST_GAPS = true; - - private static final Float[] GROW_100 = new Float[] {ResizeConstraint.WEIGHT_100}; - - private static final DimConstraint DOCK_DIM_CONSTRAINT = new DimConstraint(); - static { - DOCK_DIM_CONSTRAINT.setGrowPriority(0); - } - - /** This is the maximum grid position for "normal" components. Docking components use the space out to - * MAX_DOCK_GRID and below 0. - */ - private static final int MAX_GRID = 30000; - - /** Docking components will use the grid coordinates -MAX_DOCK_GRID -> 0 and MAX_GRID -> MAX_DOCK_GRID. - */ - private static final int MAX_DOCK_GRID = 32767; - - /** A constraint used for gaps. - */ - private static final ResizeConstraint GAP_RC_CONST = new ResizeConstraint(200, ResizeConstraint.WEIGHT_100, 50, null); - private static final ResizeConstraint GAP_RC_CONST_PUSH = new ResizeConstraint(200, ResizeConstraint.WEIGHT_100, 50, ResizeConstraint.WEIGHT_100); - - /** Used for components that doesn't have a CC set. Not that it's really really important that the CC is never changed in this Grid class. - */ - private static final CC DEF_CC = new CC(); - - /** The constraints. Never null. - */ - private final LC lc; - - /** The parent that is layout out and this grid is done for. Never null. - */ - private final ContainerWrapper container; - - /** An x, y array implemented as a sparse array to accommodate for any grid size without wasting memory (or rather 15 bit (0-MAX_GRID * 0-MAX_GRID). - */ - private final LinkedHashMap grid = new LinkedHashMap(); // [(y << 16) + x] -> Cell. null key for absolute positioned compwraps - - private HashMap wrapGapMap = null; // Row or Column index depending in the dimension that "wraps". Normally row indexes but may be column indexes if "flowy". 0 means before first row/col. - - /** The size of the grid. Row count and column count. - */ - private final TreeSet rowIndexes = new TreeSet(), colIndexes = new TreeSet(); - - /** The row and column specifications. - */ - private final AC rowConstr, colConstr; - - /** The in the constructor calculated min/pref/max sizes of the rows and columns. - */ - private FlowSizeSpec colFlowSpecs = null, rowFlowSpecs = null; - - /** Components that are connections in one dimension (such as baseline alignment for instance) are grouped together and stored here. - * One for each row/column. - */ - private final ArrayList[] colGroupLists, rowGroupLists; //[(start)row/col number] - - /** The in the constructor calculated min/pref/max size of the whole grid. - */ - private int[] width = null, height = null; - - /** If debug is on contains the bounds for things to paint when calling {@link ContainerWrapper#paintDebugCell(int, int, int, int)} - */ - private ArrayList debugRects = null; // [x, y, width, height] - - /** If any of the absolute coordinates for component bounds has links the name of the target is in this Set. - * Since it requires some memory and computations this is checked at the creation so that - * the link information is only created if needed later. - *

- * The boolean is true for groups id:s and null for normal id:s. - */ - private HashMap linkTargetIDs = null; - - private final int dockOffY, dockOffX; - - private final Float[] pushXs, pushYs; - - private final ArrayList callbackList; - - /** Constructor. - * @param container The container that will be laid out. - * @param lc The form flow constraints. - * @param rowConstr The rows specifications. If more cell rows are required, the last element will be used for when there is no corresponding element in this array. - * @param colConstr The columns specifications. If more cell rows are required, the last element will be used for when there is no corresponding element in this array. - * @param ccMap The map containing the parsed constraints for each child component of parent. Will not be altered. Can have null CC which will use a common - * cached one. - * @param callbackList A list of callbacks or null if none. Will not be altered. - */ - public Grid(ContainerWrapper container, LC lc, AC rowConstr, AC colConstr, Map ccMap, ArrayList callbackList) - { - this.lc = lc; - this.rowConstr = rowConstr; - this.colConstr = colConstr; - this.container = container; - this.callbackList = callbackList; - - int wrap = lc.getWrapAfter() != 0 ? lc.getWrapAfter() : (lc.isFlowX() ? colConstr : rowConstr).getConstaints().length; - boolean useVisualPadding = lc.isVisualPadding(); - - final ComponentWrapper[] comps = container.getComponents(); - - boolean hasTagged = false; // So we do not have to sort if it will not do any good - boolean hasPushX = false, hasPushY = false; - boolean hitEndOfRow = false; - final int[] cellXY = new int[2]; - final ArrayList spannedRects = new ArrayList(2); - - final DimConstraint[] specs = (lc.isFlowX() ? rowConstr : colConstr).getConstaints(); - - int sizeGroupsX = 0, sizeGroupsY = 0; - int[] dockInsets = null; // top, left, bottom, right insets for docks. - - LinkHandler.clearTemporaryBounds(container.getLayout()); - - for (int i = 0; i < comps.length;) { - ComponentWrapper comp = comps[i]; - CC rootCc = getCC(comp, ccMap); - - addLinkIDs(rootCc); - - int hideMode = comp.isVisible() ? -1 : rootCc.getHideMode() != -1 ? rootCc.getHideMode() : lc.getHideMode(); - - if (hideMode == 3) { // To work with situations where there are components that does not have a layout manager, or not this one. - setLinkedBounds(comp, rootCc, comp.getX(), comp.getY(), comp.getWidth(), comp.getHeight(), rootCc.isExternal()); - i++; - continue; // The "external" component should not be handled further. - } - - if (rootCc.getHorizontal().getSizeGroup() != null) - sizeGroupsX++; - if (rootCc.getVertical().getSizeGroup() != null) - sizeGroupsY++; - - // Special treatment of absolute positioned components. - if (getPos(comp, rootCc) != null || rootCc.isExternal()) { - - CompWrap cw = new CompWrap(comp, rootCc, hideMode, useVisualPadding); - Cell cell = grid.get(null); - if (cell == null) { - grid.put(null, new Cell(cw)); - } else { - cell.compWraps.add(cw); - } - - if (!rootCc.isBoundsInGrid() || rootCc.isExternal()) { - setLinkedBounds(comp, rootCc, comp.getX(), comp.getY(), comp.getWidth(), comp.getHeight(), rootCc.isExternal()); - i++; - continue; - } - } - - if (rootCc.getDockSide() != -1) { - if (dockInsets == null) - dockInsets = new int[] {-MAX_DOCK_GRID, -MAX_DOCK_GRID, MAX_DOCK_GRID, MAX_DOCK_GRID}; - - addDockingCell(dockInsets, rootCc.getDockSide(), new CompWrap(comp, rootCc, hideMode, useVisualPadding)); - i++; - continue; - } - - Boolean cellFlowX = rootCc.getFlowX(); - Cell cell = null; - - if (rootCc.isNewline()) { - wrap(cellXY, rootCc.getNewlineGapSize()); - } else if (hitEndOfRow) { - wrap(cellXY, null); - } - hitEndOfRow = false; - - final boolean isRowInGridMode = !lc.isNoGrid() && !((DimConstraint) LayoutUtil.getIndexSafe(specs, lc.isFlowX() ? cellXY[1] : cellXY[0])).isNoGrid(); - - // Move to a free y, x if no absolute grid specified - int cx = rootCc.getCellX(); - int cy = rootCc.getCellY(); - if ((cx < 0 || cy < 0) && isRowInGridMode && rootCc.getSkip() == 0) { // 3.7.2: If skip, don't find an empty cell first. - while (!isCellFree(cellXY[1], cellXY[0], spannedRects)) { - if (Math.abs(increase(cellXY, 1)) >= wrap) - wrap(cellXY, null); - } - } else { - if (cx >= 0 && cy >= 0) { - if (cy >= 0) { - cellXY[0] = cx; - cellXY[1] = cy; - } else { // Only one coordinate is specified. Use the current row (flowx) or column (flowy) to fill in. - if (lc.isFlowX()) { - cellXY[0] = cx; - } else { - cellXY[1] = cx; - } - } - ensureIndexSizes(cx, cy); - } - cell = getCell(cellXY[1], cellXY[0]); // Might be null - } - - // Skip a number of cells. Changed for 3.6.1 to take wrap into account and thus "skip" to the next and possibly more rows. - for (int s = 0, skipCount = rootCc.getSkip(); s < skipCount; s++) { - do { - if (Math.abs(increase(cellXY, 1)) >= wrap) - wrap(cellXY, null); - } while (!isCellFree(cellXY[1], cellXY[0], spannedRects)); - } - - // If cell is not created yet, create it and set it. - if (cell == null) { - int spanx = Math.min(!isRowInGridMode && lc.isFlowX() ? LayoutUtil.INF : rootCc.getSpanX(), MAX_GRID - cellXY[0]); - int spany = Math.min(!isRowInGridMode && !lc.isFlowX() ? LayoutUtil.INF : rootCc.getSpanY(), MAX_GRID - cellXY[1]); - - cell = new Cell(spanx, spany, cellFlowX != null ? cellFlowX : lc.isFlowX()); - - setCell(cellXY[1], cellXY[0], cell); - - // Add a rectangle so we can know that spanned cells occupy more space. - if (spanx > 1 || spany > 1) - spannedRects.add(new int[] {cellXY[0], cellXY[1], spanx, spany}); - } - - // Add the one, or all, components that split the grid position to the same Cell. - boolean wrapHandled = false; - int splitLeft = isRowInGridMode ? rootCc.getSplit() - 1 : LayoutUtil.INF; - boolean splitExit = false; - final boolean spanRestOfRow = (lc.isFlowX() ? rootCc.getSpanX() : rootCc.getSpanY()) == LayoutUtil.INF; - - for (; splitLeft >= 0 && i < comps.length; splitLeft--) { - ComponentWrapper compAdd = comps[i]; - CC cc = getCC(compAdd, ccMap); - - addLinkIDs(cc); - - boolean visible = compAdd.isVisible(); - hideMode = visible ? -1 : cc.getHideMode() != -1 ? cc.getHideMode() : lc.getHideMode(); - - if (cc.isExternal() || hideMode == 3) { - i++; - splitLeft++; // Added for 3.5.5 so that these components does not "take" a split slot. - continue; // To work with situations where there are components that does not have a layout manager, or not this one. - } - - hasPushX |= (visible || hideMode > 1) && (cc.getPushX() != null); - hasPushY |= (visible || hideMode > 1) && (cc.getPushY() != null); - - if (cc != rootCc) { // If not first in a cell - if (cc.isNewline() || !cc.isBoundsInGrid() || cc.getDockSide() != -1) - break; - - if (splitLeft > 0 && cc.getSkip() > 0) { - splitExit = true; - break; - } - } - - CompWrap cw = new CompWrap(compAdd, cc, hideMode, useVisualPadding); - cell.compWraps.add(cw); - cell.hasTagged |= cc.getTag() != null; - hasTagged |= cell.hasTagged; - - if (cc != rootCc) { - if (cc.getHorizontal().getSizeGroup() != null) - sizeGroupsX++; - if (cc.getVertical().getSizeGroup() != null) - sizeGroupsY++; - } - - i++; - - if ((cc.isWrap() || (spanRestOfRow && splitLeft == 0))) { - if (cc.isWrap()) { - wrap(cellXY, cc.getWrapGapSize()); - } else { - hitEndOfRow = true; - } - wrapHandled = true; - break; - } - } - - if (!wrapHandled && isRowInGridMode) { - int span = lc.isFlowX() ? cell.spanx : cell.spany; - if (Math.abs((lc.isFlowX() ? cellXY[0] : cellXY[1])) + span >= wrap) { - hitEndOfRow = true; - } else { - increase(cellXY, splitExit ? span - 1 : span); - } - } - } - - // If there were size groups, calculate the largest values in the groups (for min/pref/max) and enforce them on the rest in the group. - if (sizeGroupsX > 0 || sizeGroupsY > 0) { - HashMap sizeGroupMapX = sizeGroupsX > 0 ? new HashMap(sizeGroupsX) : null; - HashMap sizeGroupMapY = sizeGroupsY > 0 ? new HashMap(sizeGroupsY) : null; - ArrayList sizeGroupCWs = new ArrayList(Math.max(sizeGroupsX, sizeGroupsY)); - - for (Cell cell : grid.values()) { - for (int i = 0; i < cell.compWraps.size(); i++) { - CompWrap cw = cell.compWraps.get(i); - String sgx = cw.cc.getHorizontal().getSizeGroup(); - String sgy = cw.cc.getVertical().getSizeGroup(); - - if (sgx != null || sgy != null) { - if (sgx != null && sizeGroupMapX != null) - addToSizeGroup(sizeGroupMapX, sgx, cw.getSizes(true)); - if (sgy != null && sizeGroupMapY != null) - addToSizeGroup(sizeGroupMapY, sgy, cw.getSizes(false)); - sizeGroupCWs.add(cw); - } - } - } - - // Set/equalize the sizeGroups to same the values. - for (CompWrap cw : sizeGroupCWs) { - if (sizeGroupMapX != null) - cw.setForcedSizes(sizeGroupMapX.get(cw.cc.getHorizontal().getSizeGroup()), true); // Target method handles null sizes - if (sizeGroupMapY != null) - cw.setForcedSizes(sizeGroupMapY.get(cw.cc.getVertical().getSizeGroup()), false); // Target method handles null sizes - } - } // Component loop - - if (hasTagged) - sortCellsByPlatform(grid.values(), container); - - // Calculate gaps now that the cells are filled and we know all adjacent components. - boolean ltr = LayoutUtil.isLeftToRight(lc, container); - for (Cell cell : grid.values()) { - ArrayList cws = cell.compWraps; - - for (int i = 0, lastI = cws.size() - 1; i <= lastI; i++) { - CompWrap cw = cws.get(i); - ComponentWrapper cwBef = i > 0 ? cws.get(i - 1).comp : null; - ComponentWrapper cwAft = i < lastI ? cws.get(i + 1).comp : null; - - String tag = getCC(cw.comp, ccMap).getTag(); - CC ccBef = cwBef != null ? getCC(cwBef, ccMap) : null; - CC ccAft = cwAft != null ? getCC(cwAft, ccMap) : null; - - cw.calcGaps(cwBef, ccBef, cwAft, ccAft, tag, cell.flowx, ltr); - } - } - - dockOffX = getDockInsets(colIndexes); - dockOffY = getDockInsets(rowIndexes); - - // Add synthetic indexes for empty rows and columns so they can get a size - ensureIndexSizes(colConstr.getCount(), rowConstr.getCount()); - - colGroupLists = divideIntoLinkedGroups(false); - rowGroupLists = divideIntoLinkedGroups(true); - - pushXs = hasPushX || lc.isFillX() ? getDefaultPushWeights(false) : null; - pushYs = hasPushY || lc.isFillY() ? getDefaultPushWeights(true) : null; - - if (LayoutUtil.isDesignTime(container)) - saveGrid(container, grid); - } - - private void ensureIndexSizes(int colCount, int rowCount) - { - for (int i = 0; i < colCount; i++) - colIndexes.add(i); - for (int i = 0; i < rowCount; i++) - rowIndexes.add(i); - } - - private static CC getCC(ComponentWrapper comp, Map ccMap) - { - CC cc = ccMap.get(comp); - return cc != null ? cc : DEF_CC; - } - - private void addLinkIDs(CC cc) - { - String[] linkIDs = cc.getLinkTargets(); - for (String linkID : linkIDs) { - if (linkTargetIDs == null) - linkTargetIDs = new HashMap(); - linkTargetIDs.put(linkID, null); - } - } - - /** If the container (parent) that this grid is laying out has changed its bounds, call this method to - * clear any cached values min/pref/max sizes of the components and rows/columns. - *

- * If any component can have changed cell the grid needs to be recreated. - */ - public void invalidateContainerSize() - { - colFlowSpecs = null; - invalidateComponentSizes(); - } - - private void invalidateComponentSizes() - { - for (Cell cell : grid.values()) { - for (CompWrap compWrap : cell.compWraps) - compWrap.invalidateSizes(); - } - } - - /** - * @deprecated since 5.0 Last boolean is not needed and is gotten from the new {@link net.miginfocom.layout.ComponentWrapper#getContentBias()} instead; - */ - public boolean layout(int[] bounds, UnitValue alignX, UnitValue alignY, boolean debug, boolean notUsed) - { - return layoutImpl(bounds, alignX, alignY, debug, false); - } - - /** Does the actual layout. Uses many values calculated in the constructor. - * @param bounds The bounds to layout against. Normally that of the parent. [x, y, width, height]. - * @param alignX The alignment for the x-axis. Can be null. - * @param alignY The alignment for the y-axis. Can be null. - * @param debug If debug information should be saved in {@link #debugRects}. - * @return If the layout has changed the preferred size and there is need for a new layout. This can happen if one or more components - * in the grid has a content bias according to {@link net.miginfocom.layout.ComponentWrapper#getContentBias()}. - * @since 5.0 - */ - public boolean layout(int[] bounds, UnitValue alignX, UnitValue alignY, boolean debug) - { - return layoutImpl(bounds, alignX, alignY, debug, false); - } - - /** Does the actual layout. Uses many values calculated in the constructor. - * @param bounds The bounds to layout against. Normally that of the parent. [x, y, width, height]. - * @param alignX The alignment for the x-axis. Can be null. - * @param alignY The alignment for the y-axis. Can be null. - * @param debug If debug information should be saved in {@link #debugRects}. - * @param trialRun If true the bounds calculated will not be transferred to the components. Only the internal size - * of the components will be calculated. - * @return If the layout has changed the preferred size and there is need for a new layout. This can happen if one or more components - * in the grid has a content bias according to {@link net.miginfocom.layout.ComponentWrapper#getContentBias()}. - * @since 5.0 - */ - private boolean layoutImpl(int[] bounds, UnitValue alignX, UnitValue alignY, boolean debug, boolean trialRun) - { - if (debug) - debugRects = new ArrayList(); - - if (colFlowSpecs == null) - checkSizeCalcs(bounds[2], bounds[3]); - - resetLinkValues(true, true); - - layoutInOneDim(bounds[2], alignX, false, pushXs); - layoutInOneDim(bounds[3], alignY, true, pushYs); - - HashMap endGrpXMap = null, endGrpYMap = null; - int compCount = container.getComponentCount(); - - // Transfer the calculated bound from the ComponentWrappers to the actual Components. - boolean addVisualPadding = lc.isVisualPadding(); - boolean layoutAgain = false; - if (compCount > 0) { - for (int j = 0; j < (linkTargetIDs != null ? 2 : 1); j++) { // First do the calculations (maybe more than once) then set the bounds when done - boolean doAgain; - int count = 0; - do { - doAgain = false; - for (Cell cell : grid.values()) { - for (CompWrap cw : cell.compWraps) { - if (j == 0) { - doAgain |= doAbsoluteCorrections(cw, bounds); - if (!doAgain) { // If we are going to do this again, do not bother this time around - if (cw.cc.getHorizontal().getEndGroup() != null) - endGrpXMap = addToEndGroup(endGrpXMap, cw.cc.getHorizontal().getEndGroup(), cw.x + cw.w); - - if (cw.cc.getVertical().getEndGroup() != null) - endGrpYMap = addToEndGroup(endGrpYMap, cw.cc.getVertical().getEndGroup(), cw.y + cw.h); - } - - // @since 3.7.2 Needed or absolute "pos" pointing to "visual" or "container" didn't work if - // their bounds changed during the layout cycle. At least not in SWT. - if (linkTargetIDs != null && (linkTargetIDs.containsKey("visual") || linkTargetIDs.containsKey("container"))) { - layoutAgain = true; - } - } - - if (linkTargetIDs == null || j == 1) { - if (cw.cc.getHorizontal().getEndGroup() != null) - cw.w = endGrpXMap.get(cw.cc.getHorizontal().getEndGroup()) - cw.x; - - if (cw.cc.getVertical().getEndGroup() != null) - cw.h = endGrpYMap.get(cw.cc.getVertical().getEndGroup()) - cw.y; - - cw.x += bounds[0]; - cw.y += bounds[1]; - - if (!trialRun) - cw.transferBounds(addVisualPadding); - - if (callbackList != null) { - for (LayoutCallback callback : callbackList) - callback.correctBounds(cw.comp); - } - } - } - } - clearGroupLinkBounds(); - if (++count > ((compCount << 3) + 10)) { - System.err.println("Unstable cyclic dependency in absolute linked values."); - break; - } - - } while (doAgain); - } - } - - // Add debug shapes for the "cells". Use the CompWraps as base for inding the cells. - if (debug) { - for (Cell cell : grid.values()) { - ArrayList compWraps = cell.compWraps; - for (CompWrap cw : compWraps) { - LinkedDimGroup hGrp = getGroupContaining(colGroupLists, cw); - LinkedDimGroup vGrp = getGroupContaining(rowGroupLists, cw); - - if (hGrp != null && vGrp != null) - debugRects.add(new int[]{hGrp.lStart + bounds[0] - (hGrp.fromEnd ? hGrp.lSize : 0), vGrp.lStart + bounds[1] - (vGrp.fromEnd ? vGrp.lSize : 0), hGrp.lSize, vGrp.lSize}); - } - } - } - return layoutAgain; - } - - public void paintDebug() - { - if (debugRects != null) { - container.paintDebugOutline(lc.isVisualPadding()); - - ArrayList painted = new ArrayList(); - for (int[] r : debugRects) { - if (!painted.contains(r)) { - container.paintDebugCell(r[0], r[1], r[2], r[3]); - painted.add(r); - } - } - - for (Cell cell : grid.values()) { - ArrayList compWraps = cell.compWraps; - for (CompWrap compWrap : compWraps) - compWrap.comp.paintDebugOutline(lc.isVisualPadding()); - } - } - } - - public ContainerWrapper getContainer() - { - return container; - } - - public final int[] getWidth() - { - return getWidth(lastRefHeight); - } - - public final int[] getWidth(int refHeight) - { - checkSizeCalcs(lastRefWidth, refHeight); - return width.clone(); - } - - public final int[] getHeight() - { - return getHeight(lastRefWidth); - } - - public final int[] getHeight(int refWidth) - { - checkSizeCalcs(refWidth, lastRefHeight); - return height.clone(); - } - - private int lastRefWidth = 0, lastRefHeight = 0; - - private void checkSizeCalcs(int refWidth, int refHeight) - { - if (colFlowSpecs == null) - calcGridSizes(refWidth, refHeight); - - if ((refWidth > 0 && refWidth != lastRefWidth) || (refHeight > 0 && refHeight != lastRefHeight)) { - int[] refBounds = new int[] {0, 0, (refWidth > 0 ? refWidth : width[LayoutUtil.PREF]), (refHeight > 0 ? refHeight : height[LayoutUtil.PREF])}; - layoutImpl(refBounds, null, null, false, true); - calcGridSizes(refWidth, refHeight); - } - - lastRefWidth = refWidth; - lastRefHeight = refHeight; - } - - private void calcGridSizes(int refWidth, int refHeight) - { - // Note, in these calls the grid can be invalidated and specs set to null. Therefore use local versions. - FlowSizeSpec colSpecs = calcRowsOrColsSizes(true, refWidth); - FlowSizeSpec rowSpecs = calcRowsOrColsSizes(false, refHeight); - - colFlowSpecs = colSpecs; - rowFlowSpecs = rowSpecs; - - width = getMinPrefMaxSumSize(true, colSpecs.sizes); - height = getMinPrefMaxSumSize(false, rowSpecs.sizes); - - if (linkTargetIDs == null) { - resetLinkValues(false, true); - } else { - // This call makes some components flicker on SWT. They get their bounds changed twice since - // the change might affect the absolute size adjustment below. There's no way around this that - // I know of. - layout(new int[]{0, 0, refWidth, refHeight}, null, null, false); - resetLinkValues(false, false); - } - - adjustSizeForAbsolute(true); - adjustSizeForAbsolute(false); - } - - private UnitValue[] getPos(ComponentWrapper cw, CC cc) - { - UnitValue[] callbackPos = null; - if (callbackList != null) { - for (int i = 0; i < callbackList.size() && callbackPos == null; i++) - callbackPos = callbackList.get(i).getPosition(cw); // NOT a copy! - } - - // If one is null, return the other (which many also be null) - UnitValue[] ccPos = cc.getPos(); // A copy!! - if (callbackPos == null || ccPos == null) - return callbackPos != null ? callbackPos : ccPos; - - // Merge - for (int i = 0; i < 4; i++) { - UnitValue cbUv = callbackPos[i]; - if (cbUv != null) - ccPos[i] = cbUv; - } - - return ccPos; - } - - private BoundSize[] getCallbackSize(ComponentWrapper cw) - { - if (callbackList != null) { - for (LayoutCallback callback : callbackList) { - BoundSize[] bs = callback.getSize(cw); // NOT a copy! - if (bs != null) - return bs; - } - } - return null; - } - - private static int getDockInsets(TreeSet set) - { - int c = 0; - for (Integer i : set) { - if (i < -MAX_GRID) { - c++; - } else { - break; // Since they are sorted we can break - } - } - return c; - } - - /** - * @param cw Never null. - * @param cc Never null. - * @param external The bounds should be stored even if they are not in {@link #linkTargetIDs}. - * @return If a change has been made. - */ - private boolean setLinkedBounds(ComponentWrapper cw, CC cc, int x, int y, int w, int h, boolean external) - { - String id = cc.getId() != null ? cc.getId() : cw.getLinkId(); - if (id == null) - return false; - - String gid = null; - int grIx = id.indexOf('.'); - if (grIx != -1 ) { - gid = id.substring(0, grIx); - id = id.substring(grIx + 1); - } - - Object lay = container.getLayout(); - boolean changed = false; - if (external || (linkTargetIDs != null && linkTargetIDs.containsKey(id))) - changed = LinkHandler.setBounds(lay, id, x, y, w, h, !external, false); - - if (gid != null && (external || (linkTargetIDs != null && linkTargetIDs.containsKey(gid)))) { - if (linkTargetIDs == null) - linkTargetIDs = new HashMap(4); - - linkTargetIDs.put(gid, Boolean.TRUE); - changed |= LinkHandler.setBounds(lay, gid, x, y, w, h, !external, true); - } - - return changed; - } - - /** Go to next cell. - * @param p The point to increase - * @param cnt How many cells to advance. - * @return The new value in the "increasing" dimension. - */ - private int increase(int[] p, int cnt) - { - return lc.isFlowX() ? (p[0] += cnt) : (p[1] += cnt); - } - - /** Wraps to the next row or column depending on if horizontal flow or vertical flow is used. - * @param cellXY The point to wrap and thus set either x or y to 0 and increase the other one. - * @param gapSize The gaps size specified in a "wrap XXX" or "newline XXX" or null if none. - */ - private void wrap(int[] cellXY, BoundSize gapSize) - { - boolean flowx = lc.isFlowX(); - cellXY[0] = flowx ? 0 : cellXY[0] + 1; - cellXY[1] = flowx ? cellXY[1] + 1 : 0; - - if (gapSize != null) { - if (wrapGapMap == null) - wrapGapMap = new HashMap(8); - - wrapGapMap.put(cellXY[flowx ? 1 : 0], gapSize); - } - - // add the row/column so that the gap in the last row/col will not be removed. - if (flowx) { - rowIndexes.add(cellXY[1]); - } else { - colIndexes.add(cellXY[0]); - } - } - - /** Sort components (normally buttons in a button bar) so they appear in the correct order. - * @param cells The cells to sort. - * @param parent The parent. - */ - private static void sortCellsByPlatform(Collection cells, ContainerWrapper parent) - { - String order = PlatformDefaults.getButtonOrder(); - String orderLo = order.toLowerCase(); - - int unrelSize = PlatformDefaults.convertToPixels(1, "u", true, 0, parent, null); - - if (unrelSize == UnitConverter.UNABLE) - throw new IllegalArgumentException("'unrelated' not recognized by PlatformDefaults!"); - - int[] gapUnrel = new int[] {unrelSize, unrelSize, LayoutUtil.NOT_SET}; - int[] flGap = new int[] {0, 0, LayoutUtil.NOT_SET}; - - for (Cell cell : cells) { - if (!cell.hasTagged) - continue; - - CompWrap prevCW = null; - boolean nextUnrel = false; - boolean nextPush = false; - ArrayList sortedList = new ArrayList(cell.compWraps.size()); - - for (int i = 0, iSz = orderLo.length(); i < iSz; i++) { - char c = orderLo.charAt(i); - if (c == '+' || c == '_') { - nextUnrel = true; - if (c == '+') - nextPush = true; - } else { - String tag = PlatformDefaults.getTagForChar(c); - if (tag != null) { - for (int j = 0, jSz = cell.compWraps.size(); j < jSz; j++) { - CompWrap cw = cell.compWraps.get(j); - if (tag.equals(cw.cc.getTag())) { - if (Character.isUpperCase(order.charAt(i))) - cw.adjustMinHorSizeUp((int) PlatformDefaults.getMinimumButtonWidthIncludingPadding(0, parent, cw.comp)); - - sortedList.add(cw); - - if (nextUnrel) { - (prevCW != null ? prevCW : cw).mergeGapSizes(gapUnrel, cell.flowx, prevCW == null); - if (nextPush) { - cw.forcedPushGaps = 1; - nextUnrel = false; - nextPush = false; - } - } - - // "unknown" components will always get an Unrelated gap. - if (c == 'u') - nextUnrel = true; - prevCW = cw; - } - } - } - } - } - - // If we have a gap that was supposed to push but no more components was found to but the "gap before" then compensate. - if (sortedList.size() > 0) { - CompWrap cw = sortedList.get(sortedList.size() - 1); - if (nextUnrel) { - cw.mergeGapSizes(gapUnrel, cell.flowx, false); - if (nextPush) - cw.forcedPushGaps |= 2; - } - - // Remove first and last gap if not set explicitly. - if (cw.cc.getHorizontal().getGapAfter() == null) - cw.setGaps(flGap, 3); - - cw = sortedList.get(0); - if (cw.cc.getHorizontal().getGapBefore() == null) - cw.setGaps(flGap, 1); - } - - // Exchange the unsorted CompWraps for the sorted one. - if (cell.compWraps.size() == sortedList.size()) { - cell.compWraps.clear(); - } else { - cell.compWraps.removeAll(sortedList); - } - cell.compWraps.addAll(sortedList); - } - } - - private Float[] getDefaultPushWeights(boolean isRows) - { - ArrayList[] groupLists = isRows ? rowGroupLists : colGroupLists; - - Float[] pushWeightArr = GROW_100; // Only create specific if any of the components have grow. - for (int i = 0, ix = 1; i < groupLists.length; i++, ix += 2) { - ArrayList grps = groupLists[i]; - Float rowPushWeight = null; - for (LinkedDimGroup grp : grps) { - for (int c = 0; c < grp._compWraps.size(); c++) { - CompWrap cw = grp._compWraps.get(c); - int hideMode = cw.comp.isVisible() ? -1 : cw.cc.getHideMode() != -1 ? cw.cc.getHideMode() : lc.getHideMode(); - - Float pushWeight = hideMode < 2 ? (isRows ? cw.cc.getPushY() : cw.cc.getPushX()) : null; - if (rowPushWeight == null || (pushWeight != null && pushWeight > rowPushWeight)) - rowPushWeight = pushWeight; - } - } - - if (rowPushWeight != null) { - if (pushWeightArr == GROW_100) - pushWeightArr = new Float[(groupLists.length << 1) + 1]; - pushWeightArr[ix] = rowPushWeight; - } - } - - return pushWeightArr; - } - - private void clearGroupLinkBounds() - { - if (linkTargetIDs == null) - return; - - for (Map.Entry o : linkTargetIDs.entrySet()) { - if (o.getValue() == Boolean.TRUE) - LinkHandler.clearBounds(container.getLayout(), o.getKey()); - } - } - - private void resetLinkValues(boolean parentSize, boolean compLinks) - { - Object lay = container.getLayout(); - if (compLinks) - LinkHandler.clearTemporaryBounds(lay); - - boolean defIns = !hasDocks(); - - int parW = parentSize ? lc.getWidth().constrain(container.getWidth(), getParentSize(container, true), container) : 0; - int parH = parentSize ? lc.getHeight().constrain(container.getHeight(), getParentSize(container, false), container) : 0; - - int insX = LayoutUtil.getInsets(lc, 0, defIns).getPixels(0, container, null); - int insY = LayoutUtil.getInsets(lc, 1, defIns).getPixels(0, container, null); - int visW = parW - insX - LayoutUtil.getInsets(lc, 2, defIns).getPixels(0, container, null); - int visH = parH - insY - LayoutUtil.getInsets(lc, 3, defIns).getPixels(0, container, null); - - LinkHandler.setBounds(lay, "visual", insX, insY, visW, visH, true, false); - LinkHandler.setBounds(lay, "container", 0, 0, parW, parH, true, false); - } - - /** Returns the {@link net.miginfocom.layout.Grid.LinkedDimGroup} that has the {@link net.miginfocom.layout.Grid.CompWrap} - * cw. - * @param groupLists The lists to search in. - * @param cw The component wrap to find. - * @return The linked group or null if none had the component wrap. - */ - private static LinkedDimGroup getGroupContaining(ArrayList[] groupLists, CompWrap cw) - { - for (ArrayList groups : groupLists) { - for (LinkedDimGroup group : groups) { - ArrayList cwList = group._compWraps; - for (CompWrap aCwList : cwList) { - if (aCwList == cw) - return group; - } - } - } - return null; - } - - private boolean doAbsoluteCorrections(CompWrap cw, int[] bounds) - { - boolean changed = false; - - int[] stSz = getAbsoluteDimBounds(cw, bounds[2], true); - if (stSz != null) - cw.setDimBounds(stSz[0], stSz[1], true); - - stSz = getAbsoluteDimBounds(cw, bounds[3], false); - if (stSz != null) - cw.setDimBounds(stSz[0], stSz[1], false); - - // If there is a link id, store the new bounds. - if (linkTargetIDs != null) - changed = setLinkedBounds(cw.comp, cw.cc, cw.x, cw.y, cw.w, cw.h, false); - - return changed; - } - - /** Adjust grid's width or height for the absolute components' positions. - */ - private void adjustSizeForAbsolute(boolean isHor) - { - int[] curSizes = isHor ? width : height; - - Cell absCell = grid.get(null); - if (absCell == null || absCell.compWraps.size() == 0) - return; - - ArrayList cws = absCell.compWraps; - - int maxEnd = 0; - for (int j = 0, cwSz = absCell.compWraps.size(); j < cwSz + 3; j++) { // "Do Again" max absCell.compWraps.size() + 3 times. - boolean doAgain = false; - for (int i = 0; i < cwSz; i++) { - CompWrap cw = cws.get(i); - int[] stSz = getAbsoluteDimBounds(cw, 0, isHor); - int end = stSz[0] + stSz[1]; - if (maxEnd < end) - maxEnd = end; - - // If there is a link id, store the new bounds. - if (linkTargetIDs != null) - doAgain |= setLinkedBounds(cw.comp, cw.cc, stSz[0], stSz[0], stSz[1], stSz[1], false); - } - if (!doAgain) - break; - - // We need to check this again since the coords may be smaller this round. - maxEnd = 0; - clearGroupLinkBounds(); - } - - maxEnd += LayoutUtil.getInsets(lc, isHor ? 3 : 2, !hasDocks()).getPixels(0, container, null); - - if (curSizes[LayoutUtil.MIN] < maxEnd) - curSizes[LayoutUtil.MIN] = maxEnd; - if (curSizes[LayoutUtil.PREF] < maxEnd) - curSizes[LayoutUtil.PREF] = maxEnd; - } - - private int[] getAbsoluteDimBounds(CompWrap cw, int refSize, boolean isHor) - { - if (cw.cc.isExternal()) { - if (isHor) { - return new int[] {cw.comp.getX(), cw.comp.getWidth()}; - } else { - return new int[] {cw.comp.getY(), cw.comp.getHeight()}; - } - } - - UnitValue[] pad = cw.cc.getPadding(); - - // If no changes do not create a lot of objects - UnitValue[] pos = getPos(cw.comp, cw.cc); - if (pos == null && pad == null) - return null; - - // Set start - int st = isHor ? cw.x : cw.y; - int sz = isHor ? cw.w : cw.h; - - // If absolute, use those coordinates instead. - if (pos != null) { - UnitValue stUV = pos[isHor ? 0 : 1]; - UnitValue endUV = pos[isHor ? 2 : 3]; - - int minSz = cw.getSize(LayoutUtil.MIN, isHor); - int maxSz = cw.getSize(LayoutUtil.MAX, isHor); - sz = Math.min(Math.max(cw.getSize(LayoutUtil.PREF, isHor), minSz), maxSz); - - if (stUV != null) { - st = stUV.getPixels(stUV.getUnit() == UnitValue.ALIGN ? sz : refSize, container, cw.comp); - - if (endUV != null) // if (endUV == null && cw.cc.isBoundsIsGrid() == true) - sz = Math.min(Math.max((isHor ? (cw.x + cw.w) : (cw.y + cw.h)) - st, minSz), maxSz); - } - - if (endUV != null) { - if (stUV != null) { // if (stUV != null || cw.cc.isBoundsIsGrid()) { - sz = Math.min(Math.max(endUV.getPixels(refSize, container, cw.comp) - st, minSz), maxSz); - } else { - st = endUV.getPixels(refSize, container, cw.comp) - sz; - } - } - } - - // If constraint has padding -> correct the start/size - if (pad != null) { - UnitValue uv = pad[isHor ? 1 : 0]; - int p = uv != null ? uv.getPixels(refSize, container, cw.comp) : 0; - st += p; - uv = pad[isHor ? 3 : 2]; - sz += -p + (uv != null ? uv.getPixels(refSize, container, cw.comp) : 0); - } - - return new int[] {st, sz}; - } - - private void layoutInOneDim(int refSize, UnitValue align, boolean isRows, Float[] defaultPushWeights) - { - boolean fromEnd = !(isRows ? lc.isTopToBottom() : LayoutUtil.isLeftToRight(lc, container)); - DimConstraint[] primDCs = (isRows ? rowConstr : colConstr).getConstaints(); - FlowSizeSpec fss = isRows ? rowFlowSpecs : colFlowSpecs; - ArrayList[] rowCols = isRows ? rowGroupLists : colGroupLists; - - int[] rowColSizes = LayoutUtil.calculateSerial(fss.sizes, fss.resConstsInclGaps, defaultPushWeights, LayoutUtil.PREF, refSize); - - if (LayoutUtil.isDesignTime(container)) { - TreeSet indexes = isRows ? rowIndexes : colIndexes; - int[] ixArr = new int[indexes.size()]; - int ix = 0; - for (Integer i : indexes) - ixArr[ix++] = i; - - putSizesAndIndexes(container.getComponent(), rowColSizes, ixArr, isRows); - } - - int curPos = align != null ? align.getPixels(refSize - LayoutUtil.sum(rowColSizes), container, null) : 0; - - if (fromEnd) - curPos = refSize - curPos; - - for (int i = 0 ; i < rowCols.length; i++) { - ArrayList linkedGroups = rowCols[i]; - int scIx = i - (isRows ? dockOffY : dockOffX); - - int bIx = i << 1; - int bIx2 = bIx + 1; - - curPos += (fromEnd ? -rowColSizes[bIx] : rowColSizes[bIx]); - - DimConstraint primDC = scIx >= 0 ? primDCs[scIx >= primDCs.length ? primDCs.length - 1 : scIx] : DOCK_DIM_CONSTRAINT; - - int rowSize = rowColSizes[bIx2]; - - for (LinkedDimGroup group : linkedGroups) { - int groupSize = rowSize; - if (group.span > 1) - groupSize = LayoutUtil.sum(rowColSizes, bIx2, Math.min((group.span << 1) - 1, rowColSizes.length - bIx2 - 1)); - - group.layout(primDC, curPos, groupSize, group.span); - } - - curPos += (fromEnd ? -rowSize : rowSize); - } - } - - private static void addToSizeGroup(HashMap sizeGroups, String sizeGroup, int[] size) - { - int[] sgSize = sizeGroups.get(sizeGroup); - if (sgSize == null) { - sizeGroups.put(sizeGroup, new int[] {size[LayoutUtil.MIN], size[LayoutUtil.PREF], size[LayoutUtil.MAX]}); - } else { - sgSize[LayoutUtil.MIN] = Math.max(size[LayoutUtil.MIN], sgSize[LayoutUtil.MIN]); - sgSize[LayoutUtil.PREF] = Math.max(size[LayoutUtil.PREF], sgSize[LayoutUtil.PREF]); - sgSize[LayoutUtil.MAX] = Math.min(size[LayoutUtil.MAX], sgSize[LayoutUtil.MAX]); - } - } - - private static HashMap addToEndGroup(HashMap endGroups, String endGroup, int end) - { - if (endGroup != null) { - if (endGroups == null) - endGroups = new HashMap(4); - - Integer oldEnd = endGroups.get(endGroup); - if (oldEnd == null || end > oldEnd) - endGroups.put(endGroup, end); - } - return endGroups; - } - - /** Calculates Min, Preferred and Max size for the columns OR rows. - * @param isHor If it is the horizontal dimension to calculate. - * @param containerSize The reference container size in the dimension. If <= 0 it will be replaced by the actual container's size. - * @return The sizes in a {@link net.miginfocom.layout.Grid.FlowSizeSpec}. - */ - private FlowSizeSpec calcRowsOrColsSizes(boolean isHor, int containerSize) - { - ArrayList[] groupsLists = isHor ? colGroupLists : rowGroupLists; - Float[] defPush = isHor ? pushXs : pushYs; - - if (containerSize <= 0) - containerSize = isHor ? container.getWidth() : container.getHeight(); - - BoundSize cSz = isHor ? lc.getWidth() : lc.getHeight(); - if (!cSz.isUnset()) - containerSize = cSz.constrain(containerSize, getParentSize(container, isHor), container); - - DimConstraint[] primDCs = (isHor? colConstr : rowConstr).getConstaints(); - TreeSet primIndexes = isHor ? colIndexes : rowIndexes; - - int[][] rowColBoundSizes = new int[primIndexes.size()][]; - HashMap sizeGroupMap = new HashMap(4); - DimConstraint[] allDCs = new DimConstraint[primIndexes.size()]; - - Iterator primIt = primIndexes.iterator(); - for (int r = 0; r < rowColBoundSizes.length; r++) { - int cellIx = primIt.next(); - int[] rowColSizes = new int[3]; - - if (cellIx >= -MAX_GRID && cellIx <= MAX_GRID) { // If not dock cell - allDCs[r] = primDCs[cellIx >= primDCs.length ? primDCs.length - 1 : cellIx]; - } else { - allDCs[r] = DOCK_DIM_CONSTRAINT; - } - - ArrayList groups = groupsLists[r]; - - int[] groupSizes = new int[] { - getTotalGroupsSizeParallel(groups, LayoutUtil.MIN, false), - getTotalGroupsSizeParallel(groups, LayoutUtil.PREF, false), - LayoutUtil.INF}; - - correctMinMax(groupSizes); - BoundSize dimSize = allDCs[r].getSize(); - - for (int sType = LayoutUtil.MIN; sType <= LayoutUtil.MAX; sType++) { - - int rowColSize = groupSizes[sType]; - - UnitValue uv = dimSize.getSize(sType); - if (uv != null) { - // If the size of the column is a link to some other size, use that instead - int unit = uv.getUnit(); - if (unit == UnitValue.PREF_SIZE) { - rowColSize = groupSizes[LayoutUtil.PREF]; - } else if (unit == UnitValue.MIN_SIZE) { - rowColSize = groupSizes[LayoutUtil.MIN]; - } else if (unit == UnitValue.MAX_SIZE) { - rowColSize = groupSizes[LayoutUtil.MAX]; - } else { - rowColSize = uv.getPixels(containerSize, container, null); - } - } else if (cellIx >= -MAX_GRID && cellIx <= MAX_GRID && rowColSize == 0) { - rowColSize = LayoutUtil.isDesignTime(container) ? LayoutUtil.getDesignTimeEmptySize() : 0; // Empty rows with no size set gets XX pixels if design time - } - - rowColSizes[sType] = rowColSize; - } - - correctMinMax(rowColSizes); - addToSizeGroup(sizeGroupMap, allDCs[r].getSizeGroup(), rowColSizes); - - rowColBoundSizes[r] = rowColSizes; - } - - // Set/equalize the size groups to same the values. - if (sizeGroupMap.size() > 0) { - for (int r = 0; r < rowColBoundSizes.length; r++) { - if (allDCs[r].getSizeGroup() != null) - rowColBoundSizes[r] = sizeGroupMap.get(allDCs[r].getSizeGroup()); - } - } - - // Add the gaps - ResizeConstraint[] resConstrs = getRowResizeConstraints(allDCs); - - boolean[] fillInPushGaps = new boolean[allDCs.length + 1]; - int[][] gapSizes = getRowGaps(allDCs, containerSize, isHor, fillInPushGaps); - - FlowSizeSpec fss = mergeSizesGapsAndResConstrs(resConstrs, fillInPushGaps, rowColBoundSizes, gapSizes); - - // Spanning components are not handled yet. Check and adjust the multi-row min/pref they enforce. - adjustMinPrefForSpanningComps(allDCs, defPush, fss, groupsLists); - - return fss; - } - - private static int getParentSize(ComponentWrapper cw, boolean isHor) - { - ContainerWrapper p = cw.getParent(); - return p != null ? (isHor ? cw.getWidth() : cw.getHeight()) : 0; - } - - private int[] getMinPrefMaxSumSize(boolean isHor, int[][] sizes) - { - int[] retSizes = new int[3]; - - BoundSize sz = isHor ? lc.getWidth() : lc.getHeight(); - - for (int i = 0; i < sizes.length; i++) { - if (sizes[i] != null) { - int[] size = sizes[i]; - for (int sType = LayoutUtil.MIN; sType <= LayoutUtil.MAX; sType++) { - if (sz.getSize(sType) != null) { - if (i == 0) - retSizes[sType] = sz.getSize(sType).getPixels(getParentSize(container, isHor), container, null); - } else { - int s = size[sType]; - - if (s != LayoutUtil.NOT_SET) { - if (sType == LayoutUtil.PREF) { - int bnd = size[LayoutUtil.MAX]; - if (bnd != LayoutUtil.NOT_SET && bnd < s) - s = bnd; - - bnd = size[LayoutUtil.MIN]; - if (bnd > s) // Includes s == LayoutUtil.NOT_SET since < 0. - s = bnd; - } - - retSizes[sType] += s; // MAX compensated below. - } - - // So that MAX is always correct. - if (size[LayoutUtil.MAX] == LayoutUtil.NOT_SET || retSizes[LayoutUtil.MAX] > LayoutUtil.INF) - retSizes[LayoutUtil.MAX] = LayoutUtil.INF; - } - } - } - } - - correctMinMax(retSizes); - - return retSizes; - } - - private static ResizeConstraint[] getRowResizeConstraints(DimConstraint[] specs) - { - ResizeConstraint[] resConsts = new ResizeConstraint[specs.length]; - for (int i = 0; i < resConsts.length; i++) - resConsts[i] = specs[i].resize; - return resConsts; - } - - private static ResizeConstraint[] getComponentResizeConstraints(ArrayList compWraps, boolean isHor) - { - ResizeConstraint[] resConsts = new ResizeConstraint[compWraps.size()]; - for (int i = 0; i < resConsts.length; i++) { - CC fc = compWraps.get(i).cc; - resConsts[i] = fc.getDimConstraint(isHor).resize; - - // Always grow docking components in the correct dimension. - int dock = fc.getDockSide(); - if (isHor ? (dock == 0 || dock == 2) : (dock == 1 || dock == 3)) { - ResizeConstraint dc = resConsts[i]; - resConsts[i] = new ResizeConstraint(dc.shrinkPrio, dc.shrink, dc.growPrio, ResizeConstraint.WEIGHT_100); - } - } - return resConsts; - } - - private static boolean[] getComponentGapPush(ArrayList compWraps, boolean isHor) - { - // Make one element bigger and or the after gap with the next before gap. - boolean[] barr = new boolean[compWraps.size() + 1]; - for (int i = 0; i < barr.length; i++) { - - boolean push = i > 0 && compWraps.get(i - 1).isPushGap(isHor, false); - - if (!push && i < (barr.length - 1)) - push = compWraps.get(i).isPushGap(isHor, true); - - barr[i] = push; - } - return barr; - } - - /** Returns the row gaps in pixel sizes. One more than there are specs sent in. - * @param specs - * @param refSize - * @param isHor - * @param fillInPushGaps If the gaps are pushing. NOTE! this argument will be filled in and thus changed! - * @return The row gaps in pixel sizes. One more than there are specs sent in. - */ - private int[][] getRowGaps(DimConstraint[] specs, int refSize, boolean isHor, boolean[] fillInPushGaps) - { - BoundSize defGap = isHor ? lc.getGridGapX() : lc.getGridGapY(); - if (defGap == null) - defGap = isHor ? PlatformDefaults.getGridGapX() : PlatformDefaults.getGridGapY(); - int[] defGapArr = defGap.getPixelSizes(refSize, container, null); - - boolean defIns = !hasDocks(); - - UnitValue firstGap = LayoutUtil.getInsets(lc, isHor ? 1 : 0, defIns); - UnitValue lastGap = LayoutUtil.getInsets(lc, isHor ? 3 : 2, defIns); - - int[][] retValues = new int[specs.length + 1][]; - - for (int i = 0, wgIx = 0; i < retValues.length; i++) { - DimConstraint specBefore = i > 0 ? specs[i - 1] : null; - DimConstraint specAfter = i < specs.length ? specs[i] : null; - - // No gap if between docking components. - boolean edgeBefore = (specBefore == DOCK_DIM_CONSTRAINT || specBefore == null); - boolean edgeAfter = (specAfter == DOCK_DIM_CONSTRAINT || specAfter == null); - if (edgeBefore && edgeAfter) - continue; - - BoundSize wrapGapSize = (wrapGapMap == null || isHor == lc.isFlowX() ? null : wrapGapMap.get(wgIx++)); - - if (wrapGapSize == null) { - - int[] gapBefore = specBefore != null ? specBefore.getRowGaps(container, null, refSize, false) : null; - int[] gapAfter = specAfter != null ? specAfter.getRowGaps(container, null, refSize, true) : null; - - if (edgeBefore && gapAfter == null && firstGap != null) { - - int bef = firstGap.getPixels(refSize, container, null); - retValues[i] = new int[] {bef, bef, bef}; - - } else if (edgeAfter && gapBefore == null && firstGap != null) { - - int aft = lastGap.getPixels(refSize, container, null); - retValues[i] = new int[] {aft, aft, aft}; - - } else { - retValues[i] = gapAfter != gapBefore ? mergeSizes(gapAfter, gapBefore) : new int[] {defGapArr[0], defGapArr[1], defGapArr[2]}; - } - - if (specBefore != null && specBefore.isGapAfterPush() || specAfter != null && specAfter.isGapBeforePush()) - fillInPushGaps[i] = true; - } else { - - if (wrapGapSize.isUnset()) { - retValues[i] = new int[] {defGapArr[0], defGapArr[1], defGapArr[2]}; - } else { - retValues[i] = wrapGapSize.getPixelSizes(refSize, container, null); - } - fillInPushGaps[i] = wrapGapSize.getGapPush(); - } - } - return retValues; - } - - private static int[][] getGaps(ArrayList compWraps, boolean isHor) - { - int compCount = compWraps.size(); - int[][] retValues = new int[compCount + 1][]; - - retValues[0] = compWraps.get(0).getGaps(isHor, true); - for (int i = 0; i < compCount; i++) { - int[] gap1 = compWraps.get(i).getGaps(isHor, false); - int[] gap2 = i < compCount - 1 ? compWraps.get(i + 1).getGaps(isHor, true) : null; - - retValues[i + 1] = mergeSizes(gap1, gap2); - } - - return retValues; - } - - private boolean hasDocks() - { - return (dockOffX > 0 || dockOffY > 0 || rowIndexes.last() > MAX_GRID || colIndexes.last() > MAX_GRID); - } - - /** Adjust min/pref size for columns(or rows) that has components that spans multiple columns (or rows). - * @param specs The specs for the columns or rows. Last index will be used if count is greater than this array's length. - * @param defPush The default grow weight if the specs does not have anyone that will grow. Comes from "push" in the CC. - * @param fss - * @param groupsLists - */ - private void adjustMinPrefForSpanningComps(DimConstraint[] specs, Float[] defPush, FlowSizeSpec fss, ArrayList[] groupsLists) - { - for (int r = groupsLists.length - 1; r >= 0; r--) { // Since 3.7.3 Iterate from end to start. Will solve some multiple spanning components hard to solve problems. - ArrayList groups = groupsLists[r]; - - for (LinkedDimGroup group : groups) { - if (group.span == 1) - continue; - - int[] sizes = group.getMinPrefMax(); - for (int s = LayoutUtil.MIN; s <= LayoutUtil.PREF; s++) { - int cSize = sizes[s]; - if (cSize == LayoutUtil.NOT_SET) - continue; - - int rowSize = 0; - int sIx = (r << 1) + 1; - int len = Math.min((group.span << 1), fss.sizes.length - sIx) - 1; - for (int j = sIx; j < sIx + len; j++) { - int sz = fss.sizes[j][s]; - if (sz != LayoutUtil.NOT_SET) - rowSize += sz; - } - - if (rowSize < cSize && len > 0) { - for (int eagerness = 0, newRowSize = 0; eagerness < 4 && newRowSize < cSize; eagerness++) - newRowSize = fss.expandSizes(specs, defPush, cSize, sIx, len, s, eagerness); - } - } - } - } - } - - /** For one dimension divide the component wraps into logical groups. One group for component wraps that share a common something, - * line the property to layout by base line. - * @param isRows If rows, and not columns, are to be divided. - * @return One ArrayList for every row/column. - */ - private ArrayList[] divideIntoLinkedGroups(boolean isRows) - { - boolean fromEnd = !(isRows ? lc.isTopToBottom() : LayoutUtil.isLeftToRight(lc, container)); - TreeSet primIndexes = isRows ? rowIndexes : colIndexes; - TreeSet secIndexes = isRows ? colIndexes : rowIndexes; - DimConstraint[] primDCs = (isRows ? rowConstr : colConstr).getConstaints(); - - @SuppressWarnings("unchecked") - ArrayList[] groupLists = new ArrayList[primIndexes.size()]; - - int gIx = 0; - for (int i : primIndexes) { - - DimConstraint dc; - if (i >= -MAX_GRID && i <= MAX_GRID) { // If not dock cell - dc = primDCs[i >= primDCs.length ? primDCs.length - 1 : i]; - } else { - dc = DOCK_DIM_CONSTRAINT; - } - - ArrayList groupList = new ArrayList(4); - groupLists[gIx++] = groupList; - - for (Integer ix : secIndexes) { - Cell cell = isRows ? getCell(i, ix) : getCell(ix, i); - if (cell == null || cell.compWraps.size() == 0) - continue; - - int span = (isRows ? cell.spany : cell.spanx); - if (span > 1) - span = convertSpanToSparseGrid(i, span, primIndexes); - - boolean isPar = (cell.flowx == isRows); - - if ((!isPar && cell.compWraps.size() > 1) || span > 1) { - - int linkType = isPar ? LinkedDimGroup.TYPE_PARALLEL : LinkedDimGroup.TYPE_SERIAL; - LinkedDimGroup lg = new LinkedDimGroup("p," + ix, span, linkType, !isRows, fromEnd); - lg.setCompWraps(cell.compWraps); - groupList.add(lg); - } else { - for (int cwIx = 0; cwIx < cell.compWraps.size(); cwIx++) { - CompWrap cw = cell.compWraps.get(cwIx); - boolean rowBaselineAlign = (isRows && lc.isTopToBottom() && dc.getAlignOrDefault(!isRows) == UnitValue.BASELINE_IDENTITY); // Disable baseline for bottomToTop since I can not verify it working. - boolean isBaseline = isRows && cw.isBaselineAlign(rowBaselineAlign); - - String linkCtx = isBaseline ? "baseline" : null; - - // Find a group with same link context and put it in that group. - boolean foundList = false; - for (int glIx = 0, lastGl = groupList.size() - 1; glIx <= lastGl; glIx++) { - LinkedDimGroup group = groupList.get(glIx); - if (group.linkCtx == linkCtx || linkCtx != null && linkCtx.equals(group.linkCtx)) { - group.addCompWrap(cw); - foundList = true; - break; - } - } - - // If none found and at last add a new group. - if (!foundList) { - int linkType = isBaseline ? LinkedDimGroup.TYPE_BASELINE : LinkedDimGroup.TYPE_PARALLEL; - LinkedDimGroup lg = new LinkedDimGroup(linkCtx, 1, linkType, !isRows, fromEnd); - lg.addCompWrap(cw); - groupList.add(lg); - } - } - } - } - } - return groupLists; - } - - /** Spanning is specified in the uncompressed grid number. They can for instance be more than 60000 for the outer - * edge dock grid cells. When the grid is compressed and indexed after only the cells that area occupied the span - * is erratic. This method use the row/col indexes and corrects the span to be correct for the compressed grid. - * @param span The span in the uncompressed grid. LayoutUtil.INF will be interpreted to span the rest - * of the column/row excluding the surrounding docking components. - * @param indexes The indexes in the correct dimension. - * @return The converted span. - */ - private static int convertSpanToSparseGrid(int curIx, int span, TreeSet indexes) - { - int lastIx = curIx + span; - int retSpan = 1; - - for (Integer ix : indexes) { - if (ix <= curIx) - continue; // We have not arrived to the correct index yet - - if (ix >= lastIx) - break; - - retSpan++; - } - return retSpan; - } - - private boolean isCellFree(int r, int c, ArrayList occupiedRects) - { - if (getCell(r, c) != null) - return false; - - for (int[] rect : occupiedRects) { - if (rect[0] <= c && rect[1] <= r && rect[0] + rect[2] > c && rect[1] + rect[3] > r) - return false; - } - return true; - } - - private Cell getCell(int r, int c) - { - return grid.get((r << 16) + (c & 0xffff)); - } - - private void setCell(int r, int c, Cell cell) - { - if (c < 0 || r < 0) - throw new IllegalArgumentException("Cell position cannot be negative. row: " + r + ", col: " + c); - - if (c > MAX_GRID || r > MAX_GRID) - throw new IllegalArgumentException("Cell position out of bounds. Out of cells. row: " + r + ", col: " + c); - - rowIndexes.add(r); - colIndexes.add(c); - - grid.put((r << 16) + (c & 0xffff), cell); - } - - /** Adds a docking cell. That cell is outside the normal cell indexes. - * @param dockInsets The current dock insets. Will be updated! - * @param side top == 0, left == 1, bottom = 2, right = 3. - * @param cw The compwrap to put in a cell and add. - */ - private void addDockingCell(int[] dockInsets, int side, CompWrap cw) - { - int r, c, spanx = 1, spany = 1; - switch (side) { - case 0: - case 2: - r = side == 0 ? dockInsets[0]++ : dockInsets[2]--; - c = dockInsets[1]; - spanx = dockInsets[3] - dockInsets[1] + 1; // The +1 is for cell 0. - colIndexes.add(dockInsets[3]); // Make sure there is a receiving cell - break; - - case 1: - case 3: - c = side == 1 ? dockInsets[1]++ : dockInsets[3]--; - r = dockInsets[0]; - spany = dockInsets[2] - dockInsets[0] + 1; // The +1 is for cell 0. - rowIndexes.add(dockInsets[2]); // Make sure there is a receiving cell - break; - - default: - throw new IllegalArgumentException("Internal error 123."); - } - - rowIndexes.add(r); - colIndexes.add(c); - - grid.put((r << 16) + (c & 0xffff), new Cell(cw, spanx, spany, spanx > 1)); - } - - /** A simple representation of a cell in the grid. Contains a number of component wraps, if they span more than one cell. - */ - private static class Cell - { - private final int spanx, spany; - private final boolean flowx; - private final ArrayList compWraps = new ArrayList(2); - - private boolean hasTagged = false; // If one or more components have styles and need to be checked by the component sorter - - private Cell(CompWrap cw) - { - this(cw, 1, 1, true); - } - - private Cell(int spanx, int spany, boolean flowx) - { - this(null, spanx, spany, flowx); - } - - private Cell(CompWrap cw, int spanx, int spany, boolean flowx) - { - if (cw != null) - compWraps.add(cw); - this.spanx = spanx; - this.spany = spany; - this.flowx = flowx; - } - } - - /** A number of component wraps that share a layout "something" in one dimension - */ - private static class LinkedDimGroup - { - private static final int TYPE_SERIAL = 0; - private static final int TYPE_PARALLEL = 1; - private static final int TYPE_BASELINE = 2; - - private final String linkCtx; - private final int span; - private final int linkType; - private final boolean isHor, fromEnd; - - private final ArrayList _compWraps = new ArrayList(4); - - private int lStart = 0, lSize = 0; // Currently mostly for debug painting - - private LinkedDimGroup(String linkCtx, int span, int linkType, boolean isHor, boolean fromEnd) - { - this.linkCtx = linkCtx; - this.span = span; - this.linkType = linkType; - this.isHor = isHor; - this.fromEnd = fromEnd; - } - - private void addCompWrap(CompWrap cw) - { - _compWraps.add(cw); - } - - private void setCompWraps(ArrayList cws) - { - if (_compWraps != cws) { - _compWraps.clear(); - _compWraps.addAll(cws); - } - } - - private void layout(DimConstraint dc, int start, int size, int spanCount) - { - lStart = start; - lSize = size; - - if (_compWraps.isEmpty()) - return; - - ContainerWrapper parent = _compWraps.get(0).comp.getParent(); - if (linkType == TYPE_PARALLEL) { - layoutParallel(parent, _compWraps, dc, start, size, isHor, fromEnd); - } else if (linkType == TYPE_BASELINE) { - layoutBaseline(parent, _compWraps, dc, start, size, LayoutUtil.PREF, spanCount); - } else { - layoutSerial(parent, _compWraps, dc, start, size, isHor, spanCount, fromEnd); - } - } - - /** Returns the min/pref/max sizes for this cell. Returned array must not be altered - * @return A shared min/pref/max array of sizes. Always of length 3 and never null. Will always be of type STATIC and PIXEL. - */ - private int[] getMinPrefMax() - { - int[] sizes = new int[3]; - if (!_compWraps.isEmpty()) { - for (int sType = LayoutUtil.MIN; sType <= LayoutUtil.PREF; sType++) { - if (linkType == TYPE_PARALLEL) { - sizes[sType] = getTotalSizeParallel(_compWraps, sType, isHor); - } else if (linkType == TYPE_BASELINE) { - AboveBelow aboveBelow = getBaselineAboveBelow(_compWraps, sType, false); - sizes[sType] = aboveBelow.sum(); - } else { - sizes[sType] = getTotalSizeSerial(_compWraps, sType, isHor); - } - } - sizes[LayoutUtil.MAX] = LayoutUtil.INF; - } - return sizes; - } - } - - /** Wraps a {@link java.awt.Component} together with its constraint. Caches a lot of information about the component so - * for instance not the preferred size has to be calculated more than once. - * - * Note! Does not ask the min/pref/max sizes again after the constructor. This means that - */ - private final class CompWrap - { - private final ComponentWrapper comp; - private final CC cc; - private final int eHideMode; - private final boolean useVisualPadding; - private boolean sizesOk = false; - private boolean isAbsolute; - - private int[][] gaps; // [top,left(actually before),bottom,right(actually after)][min,pref,max] - - private final int[] horSizes = new int[3]; - private final int[] verSizes = new int[3]; - - private int x = LayoutUtil.NOT_SET, y = LayoutUtil.NOT_SET, w = LayoutUtil.NOT_SET, h = LayoutUtil.NOT_SET; - - private int forcedPushGaps = 0; // 1 == before, 2 = after. Bitwise. - - /** - * @param c - * @param cc - * @param eHideMode Effective hide mode. <= 0 means visible. - * @param useVisualPadding - */ - private CompWrap(ComponentWrapper c, CC cc, int eHideMode, boolean useVisualPadding) - { - this.comp = c; - this.cc = cc; - this.eHideMode = eHideMode; - this.useVisualPadding = useVisualPadding; - this.isAbsolute = cc.getHorizontal().getSize().isAbsolute() && cc.getVertical().getSize().isAbsolute(); - - if (eHideMode > 1) { - gaps = new int[4][]; - for (int i = 0; i < gaps.length; i++) - gaps[i] = new int[3]; - } - } - - private int[] getSizes(boolean isHor) - { - validateSize(); - return isHor ? horSizes : verSizes; - } - - private void validateSize() - { - BoundSize[] callbackSz = getCallbackSize(comp); - - if (isAbsolute && sizesOk && callbackSz == null) - return; - - if (eHideMode <= 0) { - int contentBias = comp.getContentBias(); - - int sizeHint = contentBias == -1 ? -1 : (contentBias == 0 ? (w != LayoutUtil.NOT_SET ? w : comp.getWidth()) : (h != LayoutUtil.NOT_SET ? h : comp.getHeight())); - - BoundSize hBS = (callbackSz != null && callbackSz[0] != null) ? callbackSz[0] : cc.getHorizontal().getSize(); - BoundSize vBS = (callbackSz != null && callbackSz[1] != null) ? callbackSz[1] : cc.getVertical().getSize(); - - for (int i = LayoutUtil.MIN; i <= LayoutUtil.MAX; i++) { - switch (contentBias) { - case -1: // None - default: - horSizes[i] = getSize(hBS, i, true, useVisualPadding, -1); - verSizes[i] = getSize(vBS, i, false, useVisualPadding, -1); - break; - case 0: // Hor - horSizes[i] = getSize(hBS, i, true, useVisualPadding, -1); - verSizes[i] = getSize(vBS, i, false, useVisualPadding, sizeHint > 0 ? sizeHint : horSizes[i]); - break; - case 1: // Ver - verSizes[i] = getSize(vBS, i, false, useVisualPadding, -1); - horSizes[i] = getSize(hBS, i, true, useVisualPadding, sizeHint > 0 ? sizeHint : verSizes[i]); - break; - } - } - - correctMinMax(horSizes); - correctMinMax(verSizes); - } else { - Arrays.fill(horSizes, 0); // Needed if component goes from visible -> invisible without recreating the grid. - Arrays.fill(verSizes, 0); - } - sizesOk = true; - } - - private int getSize(BoundSize uvs, int sizeType, boolean isHor, boolean useVP, int sizeHint) - { - int size; - if (uvs == null || uvs.getSize(sizeType) == null) { - switch(sizeType) { - case LayoutUtil.MIN: - size = isHor ? comp.getMinimumWidth(sizeHint) : comp.getMinimumHeight(sizeHint); - break; - case LayoutUtil.PREF: - size = isHor ? comp.getPreferredWidth(sizeHint) : comp.getPreferredHeight(sizeHint); - break; - default: - size = isHor ? comp.getMaximumWidth(sizeHint) : comp.getMaximumHeight(sizeHint); - break; - } - if (useVP) { - //Do not include visual padding when calculating layout - int[] visualPadding = comp.getVisualPadding(); - - // Assume visualPadding is of length 4: top, left, bottom, right - if (visualPadding != null && visualPadding.length > 0) - size -= isHor ? (visualPadding[1] + visualPadding[3]) : (visualPadding[0] + visualPadding[2]); - } - } else { - ContainerWrapper par = comp.getParent(); - float refValue = isHor ? par.getWidth() : par.getHeight(); - size = uvs.getSize(sizeType).getPixels(refValue, par, comp); - } - return size; - } - - - private void calcGaps(ComponentWrapper before, CC befCC, ComponentWrapper after, CC aftCC, String tag, boolean flowX, boolean isLTR) - { - ContainerWrapper par = comp.getParent(); - int parW = par.getWidth(); - int parH = par.getHeight(); - - BoundSize befGap = before != null ? (flowX ? befCC.getHorizontal() : befCC.getVertical()).getGapAfter() : null; - BoundSize aftGap = after != null ? (flowX ? aftCC.getHorizontal() : aftCC.getVertical()).getGapBefore() : null; - - mergeGapSizes(cc.getVertical().getComponentGaps(par, comp, befGap, (flowX ? null : before), tag, parH, 0, isLTR), false, true); - mergeGapSizes(cc.getHorizontal().getComponentGaps(par, comp, befGap, (flowX ? before : null), tag, parW, 1, isLTR), true, true); - mergeGapSizes(cc.getVertical().getComponentGaps(par, comp, aftGap, (flowX ? null : after), tag, parH, 2, isLTR), false, false); - mergeGapSizes(cc.getHorizontal().getComponentGaps(par, comp, aftGap, (flowX ? after : null), tag, parW, 3, isLTR), true, false); - } - - private void setDimBounds(int start, int size, boolean isHor) - { - if (isHor) { - if (start != x || w != size) { - x = start; - w = size; - if (comp.getContentBias() == LayoutUtil.HORIZONTAL) - invalidateSizes(); // Only for components that have a bias the sizes will have changed. - } - } else { - if (start != y || h != size) { - y = start; - h = size; - if (comp.getContentBias() == LayoutUtil.VERTICAL) - invalidateSizes(); // Only for components that have a bias the sizes will have changed. - } - } - } - - void invalidateSizes() - { - sizesOk = false; - } - - private boolean isPushGap(boolean isHor, boolean isBefore) - { - if (isHor && ((isBefore ? 1 : 2) & forcedPushGaps) != 0) - return true; // Forced - - DimConstraint dc = cc.getDimConstraint(isHor); - BoundSize s = isBefore ? dc.getGapBefore() : dc.getGapAfter(); - return s != null && s.getGapPush(); - } - - /** Transfers the bounds to the component - */ - private void transferBounds(boolean addVisualPadding) - { - if (cc.isExternal()) - return; - - int compX = x; - int compY = y; - int compW = w; - int compH = h; - - if (addVisualPadding) { - //Add the visual padding back to the component when changing its size - int[] visualPadding = comp.getVisualPadding(); - if (visualPadding != null) { - //assume visualPadding is of length 4: top, left, bottom, right - compX -= visualPadding[1]; - compY -= visualPadding[0]; - compW += (visualPadding[1] + visualPadding[3]); - compH += (visualPadding[0] + visualPadding[2]); - } - } - - comp.setBounds(compX, compY, compW, compH); - } - - private void setForcedSizes(int[] sizes, boolean isHor) - { - if (sizes == null) - return; - - System.arraycopy(sizes, 0, getSizes(isHor), 0, 3); - sizesOk = true; - } - - private void setGaps(int[] minPrefMax, int ix) - { - if (gaps == null) - gaps = new int[][] {null, null, null, null}; - - gaps[ix] = minPrefMax; - } - - private void mergeGapSizes(int[] sizes, boolean isHor, boolean isTL) - { - if (gaps == null) - gaps = new int[][] {null, null, null, null}; - - if (sizes == null) - return; - - int gapIX = getGapIx(isHor, isTL); - int[] oldGaps = gaps[gapIX]; - if (oldGaps == null) { - oldGaps = new int[] {0, 0, LayoutUtil.INF}; - gaps[gapIX] = oldGaps; - } - - oldGaps[LayoutUtil.MIN] = Math.max(sizes[LayoutUtil.MIN], oldGaps[LayoutUtil.MIN]); - oldGaps[LayoutUtil.PREF] = Math.max(sizes[LayoutUtil.PREF], oldGaps[LayoutUtil.PREF]); - oldGaps[LayoutUtil.MAX] = Math.min(sizes[LayoutUtil.MAX], oldGaps[LayoutUtil.MAX]); - } - - private int getGapIx(boolean isHor, boolean isTL) - { - return isHor ? (isTL ? 1 : 3) : (isTL ? 0 : 2); - } - - private int getSizeInclGaps(int sizeType, boolean isHor) - { - return filter(sizeType, getGapBefore(sizeType, isHor) + getSize(sizeType, isHor) + getGapAfter(sizeType, isHor)); - } - - private int getSize(int sizeType, boolean isHor) - { - return filter(sizeType, getSizes(isHor)[sizeType]); - } - - private int getGapBefore(int sizeType, boolean isHor) - { - int[] gaps = getGaps(isHor, true); - return gaps != null ? filter(sizeType, gaps[sizeType]) : 0; - } - - private int getGapAfter(int sizeType, boolean isHor) - { - int[] gaps = getGaps(isHor, false); - return gaps != null ? filter(sizeType, gaps[sizeType]) : 0; - } - - private int[] getGaps(boolean isHor, boolean isTL) - { - return gaps[getGapIx(isHor, isTL)]; - } - - private int filter(int sizeType, int size) - { - if (size == LayoutUtil.NOT_SET) - return sizeType != LayoutUtil.MAX ? 0 : LayoutUtil.INF; - return constrainSize(size); - } - - private boolean isBaselineAlign(boolean defValue) - { - Float g = cc.getVertical().getGrow(); - if (g != null && g.intValue() != 0) - return false; - - UnitValue al = cc.getVertical().getAlign(); - return (al != null ? al == UnitValue.BASELINE_IDENTITY : defValue) && comp.hasBaseline(); - } - - private int getBaseline(int sizeType) - { - return comp.getBaseline(getSize(sizeType, true), getSize(sizeType, false)); - } - - void adjustMinHorSizeUp(int minSize) - { - int[] sz = getSizes(true); - if (sz[LayoutUtil.MIN] < minSize) - sz[LayoutUtil.MIN] = minSize; - correctMinMax(sz); - } - } - - //*************************************************************************************** - //* Helper Methods - //*************************************************************************************** - - private static void layoutBaseline(ContainerWrapper parent, ArrayList compWraps, DimConstraint dc, int start, int size, int sizeType, int spanCount) - { - AboveBelow aboveBelow = getBaselineAboveBelow(compWraps, sizeType, true); - int blRowSize = aboveBelow.sum(); - - CC cc = compWraps.get(0).cc; - - // Align for the whole baseline component array - UnitValue align = cc.getVertical().getAlign(); - if (spanCount == 1 && align == null) - align = dc.getAlignOrDefault(false); - if (align == UnitValue.BASELINE_IDENTITY) - align = UnitValue.CENTER; - - int offset = start + aboveBelow.maxAbove + (align != null ? Math.max(0, align.getPixels(size - blRowSize, parent, null)) : 0); - for (CompWrap cw : compWraps) { - cw.y += offset; - if (cw.y + cw.h > start + size) - cw.h = start + size - cw.y; - } - } - - private static void layoutSerial(ContainerWrapper parent, ArrayList compWraps, DimConstraint dc, int start, int size, boolean isHor, int spanCount, boolean fromEnd) - { - FlowSizeSpec fss = mergeSizesGapsAndResConstrs( - getComponentResizeConstraints(compWraps, isHor), - getComponentGapPush(compWraps, isHor), - getComponentSizes(compWraps, isHor), - getGaps(compWraps, isHor)); - - Float[] pushW = dc.isFill() ? GROW_100 : null; - int[] sizes = LayoutUtil.calculateSerial(fss.sizes, fss.resConstsInclGaps, pushW, LayoutUtil.PREF, size); - setCompWrapBounds(parent, sizes, compWraps, dc.getAlignOrDefault(isHor), start, size, isHor, fromEnd); - } - - private static void setCompWrapBounds(ContainerWrapper parent, int[] allSizes, ArrayList compWraps, UnitValue rowAlign, int start, int size, boolean isHor, boolean fromEnd) - { - int totSize = LayoutUtil.sum(allSizes); - CC cc = compWraps.get(0).cc; - UnitValue align = correctAlign(cc, rowAlign, isHor, fromEnd); - - int cSt = start; - int slack = size - totSize; - if (slack > 0 && align != null) { - int al = Math.min(slack, Math.max(0, align.getPixels(slack, parent, null))); - cSt += (fromEnd ? -al : al); - } - - for (int i = 0, bIx = 0, iSz = compWraps.size(); i < iSz; i++) { - CompWrap cw = compWraps.get(i); - if (fromEnd ) { - cSt -= allSizes[bIx++]; - cw.setDimBounds(cSt - allSizes[bIx], allSizes[bIx], isHor); - cSt -= allSizes[bIx++]; - } else { - cSt += allSizes[bIx++]; - cw.setDimBounds(cSt, allSizes[bIx], isHor); - cSt += allSizes[bIx++]; - } - } - } - - private static void layoutParallel(ContainerWrapper parent, ArrayList compWraps, DimConstraint dc, int start, int size, boolean isHor, boolean fromEnd) - { - int[][] sizes = new int[compWraps.size()][]; // [compIx][gapBef,compSize,gapAft] - - for (int i = 0; i < sizes.length; i++) { - CompWrap cw = compWraps.get(i); - - DimConstraint cDc = cw.cc.getDimConstraint(isHor); - - ResizeConstraint[] resConstr = new ResizeConstraint[] { - cw.isPushGap(isHor, true) ? GAP_RC_CONST_PUSH : GAP_RC_CONST, - cDc.resize, - cw.isPushGap(isHor, false) ? GAP_RC_CONST_PUSH : GAP_RC_CONST, - }; - - int[][] sz = new int[][] { - cw.getGaps(isHor, true), cw.getSizes(isHor), cw.getGaps(isHor, false) - }; - - Float[] pushW = dc.isFill() ? GROW_100 : null; - - sizes[i] = LayoutUtil.calculateSerial(sz, resConstr, pushW, LayoutUtil.PREF, size); - } - - UnitValue rowAlign = dc.getAlignOrDefault(isHor); - setCompWrapBounds(parent, sizes, compWraps, rowAlign, start, size, isHor, fromEnd); - } - - private static void setCompWrapBounds(ContainerWrapper parent, int[][] sizes, ArrayList compWraps, UnitValue rowAlign, int start, int size, boolean isHor, boolean fromEnd) - { - for (int i = 0; i < sizes.length; i++) { - CompWrap cw = compWraps.get(i); - - UnitValue align = correctAlign(cw.cc, rowAlign, isHor, fromEnd); - - int[] cSizes = sizes[i]; - int gapBef = cSizes[0]; - int cSize = cSizes[1]; // No Math.min(size, cSizes[1]) here! - int gapAft = cSizes[2]; - - int cSt = fromEnd ? start - gapBef : start + gapBef; - int slack = size - cSize - gapBef - gapAft; - if (slack > 0 && align != null) { - int al = Math.min(slack, Math.max(0, align.getPixels(slack, parent, null))); - cSt += (fromEnd ? -al : al); - } - - cw.setDimBounds(fromEnd ? cSt - cSize : cSt, cSize, isHor); - } - } - - private static UnitValue correctAlign(CC cc, UnitValue rowAlign, boolean isHor, boolean fromEnd) - { - UnitValue align = (isHor ? cc.getHorizontal() : cc.getVertical()).getAlign(); - if (align == null) - align = rowAlign; - if (align == UnitValue.BASELINE_IDENTITY) - align = UnitValue.CENTER; - - if (fromEnd) { - if (align == UnitValue.LEFT) - align = UnitValue.RIGHT; - else if (align == UnitValue.RIGHT) - align = UnitValue.LEFT; - } - return align; - } - - private static class AboveBelow { - int maxAbove; - int maxBelow; - - AboveBelow(int maxAbove, int maxBelow) { - this.maxAbove = maxAbove; - this.maxBelow = maxBelow; - } - - int sum() { - return maxAbove + maxBelow; - } - } - - private static AboveBelow getBaselineAboveBelow(ArrayList compWraps, int sType, boolean centerBaseline) - { - int maxAbove = Integer.MIN_VALUE; - int maxBelow = Integer.MIN_VALUE; - for (CompWrap cw : compWraps) { - int height = cw.getSize(sType, false); - if (height >= LayoutUtil.INF) - return new AboveBelow(LayoutUtil.INF / 2, LayoutUtil.INF / 2); - - int baseline = cw.getBaseline(sType); - int above = baseline + cw.getGapBefore(sType, false); - maxAbove = Math.max(above, maxAbove); - maxBelow = Math.max(height - baseline + cw.getGapAfter(sType, false), maxBelow); - - if (centerBaseline) - cw.setDimBounds(-baseline, height, false); - } - return new AboveBelow(maxAbove, maxBelow); - } - - private static int getTotalSizeParallel(ArrayList compWraps, int sType, boolean isHor) - { - int size = sType == LayoutUtil.MAX ? LayoutUtil.INF : 0; - - for (CompWrap cw : compWraps) { - int cwSize = cw.getSizeInclGaps(sType, isHor); - if (cwSize >= LayoutUtil.INF) - return LayoutUtil.INF; - - if (sType == LayoutUtil.MAX ? cwSize < size : cwSize > size) - size = cwSize; - } - return constrainSize(size); - } - - private static int getTotalSizeSerial(ArrayList compWraps, int sType, boolean isHor) - { - int totSize = 0; - for (int i = 0, iSz = compWraps.size(), lastGapAfter = 0; i < iSz; i++) { - CompWrap wrap = compWraps.get(i); - int gapBef = wrap.getGapBefore(sType, isHor); - if (gapBef > lastGapAfter) - totSize += gapBef - lastGapAfter; - - totSize += wrap.getSize(sType, isHor); - totSize += (lastGapAfter = wrap.getGapAfter(sType, isHor)); - - if (totSize >= LayoutUtil.INF) - return LayoutUtil.INF; - } - return constrainSize(totSize); - } - - private static int getTotalGroupsSizeParallel(ArrayList groups, int sType, boolean countSpanning) - { - int size = sType == LayoutUtil.MAX ? LayoutUtil.INF : 0; - for (LinkedDimGroup group : groups) { - if (countSpanning || group.span == 1) { - int grpSize = group.getMinPrefMax()[sType]; - if (grpSize >= LayoutUtil.INF) - return LayoutUtil.INF; - - if (sType == LayoutUtil.MAX ? grpSize < size : grpSize > size) - size = grpSize; - } - } - return constrainSize(size); - } - - /** - * @param compWraps - * @param isHor - * @return Might contain LayoutUtil.NOT_SET - */ - private static int[][] getComponentSizes(ArrayList compWraps, boolean isHor) - { - int[][] compSizes = new int[compWraps.size()][]; - for (int i = 0; i < compSizes.length; i++) - compSizes[i] = compWraps.get(i).getSizes(isHor); - return compSizes; - } - - /** Merges sizes and gaps together with Resize Constraints. For gaps {@link #GAP_RC_CONST} is used. - * @param resConstr One resize constraint for every row/component. Can be lesser in length and the last element should be used for missing elements. - * @param gapPush If the corresponding gap should be considered pushing and thus want to take free space if left over. Should be one more than resConstrs! - * @param minPrefMaxSizes The sizes (min/pref/max) for every row/component. - * @param gapSizes The gaps before and after each row/component packed in one double sized array. - * @return A holder for the merged values. - */ - private static FlowSizeSpec mergeSizesGapsAndResConstrs(ResizeConstraint[] resConstr, boolean[] gapPush, int[][] minPrefMaxSizes, int[][] gapSizes) - { - int[][] sizes = new int[(minPrefMaxSizes.length << 1) + 1][]; // Make room for gaps around. - ResizeConstraint[] resConstsInclGaps = new ResizeConstraint[sizes.length]; - - sizes[0] = gapSizes[0]; - for (int i = 0, crIx = 1; i < minPrefMaxSizes.length; i++, crIx += 2) { - - // Component bounds and constraints - resConstsInclGaps[crIx] = resConstr[i]; - sizes[crIx] = minPrefMaxSizes[i]; - - sizes[crIx + 1] = gapSizes[i + 1]; - - if (sizes[crIx - 1] != null) - resConstsInclGaps[crIx - 1] = gapPush[i < gapPush.length ? i : gapPush.length - 1] ? GAP_RC_CONST_PUSH : GAP_RC_CONST; - - if (i == (minPrefMaxSizes.length - 1) && sizes[crIx + 1] != null) - resConstsInclGaps[crIx + 1] = gapPush[(i + 1) < gapPush.length ? (i + 1) : gapPush.length - 1] ? GAP_RC_CONST_PUSH : GAP_RC_CONST; - } - - // Check for null and set it to 0, 0, 0. - for (int i = 0; i < sizes.length; i++) { - if (sizes[i] == null) - sizes[i] = new int[3]; - } - - return new FlowSizeSpec(sizes, resConstsInclGaps); - } - - private static int[] mergeSizes(int[] oldValues, int[] newValues) - { - if (oldValues == null) - return newValues; - - if (newValues == null) - return oldValues; - - int[] ret = new int[oldValues.length]; - for (int i = 0; i < ret.length; i++) - ret[i] = mergeSizes(oldValues[i], newValues[i], true); - - return ret; - } - - private static int mergeSizes(int oldValue, int newValue, boolean toMax) - { - if (oldValue == LayoutUtil.NOT_SET || oldValue == newValue) - return newValue; - - if (newValue == LayoutUtil.NOT_SET) - return oldValue; - - return toMax != oldValue > newValue ? newValue : oldValue; - } - - private static int constrainSize(int s) - { - return s > 0 ? (s < LayoutUtil.INF ? s : LayoutUtil.INF) : 0; - } - - private static void correctMinMax(int s[]) - { - if (s[LayoutUtil.MIN] > s[LayoutUtil.MAX]) - s[LayoutUtil.MIN] = s[LayoutUtil.MAX]; // Since MAX is almost always explicitly set use that - - if (s[LayoutUtil.PREF] < s[LayoutUtil.MIN]) - s[LayoutUtil.PREF] = s[LayoutUtil.MIN]; - - if (s[LayoutUtil.PREF] > s[LayoutUtil.MAX]) - s[LayoutUtil.PREF] = s[LayoutUtil.MAX]; - } - - private static final class FlowSizeSpec - { - private final int[][] sizes; // [row/col index][min, pref, max] - private final ResizeConstraint[] resConstsInclGaps; // [row/col index] - - private FlowSizeSpec(int[][] sizes, ResizeConstraint[] resConstsInclGaps) - { - this.sizes = sizes; - this.resConstsInclGaps = resConstsInclGaps; - } - - /** - * @param specs The specs for the columns or rows. Last index will be used of fromIx + len is greater than this array's length. - * @param targetSize The size to try to meet. - * @param defGrow The default grow weight if the specs does not have anyone that will grow. Comes from "push" in the CC. - * @param fromIx - * @param len - * @param sizeType - * @param eagerness How eager the algorithm should be to try to expand the sizes. - *

    - *
  • 0 - Grow only rows/columns which have the sizeType set to be the containing components AND which has a grow weight > 0. - *
  • 1 - Grow only rows/columns which have the sizeType set to be the containing components AND which has a grow weight > 0 OR unspecified. - *
  • 2 - Grow all rows/columns that have a grow weight > 0. - *
  • 3 - Grow all rows/columns that have a grow weight > 0 OR unspecified. - *
- * @return The new size. - */ - private int expandSizes(DimConstraint[] specs, Float[] defGrow, int targetSize, int fromIx, int len, int sizeType, int eagerness) - { - ResizeConstraint[] resConstr = new ResizeConstraint[len]; - int[][] sizesToExpand = new int[len][]; - for (int i = 0; i < len; i++) { - int[] minPrefMax = sizes[i + fromIx]; - sizesToExpand[i] = new int[] {minPrefMax[sizeType], minPrefMax[LayoutUtil.PREF], minPrefMax[LayoutUtil.MAX]}; - - if (eagerness <= 1 && i % 2 == 0) { // (i % 2 == 0) means only odd indexes, which is only rows/col indexes and not gaps. - int cIx = (i + fromIx - 1) >> 1; - DimConstraint spec = (DimConstraint) LayoutUtil.getIndexSafe(specs, cIx); - - BoundSize sz = spec.getSize(); - if ( (sizeType == LayoutUtil.MIN && sz.getMin() != null && sz.getMin().getUnit() != UnitValue.MIN_SIZE) || - (sizeType == LayoutUtil.PREF && sz.getPreferred() != null && sz.getPreferred().getUnit() != UnitValue.PREF_SIZE)) { - continue; - } - } - resConstr[i] = (ResizeConstraint) LayoutUtil.getIndexSafe(resConstsInclGaps, i + fromIx); - } - - Float[] growW = (eagerness == 1 || eagerness == 3) ? extractSubArray(specs, defGrow, fromIx, len): null; - int[] newSizes = LayoutUtil.calculateSerial(sizesToExpand, resConstr, growW, LayoutUtil.PREF, targetSize); - int newSize = 0; - - for (int i = 0; i < len; i++) { - int s = newSizes[i]; - sizes[i + fromIx][sizeType] = s; - newSize += s; - } - return newSize; - } - } - - private static Float[] extractSubArray(DimConstraint[] specs, Float[] arr, int ix, int len) - { - if (arr == null || arr.length < ix + len) { - Float[] growLastArr = new Float[len]; - - // Handle a group where some rows (first one/few and/or last one/few) are docks. - for (int i = ix + len - 1; i >= 0; i -= 2) { - int specIx = (i >> 1); - if (specs[specIx] != DOCK_DIM_CONSTRAINT) { - growLastArr[i - ix] = ResizeConstraint.WEIGHT_100; - return growLastArr; - } - } - return growLastArr; - } - - Float[] newArr = new Float[len]; - System.arraycopy(arr, ix, newArr, 0, len); - return newArr; - } - - private static WeakHashMap[] PARENT_ROWCOL_SIZES_MAP = null; - @SuppressWarnings( "unchecked" ) - private static synchronized void putSizesAndIndexes(Object parComp, int[] sizes, int[] ixArr, boolean isRows) - { - if (PARENT_ROWCOL_SIZES_MAP == null) // Lazy since only if designing in IDEs - PARENT_ROWCOL_SIZES_MAP = new WeakHashMap[] {new WeakHashMap(4), new WeakHashMap(4)}; - - PARENT_ROWCOL_SIZES_MAP[isRows ? 0 : 1].put(parComp, new int[][]{ixArr, sizes}); - } - - static synchronized int[][] getSizesAndIndexes(Object parComp, boolean isRows) - { - if (PARENT_ROWCOL_SIZES_MAP == null) - return null; - - return PARENT_ROWCOL_SIZES_MAP[isRows ? 0 : 1].get(parComp); - } - - private static WeakHashMap> PARENT_GRIDPOS_MAP = null; - private static synchronized void saveGrid(ComponentWrapper parComp, LinkedHashMap grid) - { - if (PARENT_GRIDPOS_MAP == null) // Lazy since only if designing in IDEs - PARENT_GRIDPOS_MAP = new WeakHashMap>(4); - - ArrayList weakCells = new ArrayList(grid.size()); - - for (Map.Entry e : grid.entrySet()) { - Cell cell = e.getValue(); - Integer xyInt = e.getKey(); - if (xyInt != null) { - int x = (xyInt << 16) >> 16; - int y = xyInt >> 16; - - for (CompWrap cw : cell.compWraps) - weakCells.add(new WeakCell(cw.comp.getComponent(), x, y, cell.spanx, cell.spany)); - } - } - - PARENT_GRIDPOS_MAP.put(parComp.getComponent(), weakCells); - } - - static synchronized HashMap getGridPositions(Object parComp) - { - ArrayList weakCells = PARENT_GRIDPOS_MAP != null ? PARENT_GRIDPOS_MAP.get(parComp) : null; - if (weakCells == null) - return null; - - HashMap retMap = new HashMap(); - - for (WeakCell wc : weakCells) { - Object component = wc.componentRef.get(); - if (component != null) - retMap.put(component, new int[] {wc.x, wc.y, wc.spanX, wc.spanY}); - } - - return retMap; - } - - private static class WeakCell - { - private final WeakReference componentRef; - private final int x, y, spanX, spanY; - - private WeakCell(Object component, int x, int y, int spanX, int spanY) - { - this.componentRef = new WeakReference(component); - this.x = x; - this.y = y; - this.spanX = spanX; - this.spanY = spanY; - } - } -} diff --git a/src2/net/miginfocom/layout/InCellGapProvider.java b/src2/net/miginfocom/layout/InCellGapProvider.java deleted file mode 100644 index bccf60c..0000000 --- a/src2/net/miginfocom/layout/InCellGapProvider.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.miginfocom.layout; - -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** An interface to implement if you want to decide the gaps between two types of components within the same cell. - *

- * E.g.: - * - *

- * {@code
- * if (adjacentComp == null || adjacentSide == SwingConstants.LEFT || adjacentSide == SwingConstants.TOP)
- *	  return null;
- *
- * boolean isHor = (adjacentSide == SwingConstants.LEFT || adjacentSide == SwingConstants.RIGHT);
- *
- * if (adjacentComp.getComponentType(false) == ComponentWrapper.TYPE_LABEL && comp.getComponentType(false) == ComponentWrapper.TYPE_TEXT_FIELD)
- *    return isHor ? UNRELATED_Y : UNRELATED_Y;
- *
- * return (adjacentSide == SwingConstants.LEFT || adjacentSide == SwingConstants.RIGHT) ? RELATED_X : RELATED_Y;
- * }
- * 
- */ -public interface InCellGapProvider -{ - /** Returns the default gap between two components that are in the same cell. - * @param comp The component that the gap is for. Never null. - * @param adjacentComp The adjacent component if any. May be null. - * @param adjacentSide What side the adjacentComp is on. {@link javax.swing.SwingUtilities#TOP} or - * {@link javax.swing.SwingUtilities#LEFT} or {@link javax.swing.SwingUtilities#BOTTOM} or {@link javax.swing.SwingUtilities#RIGHT}. - * @param tag The tag string that the component might be tagged with in the component constraints. May be null. - * @param isLTR If it is left-to-right. - * @return The default gap between two components or null if there should be no gap. - */ - public abstract BoundSize getDefaultGap(ComponentWrapper comp, ComponentWrapper adjacentComp, int adjacentSide, String tag, boolean isLTR); -} diff --git a/src2/net/miginfocom/layout/LC.java b/src2/net/miginfocom/layout/LC.java deleted file mode 100644 index b40fa75..0000000 --- a/src2/net/miginfocom/layout/LC.java +++ /dev/null @@ -1,1044 +0,0 @@ -package net.miginfocom.layout; - -import java.io.*; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** Contains the constraints for an instance of the {@link LC} layout manager. - */ -public final class LC implements Externalizable -{ - // See the corresponding set/get method for documentation of the property! - - private int wrapAfter = LayoutUtil.INF; - - private Boolean leftToRight = null; - - private UnitValue[] insets = null; // Never null elements but if unset array is null - - private UnitValue alignX = null, alignY = null; - - private BoundSize gridGapX = null, gridGapY = null; - - private BoundSize width = BoundSize.NULL_SIZE, height = BoundSize.NULL_SIZE; - - private BoundSize packW = BoundSize.NULL_SIZE, packH = BoundSize.NULL_SIZE; - - private float pwAlign = 0.5f, phAlign = 1.0f; - - private int debugMillis = 0; - - private int hideMode = 0; - - private boolean noCache = false; - - private boolean flowX = true; - - private boolean fillX = false, fillY = false; - - private boolean topToBottom = true; - - private boolean noGrid = false; - - private boolean visualPadding = true; - - /** Empty constructor. - */ - public LC() - { - } - - // ************************************************************************ - // * JavaBean get/set methods. - // ************************************************************************ - - - /** If components have sizes or positions linked to the bounds of the parent in some way (as for instance the "%" unit has) the cache - * must be turned off for the panel. If components does not get the correct or expected size or position try to set this property to true. - * @return true means no cache and slightly slower layout. - */ - public boolean isNoCache() - { - return noCache; - } - - /** If components have sizes or positions linked to the bounds of the parent in some way (as for instance the "%" unit has) the cache - * must be turned off for the panel. If components does not get the correct or expected size or position try to set this property to true. - * @param b true means no cache and slightly slower layout. - */ - public void setNoCache(boolean b) - { - this.noCache = b; - } - - /** If the laid out components' bounds in total is less than the final size of the container these align values will be used to align the components - * in the parent. null is default and that means top/left alignment. The relative distances between the components will not be affected - * by this property. - * @return The current alignment. - */ - public final UnitValue getAlignX() - { - return alignX; - } - - /** If the laid out components' bounds in total is less than the final size of the container these align values will be used to align the components - * in the parent. null is default and that means top/left alignment. The relative distances between the components will not be affected - * by this property. - * @param uv The new alignment. Use {@link ConstraintParser#parseAlignKeywords(String, boolean)} to create the {@link UnitValue}. May be null. - */ - public final void setAlignX(UnitValue uv) - { - this.alignX = uv; - } - - /** If the laid out components' bounds in total is less than the final size of the container these align values will be used to align the components - * in the parent. null is default and that means top/left alignment. The relative distances between the components will not be affected - * by this property. - * @return The current alignment. - */ - public final UnitValue getAlignY() - { - return alignY; - } - - /** If the laid out components' bounds in total is less than the final size of the container these align values will be used to align the components - * in the parent. null is default and that means top/left alignment. The relative distances between the components will not be affected - * by this property. - * @param uv The new alignment. Use {@link ConstraintParser#parseAlignKeywords(String, boolean)} to create the {@link UnitValue}. May be null. - */ - public final void setAlignY(UnitValue uv) - { - this.alignY = uv; - } - - /** If > 0 the debug decorations will be repainted every millis. No debug information if <= 0 (default). - * @return The current debug repaint interval. - */ - public final int getDebugMillis() - { - return debugMillis; - } - - /** If > 0 the debug decorations will be repainted every millis. No debug information if <= 0 (default). - * @param millis The new debug repaint interval. - */ - public final void setDebugMillis(int millis) - { - this.debugMillis = millis; - } - - /** If the layout should always claim the whole bounds of the laid out container even if the preferred size is smaller. - * @return true means fill. false is default. - */ - public final boolean isFillX() - { - return fillX; - } - - /** If the layout should always claim the whole bounds of the laid out container even if the preferred size is smaller. - * @param b true means fill. false is default. - */ - public final void setFillX(boolean b) - { - this.fillX = b; - } - - /** If the layout should always claim the whole bounds of the laid out container even if the preferred size is smaller. - * @return true means fill. false is default. - */ - public final boolean isFillY() - { - return fillY; - } - - /** If the layout should always claim the whole bounds of the laid out container even if the preferred size is smaller. - * @param b true means fill. false is default. - */ - public final void setFillY(boolean b) - { - this.fillY = b; - } - - /** The default flow direction. Normally (which is true) this is horizontal and that means that the "next" component - * will be put in the cell to the right (or to the left if left-to-right is false). - * @return true is the default flow horizontally. - * @see #setLeftToRight(Boolean) - */ - public final boolean isFlowX() - { - return flowX; - } - - /** The default flow direction. Normally (which is true) this is horizontal and that means that the "next" component - * will be put in the cell to the right (or to the left if left-to-right is false). - * @param b true is the default flow horizontally. - * @see #setLeftToRight(Boolean) - */ - public final void setFlowX(boolean b) - { - this.flowX = b; - } - - /** If non-null (null is default) these value will be used as the default gaps between the columns in the grid. - * @return The default grid gap between columns in the grid. null if the platform default is used. - */ - public final BoundSize getGridGapX() - { - return gridGapX; - } - - /** If non-null (null is default) these value will be used as the default gaps between the columns in the grid. - * @param x The default grid gap between columns in the grid. If null the platform default is used. - */ - public final void setGridGapX(BoundSize x) - { - this.gridGapX = x; - } - - /** If non-null (null is default) these value will be used as the default gaps between the rows in the grid. - * @return The default grid gap between rows in the grid. null if the platform default is used. - */ - public final BoundSize getGridGapY() - { - return gridGapY; - } - - /** If non-null (null is default) these value will be used as the default gaps between the rows in the grid. - * @param y The default grid gap between rows in the grid. If null the platform default is used. - */ - public final void setGridGapY(BoundSize y) - { - this.gridGapY = y; - } - - /** How a component that is hidden (not visible) should be treated by default. - * @return The mode:
- * 0 == Normal. Bounds will be calculated as if the component was visible.
- * 1 == If hidden the size will be 0, 0 but the gaps remain.
- * 2 == If hidden the size will be 0, 0 and gaps set to zero.
- * 3 == If hidden the component will be disregarded completely and not take up a cell in the grid.. - */ - public final int getHideMode() - { - return hideMode; - } - - /** How a component that is hidden (not visible) should be treated. - * @param mode The mode:
- * 0 == Normal. Bounds will be calculated as if the component was visible.
- * 1 == If hidden the size will be 0, 0 but the gaps remain.
- * 2 == If hidden the size will be 0, 0 and gaps set to zero.
- * 3 == If hidden the component will be disregarded completely and not take up a cell in the grid.. - */ - public final void setHideMode(int mode) - { - if (mode < 0 || mode > 3) - throw new IllegalArgumentException("Wrong hideMode: " + mode); - - this.hideMode = mode; - } - - /** The insets for the layed out panel. The insets will be an empty space around the components in the panel. null values - * means that the default panel insets for the platform is used. See {@link PlatformDefaults#setDialogInsets(net.miginfocom.layout.UnitValue, net.miginfocom.layout.UnitValue, net.miginfocom.layout.UnitValue, net.miginfocom.layout.UnitValue)}. - * @return The insets. Of length 4 (top, left, bottom, right) or null. The elements (1 to 4) may be null. The array is a copy and can be used freely. - * @see net.miginfocom.layout.ConstraintParser#parseInsets(String, boolean) - */ - public final UnitValue[] getInsets() - { - return insets != null ? new UnitValue[] {insets[0], insets[1], insets[2], insets[3]} : null; - } - - /** The insets for the layed out panel. The insets will be an empty space around the components in the panel. null values - * means that the default panel insets for the platform is used. See {@link PlatformDefaults#setDialogInsets(net.miginfocom.layout.UnitValue, net.miginfocom.layout.UnitValue, net.miginfocom.layout.UnitValue, net.miginfocom.layout.UnitValue)}. - * @param ins The new insets. Must be of length 4 (top, left, bottom, right) or null. The elements (1 to 4) may be null to use - * the platform default for that side. The array is copied for storage. - * @see net.miginfocom.layout.ConstraintParser#parseInsets(String, boolean) - */ - public final void setInsets(UnitValue[] ins) - { - this.insets = ins != null ? new UnitValue[] {ins[0], ins[1], ins[2], ins[3]} : null; - } - - /** If the layout should be forced to be left-to-right or right-to-left. A value of null is default and - * means that this will be picked up from the {@link java.util.Locale} that the container being layed out is reporting. - * @return Boolean.TRUE if force left-to-right. Boolean.FALSE if force tight-to-left. null - * for the default "let the current Locale decide". - */ - public final Boolean getLeftToRight() - { - return leftToRight; - } - - /** If the layout should be forced to be left-to-right or right-to-left. A value of null is default and - * means that this will be picked up from the {@link java.util.Locale} that the container being layed out is reporting. - * @param b Boolean.TRUE to force left-to-right. Boolean.FALSE to force tight-to-left. null - * for the default "let the current Locale decide". - */ - public final void setLeftToRight(Boolean b) - { - this.leftToRight = b; - } - - /** If the whole layout should be non grid based. It is the same as setting the "nogrid" property on every row/column in the grid. - * @return true means not grid based. false is default. - */ - public final boolean isNoGrid() - { - return noGrid; - } - - /** If the whole layout should be non grid based. It is the same as setting the "nogrid" property on every row/column in the grid. - * @param b true means no grid. false is default. - */ - public final void setNoGrid(boolean b) - { - this.noGrid = b; - } - - /** If the layout should go from the default top-to-bottom in the grid instead of the optional bottom-to-top. - * @return true for the default top-to-bottom. - */ - public final boolean isTopToBottom() - { - return topToBottom; - } - - /** If the layout should go from the default top-to-bottom in the grid instead of the optional bottom-to-top. - * @param b true for the default top-to-bottom. - */ - public final void setTopToBottom(boolean b) - { - this.topToBottom = b; - } - - /** If visual padding should be automatically used and compensated for by this layout instance. - * @return true if visual padding. - */ - public final boolean isVisualPadding() - { - return visualPadding; - } - - /** If visual padding should be automatically used and compensated for by this layout instance. - * @param b true turns on visual padding. - */ - public final void setVisualPadding(boolean b) - { - this.visualPadding = b; - } - - /** Returns after what cell the grid should always auto wrap. - * @return After what cell the grid should always auto wrap. If 0 the number of columns/rows in the - * {@link net.miginfocom.layout.AC} is used. LayoutUtil.INF is used for no auto wrap. - */ - public final int getWrapAfter() - { - return wrapAfter; - } - - /** Sets after what cell the grid should always auto wrap. - * @param count After what cell the grid should always auto wrap. If 0 the number of columns/rows in the - * {@link net.miginfocom.layout.AC} is used. LayoutUtil.INF is used for no auto wrap. - */ - public final void setWrapAfter(int count) - { - this.wrapAfter = count; - } - - /** Returns the "pack width" for the window that this container is located in. When the size of this container changes - * the size of the window will be corrected to be within this BoundsSize. It can be used to set the minimum and/or maximum size of the window - * as well as the size window should optimally get. This optimal size is normally its "preferred" size which is why "preferred" - * is the normal value to set here. - *

- * ":push" can be appended to the bound size to only push the size bigger and never shrink it if the preferred size gets smaller. - *

- * E.g. "pref", "100:pref", "pref:700", "300::700", "pref:push" - * @return The current value. Never null. Check if not set with .isUnset(). - * @since 3.5 - */ - public final BoundSize getPackWidth() - { - return packW; - } - - /** Sets the "pack width" for the window that this container is located in. When the size of this container changes - * the size of the window will be corrected to be within this BoundsSize. It can be used to set the minimum and/or maximum size of the window - * as well as the size window should optimally get. This optimal size is normally its "preferred" size which is why "preferred" - * is the normal value to set here. - *

- * ":push" can be appended to the bound size to only push the size bigger and never shrink it if the preferred size gets smaller. - *

- * E.g. "pref", "100:pref", "pref:700", "300::700", "pref:push" - * @param size The new pack size. If null it will be corrected to an "unset" BoundSize. - * @since 3.5 - */ - public final void setPackWidth(BoundSize size) - { - packW = size != null ? size : BoundSize.NULL_SIZE; - } - - /** Returns the "pack height" for the window that this container is located in. When the size of this container changes - * the size of the window will be corrected to be within this BoundsSize. It can be used to set the minimum and/or maximum size of the window - * as well as the size window should optimally get. This optimal size is normally its "preferred" size which is why "preferred" - * is the normal value to set here. - *

- * ":push" can be appended to the bound size to only push the size bigger and never shrink it if the preferred size gets smaller. - *

- * E.g. "pref", "100:pref", "pref:700", "300::700", "pref:push" - * @return The current value. Never null. Check if not set with .isUnset(). - * @since 3.5 - */ - public final BoundSize getPackHeight() - { - return packH; - } - - /** Sets the "pack height" for the window that this container is located in. When the size of this container changes - * the size of the window will be corrected to be within this BoundsSize. It can be used to set the minimum and/or maximum size of the window - * as well as the size window should optimally get. This optimal size is normally its "preferred" size which is why "preferred" - * is the normal value to set here. - *

- * ":push" can be appended to the bound size to only push the size bigger and never shrink it if the preferred size gets smaller. - *

- * E.g. "pref", "100:pref", "pref:700", "300::700", "pref:push" - * @param size The new pack size. If null it will be corrected to an "unset" BoundSize. - * @since 3.5 - */ - public final void setPackHeight(BoundSize size) - { - packH = size != null ? size : BoundSize.NULL_SIZE; - } - - - /** If there is a resize of the window due to packing (see {@link #setPackHeight(BoundSize)} this value, which is between 0f and 1f, - * decides where the extra/superfluous size is placed. 0f means that the window will resize so that the upper part moves up and the - * lower side stays in the same place. 0.5f will expand/reduce the window equally upwards and downwards. 1f will do the opposite of 0f - * of course. - * @return The pack alignment. Always between 0f and 1f, inclusive. - * @since 3.5 - */ - public final float getPackHeightAlign() - { - return phAlign; - } - - /** If there is a resize of the window due to packing (see {@link #setPackHeight(BoundSize)} this value, which is between 0f and 1f, - * decides where the extra/superfluous size is placed. 0f means that the window will resize so that the upper part moves up and the - * lower side stays in the same place. 0.5f will expand/reduce the window equally upwards and downwards. 1f will do the opposite of 0f - * of course. - * @param align The pack alignment. Always between 0f and 1f, inclusive. Values outside this will be truncated. - * @since 3.5 - */ - public final void setPackHeightAlign(float align) - { - phAlign = Math.max(0f, Math.min(1f, align)); - } - - /** If there is a resize of the window due to packing (see {@link #setPackHeight(BoundSize)} this value, which is between 0f and 1f, - * decides where the extra/superfluous size is placed. 0f means that the window will resize so that the left part moves left and the - * right side stays in the same place. 0.5f will expand/reduce the window equally to the right and lefts. 1f will do the opposite of 0f - * of course. - * @return The pack alignment. Always between 0f and 1f, inclusive. - * @since 3.5 - */ - public final float getPackWidthAlign() - { - return pwAlign; - } - - /** If there is a resize of the window due to packing (see {@link #setPackHeight(BoundSize)} this value, which is between 0f and 1f, - * decides where the extra/superfluous size is placed. 0f means that the window will resize so that the left part moves left and the - * right side stays in the same place. 0.5f will expand/reduce the window equally to the right and lefts. 1f will do the opposite of 0f - * of course. - * @param align The pack alignment. Always between 0f and 1f, inclusive. Values outside this will be truncated. - * @since 3.5 - */ - public final void setPackWidthAlign(float align) - { - pwAlign = Math.max(0f, Math.min(1f, align)); - } - - /** Returns the minimum/preferred/maximum size for the container that this layout constraint is set for. Any of these - * sizes that is not null will be returned directly instead of determining the corresponding size through - * asking the components in this container. - * @return The width for the container that this layout constraint is set for. Not null but - * all sizes can be null. - * @since 3.5 - */ - public final BoundSize getWidth() - { - return width; - } - - /** Sets the minimum/preferred/maximum size for the container that this layout constraint is set for. Any of these - * sizes that is not null will be returned directly instead of determining the corresponding size through - * asking the components in this container. - * @param size The width for the container that this layout constraint is set for. null is translated to - * a bound size containing only null sizes. - * @since 3.5 - */ - public final void setWidth(BoundSize size) - { - this.width = size != null ? size : BoundSize.NULL_SIZE; - } - - /** Returns the minimum/preferred/maximum size for the container that this layout constraint is set for. Any of these - * sizes that is not null will be returned directly instead of determining the corresponding size through - * asking the components in this container. - * @return The height for the container that this layout constraint is set for. Not null but - * all sizes can be null. - * @since 3.5 - */ - public final BoundSize getHeight() - { - return height; - } - - /** Sets the minimum/preferred/maximum size for the container that this layout constraint is set for. Any of these - * sizes that is not null will be returned directly instead of determining the corresponding size through - * asking the components in this container. - * @param size The height for the container that this layout constraint is set for. null is translated to - * a bound size containing only null sizes. - * @since 3.5 - */ - public final void setHeight(BoundSize size) - { - this.height = size != null ? size : BoundSize.NULL_SIZE; - } - - // ************************************************************************ - // * Builder methods. - // ************************************************************************ - - /** Short for, and thus same as, .pack("pref", "pref"). - *

- * Same functionality as {@link #setPackHeight(BoundSize)} and {@link #setPackWidth(net.miginfocom.layout.BoundSize)} - * only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.5 - */ - public final LC pack() - { - return pack("pref", "pref"); - } - - /** Sets the pack width and height. - *

- * Same functionality as {@link #setPackHeight(BoundSize)} and {@link #setPackWidth(net.miginfocom.layout.BoundSize)} - * only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param width The pack width. May be null. - * @param height The pack height. May be null. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.5 - */ - public final LC pack(String width, String height) - { - setPackWidth(width != null ? ConstraintParser.parseBoundSize(width, false, true) : BoundSize.NULL_SIZE); - setPackHeight(height != null ? ConstraintParser.parseBoundSize(height, false, false) : BoundSize.NULL_SIZE); - return this; - } - - /** Sets the pack width and height alignment. - *

- * Same functionality as {@link #setPackHeightAlign(float)} and {@link #setPackWidthAlign(float)} - * only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param alignX The pack width alignment. 0.5f is default. - * @param alignY The pack height alignment. 0.5f is default. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.5 - */ - public final LC packAlign(float alignX, float alignY) - { - setPackWidthAlign(alignX); - setPackHeightAlign(alignY); - return this; - } - - /** Sets a wrap after the number of columns/rows that is defined in the {@link net.miginfocom.layout.AC}. - *

- * Same functionality as calling {@link #setWrapAfter(int)} with 0 only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC wrap() - { - setWrapAfter(0); - return this; - } - - /** Same functionality as {@link #setWrapAfter(int)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param count After what cell the grid should always auto wrap. If 0 the number of columns/rows in the - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC wrapAfter(int count) - { - setWrapAfter(count); - return this; - } - - /** Same functionality as calling {@link #setNoCache(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC noCache() - { - setNoCache(true); - return this; - } - - /** Same functionality as calling {@link #setFlowX(boolean)} with false only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC flowY() - { - setFlowX(false); - return this; - } - - /** Same functionality as calling {@link #setFlowX(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC flowX() - { - setFlowX(true); - return this; - } - - /** Same functionality as calling {@link #setFillX(boolean)} with true and {@link #setFillY(boolean)} with true conmbined.T his method returns - * this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC fill() - { - setFillX(true); - setFillY(true); - return this; - } - - /** Same functionality as calling {@link #setFillX(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC fillX() - { - setFillX(true); - return this; - } - - /** Same functionality as calling {@link #setFillY(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC fillY() - { - setFillY(true); - return this; - } - - /** Same functionality as {@link #setLeftToRight(Boolean)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param b true for forcing left-to-right. false for forcing right-to-left. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC leftToRight(boolean b) - { - setLeftToRight(b ? Boolean.TRUE : Boolean.FALSE); - return this; - } - - /** Same functionality as setLeftToRight(false) only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final LC rightToLeft() - { - setLeftToRight(Boolean.FALSE); - return this; - } - - /** Same functionality as calling {@link #setTopToBottom(boolean)} with false only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC bottomToTop() - { - setTopToBottom(false); - return this; - } - - /** Same functionality as calling {@link #setTopToBottom(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @since 3.7.2 - */ - public final LC topToBottom() - { - setTopToBottom(true); - return this; - } - - /** Same functionality as calling {@link #setNoGrid(boolean)} with true only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC noGrid() - { - setNoGrid(true); - return this; - } - - /** Same functionality as calling {@link #setVisualPadding(boolean)} with false only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC noVisualPadding() - { - setVisualPadding(false); - return this; - } - - /** Sets the same inset (expressed as a UnitValue, e.g. "10px" or "20mm") all around. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param allSides The unit value to set for all sides. May be null which means that the default panel insets - * for the platform is used. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setInsets(UnitValue[]) - */ - public final LC insetsAll(String allSides) - { - UnitValue insH = ConstraintParser.parseUnitValue(allSides, true); - UnitValue insV = ConstraintParser.parseUnitValue(allSides, false); - insets = new UnitValue[] {insV, insH, insV, insH}; // No setter to avoid copy again - return this; - } - - /** Same functionality as setInsets(ConstraintParser.parseInsets(s, true)). This method returns this - * for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param s The string to parse. E.g. "10 10 10 10" or "20". If less than 4 groups the last will be used for the missing. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setInsets(UnitValue[]) - */ - public final LC insets(String s) - { - insets = ConstraintParser.parseInsets(s, true); - return this; - } - - /** Sets the different insets (expressed as a UnitValues, e.g. "10px" or "20mm") for the corresponding sides. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param top The top inset. E.g. "10px" or "10mm" or "related". May be null in which case the default inset for this - * side for the platform will be used. - * @param left The left inset. E.g. "10px" or "10mm" or "related". May be null in which case the default inset for this - * side for the platform will be used. - * @param bottom The bottom inset. E.g. "10px" or "10mm" or "related". May be null in which case the default inset for this - * side for the platform will be used. - * @param right The right inset. E.g. "10px" or "10mm" or "related". May be null in which case the default inset for this - * side for the platform will be used. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setInsets(UnitValue[]) - */ - public final LC insets(String top, String left, String bottom, String right) - { - insets = new UnitValue[] { // No setter to avoid copy again - ConstraintParser.parseUnitValue(top, false), - ConstraintParser.parseUnitValue(left, true), - ConstraintParser.parseUnitValue(bottom, false), - ConstraintParser.parseUnitValue(right, true)}; - return this; - } - - /** Same functionality as setAlignX(ConstraintParser.parseUnitValueOrAlign(unitValue, true)) only this method returns this - * for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param align The align keyword or for instance "100px". E.g "left", "right", "leading" or "trailing". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setAlignX(UnitValue) - */ - public final LC alignX(String align) - { - setAlignX(ConstraintParser.parseUnitValueOrAlign(align, true, null)); - return this; - } - - /** Same functionality as setAlignY(ConstraintParser.parseUnitValueOrAlign(align, false)) only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param align The align keyword or for instance "100px". E.g "top" or "bottom". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setAlignY(UnitValue) - */ - public final LC alignY(String align) - { - setAlignY(ConstraintParser.parseUnitValueOrAlign(align, false, null)); - return this; - } - - /** Sets both the alignX and alignY as the same time. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param ax The align keyword or for instance "100px". E.g "left", "right", "leading" or "trailing". - * @param ay The align keyword or for instance "100px". E.g "top" or "bottom". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #alignX(String) - * @see #alignY(String) - */ - public final LC align(String ax, String ay) - { - if (ax != null) - alignX(ax); - - if (ay != null) - alignY(ay); - - return this; - } - - /** Same functionality as setGridGapX(ConstraintParser.parseBoundSize(boundsSize, true, true)) only this method - * returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param boundsSize The BoundSize of the gap. This is a minimum and/or preferred and/or maximum size. E.g. - * "50:100:200" or "100px". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setGridGapX(BoundSize) - */ - public final LC gridGapX(String boundsSize) - { - setGridGapX(ConstraintParser.parseBoundSize(boundsSize, true, true)); - return this; - } - - /** Same functionality as setGridGapY(ConstraintParser.parseBoundSize(boundsSize, true, false)) only this method - * returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param boundsSize The BoundSize of the gap. This is a minimum and/or preferred and/or maximum size. E.g. - * "50:100:200" or "100px". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setGridGapY(BoundSize) - */ - public final LC gridGapY(String boundsSize) - { - setGridGapY(ConstraintParser.parseBoundSize(boundsSize, true, false)); - return this; - } - - /** Sets both grid gaps at the same time. see {@link #gridGapX(String)} and {@link #gridGapY(String)}. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param gapx The BoundSize of the gap. This is a minimum and/or preferred and/or maximum size. E.g. - * "50:100:200" or "100px". - * @param gapy The BoundSize of the gap. This is a minimum and/or preferred and/or maximum size. E.g. - * "50:100:200" or "100px". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #gridGapX(String) - * @see #gridGapY(String) - */ - public final LC gridGap(String gapx, String gapy) - { - if (gapx != null) - gridGapX(gapx); - - if (gapy != null) - gridGapY(gapy); - - return this; - } - - /** Calls {@link #debug(int)} with 300 as an argument. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setDebugMillis(int) - */ - public final LC debug() - { - setDebugMillis(300); - return this; - } - - /** Same functionality as {@link #setDebugMillis(int repaintMillis)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param repaintMillis The new debug repaint interval. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setDebugMillis(int) - */ - public final LC debug(int repaintMillis) - { - setDebugMillis(repaintMillis); - return this; - } - - /** Same functionality as {@link #setHideMode(int mode)} only this method returns this for chaining multiple calls. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com. - * @param mode The mode:
- * 0 == Normal. Bounds will be calculated as if the component was visible.
- * 1 == If hidden the size will be 0, 0 but the gaps remain.
- * 2 == If hidden the size will be 0, 0 and gaps set to zero.
- * 3 == If hidden the component will be disregarded completely and not take up a cell in the grid.. - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - * @see #setHideMode(int) - */ - public final LC hideMode(int mode) - { - setHideMode(mode); - return this; - } - - /** The minimum width for the container. The value will override any value that is set on the container itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or Cheat Sheet at www.migcontainers.com. - * @param width The width expressed as a UnitValue. E.g. "100px" or "200mm". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC minWidth(String width) - { - setWidth(LayoutUtil.derive(getWidth(), ConstraintParser.parseUnitValue(width, true), null, null)); - return this; - } - - /** The width for the container as a min and/or preferred and/or maximum width. The value will override any value that is set on - * the container itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or Cheat Sheet at www.migcontainers.com. - * @param width The width expressed as a BoundSize. E.g. "50:100px:200mm" or "100px". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC width(String width) - { - setWidth(ConstraintParser.parseBoundSize(width, false, true)); - return this; - } - - /** The maximum width for the container. The value will override any value that is set on the container itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or Cheat Sheet at www.migcontainers.com. - * @param width The width expressed as a UnitValue. E.g. "100px" or "200mm". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC maxWidth(String width) - { - setWidth(LayoutUtil.derive(getWidth(), null, null, ConstraintParser.parseUnitValue(width, true))); - return this; - } - - /** The minimum height for the container. The value will override any value that is set on the container itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or Cheat Sheet at www.migcontainers.com. - * @param height The height expressed as a UnitValue. E.g. "100px" or "200mm". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC minHeight(String height) - { - setHeight(LayoutUtil.derive(getHeight(), ConstraintParser.parseUnitValue(height, false), null, null)); - return this; - } - - /** The height for the container as a min and/or preferred and/or maximum height. The value will override any value that is set on - * the container itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcontainers.com. - * @param height The height expressed as a BoundSize. E.g. "50:100px:200mm" or "100px". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC height(String height) - { - setHeight(ConstraintParser.parseBoundSize(height, false, false)); - return this; - } - - /** The maximum height for the container. The value will override any value that is set on the container itself. - *

- * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcontainers.com. - * @param height The height expressed as a UnitValue. E.g. "100px" or "200mm". - * @return this so it is possible to chain calls. E.g. new LayoutConstraint().noGrid().gap().fill(). - */ - public final LC maxHeight(String height) - { - setHeight(LayoutUtil.derive(getHeight(), null, null, ConstraintParser.parseUnitValue(height, false))); - return this; - } - - // ************************************************ - // Persistence Delegate and Serializable combined. - // ************************************************ - - private Object readResolve() throws ObjectStreamException - { - return LayoutUtil.getSerializedObject(this); - } - - @Override - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException - { - LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in)); - } - - @Override - public void writeExternal(ObjectOutput out) throws IOException - { - if (getClass() == LC.class) - LayoutUtil.writeAsXML(out, this); - } -} diff --git a/src2/net/miginfocom/layout/LayoutCallback.java b/src2/net/miginfocom/layout/LayoutCallback.java deleted file mode 100644 index f685fc0..0000000 --- a/src2/net/miginfocom/layout/LayoutCallback.java +++ /dev/null @@ -1,77 +0,0 @@ -package net.miginfocom.layout; - -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** A class to extend if you want to provide more control over where a component is placed or the size of it. - *

- * Note! Returned arrays from this class will never be altered. This means that caching of arrays in these methods - * is OK. - */ -public abstract class LayoutCallback -{ - /** Returns a position similar to the "pos" the component constraint. - * @param comp The component wrapper that holds the actual component (JComponent is Swing and Control in SWT). - * Should not be altered. - * @return The [x, y, x2, y2] as explained in the documentation for "pos". If null - * is returned nothing is done and this is the default. - * @see UnitValue - * @see net.miginfocom.layout.ConstraintParser#parseUnitValue(String, boolean) - */ - public UnitValue[] getPosition(ComponentWrapper comp) - { - return null; - } - - /** Returns a size similar to the "width" and "height" in the component constraint. - * @param comp The component wrapper that holds the actual component (JComponent is Swing and Control in SWT). - * Should not be altered. - * @return The [width, height] as explained in the documentation for "width" and "height". If null - * is returned nothing is done and this is the default. - * @see net.miginfocom.layout.BoundSize - * @see net.miginfocom.layout.ConstraintParser#parseBoundSize(String, boolean, boolean) - */ - public BoundSize[] getSize(ComponentWrapper comp) - { - return null; - } - - /** A last minute change of the bounds. The bound for the layout cycle has been set and you can correct there - * after any set of rules you like. - * @param comp The component wrapper that holds the actual component (JComponent is Swing and Control in SWT). - */ - public void correctBounds(ComponentWrapper comp) - { - } -} diff --git a/src2/net/miginfocom/layout/LayoutUtil.java b/src2/net/miginfocom/layout/LayoutUtil.java deleted file mode 100644 index c817827..0000000 --- a/src2/net/miginfocom/layout/LayoutUtil.java +++ /dev/null @@ -1,597 +0,0 @@ -package net.miginfocom.layout; - -import java.beans.*; -import java.io.*; -import java.util.IdentityHashMap; -import java.util.TreeSet; -import java.util.WeakHashMap; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** A utility class that has only static helper methods. - */ -public final class LayoutUtil -{ - /** A substitute value for a really large value. Integer.MAX_VALUE is not used since that means a lot of defensive code - * for potential overflow must exist in many places. This value is large enough for being unreasonable yet it is hard to - * overflow. - */ - public static final int INF = (Integer.MAX_VALUE >> 10) - 100; // To reduce likelihood of overflow errors when calculating. - - /** Tag int for a value that in considered "not set". Used as "null" element in int arrays. - */ - static final int NOT_SET = Integer.MIN_VALUE + 12346; // Magic value... - - // Index for the different sizes - public static final int MIN = 0; - public static final int PREF = 1; - public static final int MAX = 2; - - public static final int HORIZONTAL = 0; - public static final int VERTICAL = 1; - - private static volatile WeakHashMap CR_MAP = null; - private static volatile WeakHashMap DT_MAP = null; // The Containers that have design time. Value not used. - private static int eSz = 0; - private static int globalDebugMillis = 0; - public static final boolean HAS_BEANS = hasBeans(); - - private static boolean hasBeans() - { - try { - LayoutUtil.class.getClassLoader().loadClass("java.beans.Beans"); - return true; - } catch (Throwable e) { - return false; - } - } - - private LayoutUtil() - { - } - - /** Returns the current version of MiG Layout. - * @return The current version of MiG Layout. E.g. "3.6.3" or "4.0" - */ - public static String getVersion() - { - return "5.0"; - } - - /** If global debug should be on or off. If > 0 then debug is turned on for all MigLayout - * instances. - * @return The current debug milliseconds. - * @see LC#setDebugMillis(int) - */ - public static int getGlobalDebugMillis() - { - return globalDebugMillis; - } - - /** If global debug should be on or off. If > 0 then debug is turned on for all MigLayout - * instances. - *

- * Note! This is a passive value and will be read by panels when the needed, which is normally - * when they repaint/layout. - * @param millis The new debug milliseconds. 0 turns of global debug and leaves debug up to every - * individual panel. - * @see LC#setDebugMillis(int) - */ - public static void setGlobalDebugMillis(int millis) - { - globalDebugMillis = millis; - } - - /** Sets if design time is turned on for a Container in {@link ContainerWrapper}. - * @param cw The container to set design time for. null is legal and can be used as - * a key to turn on/off design time "in general". Note though that design time "in general" is - * always on as long as there is at least one ContainerWrapper with design time. - *

- * If this method has not ever been called it will default to what - * Beans.isDesignTime() returns. This means that if you call - * this method you indicate that you will take responsibility for the design time value. - * @param b true means design time on. - */ - public static void setDesignTime(ContainerWrapper cw, boolean b) - { - if (DT_MAP == null) - DT_MAP = new WeakHashMap(); - - DT_MAP.put((cw != null ? cw.getComponent() : null), b); - } - - /** Returns if design time is turned on for a Container in {@link ContainerWrapper}. - * @param cw The container to set design time for. null is legal will return true - * if there is at least one ContainerWrapper (or null) that have design time - * turned on. - * @return If design time is set for cw. - */ - public static boolean isDesignTime(ContainerWrapper cw) - { - if (DT_MAP == null) - return HAS_BEANS && Beans.isDesignTime(); - - // assume design time "in general" (cw is null) if there is at least one container with design time - // (for storing constraints creation strings in method putCCString()) - if (cw == null && DT_MAP != null && !DT_MAP.isEmpty() ) - return true; - - if (cw != null && DT_MAP.containsKey(cw.getComponent()) == false) - cw = null; - - Boolean b = DT_MAP.get(cw != null ? cw.getComponent() : null); - return b != null && b; - } - - /** The size of an empty row or columns in a grid during design time. - * @return The number of pixels. Default is 15. - */ - public static int getDesignTimeEmptySize() - { - return eSz; - } - - /** The size of an empty row or columns in a grid during design time. - * @param pixels The number of pixels. Default is 0 (it was 15 prior to v3.7.2, but since that meant different behaviour - * under design time by default it was changed to be 0, same as non-design time). IDE vendors can still set it to 15 to - * get the old behaviour. - */ - public static void setDesignTimeEmptySize(int pixels) - { - eSz = pixels; - } - - /** Associates con with the creation string s. The con object should - * probably have an equals method that compares identities or con objects that .equals() will only - * be able to have one creation string. - *

- * If {@link LayoutUtil#isDesignTime(ContainerWrapper)} returns false the method does nothing. - * @param con The object. if null the method does nothing. - * @param s The creation string. if null the method does nothing. - */ - static void putCCString(Object con, String s) - { - if (s != null && con != null && isDesignTime(null)) { - if (CR_MAP == null) - CR_MAP = new WeakHashMap(64); - - CR_MAP.put(con, s); - } - } - - /** Sets/add the persistence delegates to be used for a class. - * @param c The class to set the registered delegate for. - * @param del The new delegate or null to erase to old one. - */ - static synchronized void setDelegate(Class c, PersistenceDelegate del) - { - try { - Introspector.getBeanInfo(c, Introspector.IGNORE_ALL_BEANINFO).getBeanDescriptor().setValue("persistenceDelegate", del); - } catch (Exception ignored) { - } - } - - /** Returns strings set with {@link #putCCString(Object, String)} or null if nothing is associated or - * {@link LayoutUtil#isDesignTime(ContainerWrapper)} returns false. - * @param con The constrain object. - * @return The creation string or null if nothing is registered with the con object. - */ - static String getCCString(Object con) - { - return CR_MAP != null ? CR_MAP.get(con) : null; - } - - static void throwCC() - { - throw new IllegalStateException("setStoreConstraintData(true) must be set for strings to be saved."); - } - - /** Takes a number on min/preferred/max sizes and resize constraints and returns the calculated sizes which sum should add up to bounds. Whether the sum - * will actually equal bounds is dependent on the pref/max sizes and resize constraints. - * @param sizes [ix],[MIN][PREF][MAX]. Grid.CompWrap.NOT_SET will be treated as N/A or 0. A "[MIN][PREF][MAX]" array with null elements will be interpreted as very flexible (no bounds) - * but if the array itself is null it will not get any size. - * @param resConstr Elements can be null and the whole array can be null. null means that the size will not be flexible at all. - * Can have length less than sizes in which case the last element should be used for the elements missing. - * @param defPushWeights If there is no grow weight for a resConstr the corresponding value of this array is used. - * These forced resConstr will be grown last though and only if needed to fill to the bounds. - * @param startSizeType The initial size to use. E.g. {@link net.miginfocom.layout.LayoutUtil#MIN}. - * @param bounds To use for relative sizes. - * @return The sizes. Array length will match sizes. - */ - static int[] calculateSerial(int[][] sizes, ResizeConstraint[] resConstr, Float[] defPushWeights, int startSizeType, int bounds) - { - float[] lengths = new float[sizes.length]; // heights/widths that are set - float usedLength = 0.0f; - - // Give all preferred size to start with - for (int i = 0; i < sizes.length; i++) { - if (sizes[i] != null) { - float len = sizes[i][startSizeType] != NOT_SET ? sizes[i][startSizeType] : 0; - int newSizeBounded = getBrokenBoundary(len, sizes[i][MIN], sizes[i][MAX]); - if (newSizeBounded != NOT_SET) - len = newSizeBounded; - - usedLength += len; - lengths[i] = len; - } - } - - int useLengthI = Math.round(usedLength); - if (useLengthI != bounds && resConstr != null) { - boolean isGrow = useLengthI < bounds; - - // Create a Set with the available priorities - TreeSet prioList = new TreeSet(); - for (int i = 0; i < sizes.length; i++) { - ResizeConstraint resC = (ResizeConstraint) getIndexSafe(resConstr, i); - if (resC != null) - prioList.add(isGrow ? resC.growPrio : resC.shrinkPrio); - } - Integer[] prioIntegers = prioList.toArray(new Integer[prioList.size()]); - - for (int force = 0; force <= ((isGrow && defPushWeights != null) ? 1 : 0); force++) { // Run twice if defGrow and the need for growing. - for (int pr = prioIntegers.length - 1; pr >= 0; pr--) { - int curPrio = prioIntegers[pr]; - - float totWeight = 0f; - Float[] resizeWeight = new Float[sizes.length]; - for (int i = 0; i < sizes.length; i++) { - if (sizes[i] == null) // if no min/pref/max size at all do not grow or shrink. - continue; - - ResizeConstraint resC = (ResizeConstraint) getIndexSafe(resConstr, i); - if (resC != null) { - int prio = isGrow ? resC.growPrio : resC.shrinkPrio; - - if (curPrio == prio) { - if (isGrow) { - resizeWeight[i] = (force == 0 || resC.grow != null) ? resC.grow : (defPushWeights[i < defPushWeights.length ? i : defPushWeights.length - 1]); - } else { - resizeWeight[i] = resC.shrink; - } - if (resizeWeight[i] != null) - totWeight += resizeWeight[i]; - } - } - } - - if (totWeight > 0f) { - boolean hit; - do { - float toChange = bounds - usedLength; - hit = false; - float changedWeight = 0f; - for (int i = 0; i < sizes.length && totWeight > 0.0001f; i++) { - - Float weight = resizeWeight[i]; - if (weight != null) { - float sizeDelta = toChange * weight / totWeight; - float newSize = lengths[i] + sizeDelta; - - if (sizes[i] != null) { - int newSizeBounded = getBrokenBoundary(newSize, sizes[i][MIN], sizes[i][MAX]); - if (newSizeBounded != NOT_SET) { - resizeWeight[i] = null; - hit = true; - changedWeight += weight; - newSize = newSizeBounded; - sizeDelta = newSize - lengths[i]; - } - } - - lengths[i] = newSize; - usedLength += sizeDelta; - } - } - totWeight -= changedWeight; - } while (hit); - } - } - } - } - return roundSizes(lengths); - } - - static Object getIndexSafe(Object[] arr, int ix) - { - return arr != null ? arr[ix < arr.length ? ix : arr.length - 1] : null; - } - - /** Returns the broken boundary if sz is outside the boundaries lower or upper. If both boundaries - * are broken, the lower one is returned. If sz is < 0 then new Float(0f) is returned so that no sizes can be - * negative. - * @param sz The size to check - * @param lower The lower boundary (or null for no boundary). - * @param upper The upper boundary (or null for no boundary). - * @return The broken boundary. - */ - private static int getBrokenBoundary(float sz, int lower, int upper) - { - if (lower != NOT_SET) { - if (sz < lower) - return lower; - } else if (sz < 0f) { - return 0; - } - - if (upper != NOT_SET && sz > upper) - return upper; - - return NOT_SET; - } - - - static int sum(int[] terms, int start, int len) - { - int s = 0; - for (int i = start, iSz = start + len; i < iSz; i++) - s += terms[i]; - return s; - } - - static int sum(int[] terms) - { - return sum(terms, 0, terms.length); - } - - /** Keeps f within min and max. Min is of higher priority if min is larger than max. - * @param f The value to clamp - * @param min - * @param max - * @return The clamped value, between min and max. - */ - static float clamp(float f, float min, float max) - { - return Math.max(min, Math.min(f, max)); - } - - /** Keeps i within min and max. Min is of higher priority if min is larger than max. - * @param i The value to clamp - * @param min - * @param max - * @return The clamped value, between min and max. - */ - static int clamp(int i, int min, int max) - { - return Math.max(min, Math.min(i, max)); - } - - public static int getSizeSafe(int[] sizes, int sizeType) - { - if (sizes == null || sizes[sizeType] == NOT_SET) - return sizeType == MAX ? LayoutUtil.INF : 0; - return sizes[sizeType]; - } - - static BoundSize derive(BoundSize bs, UnitValue min, UnitValue pref, UnitValue max) - { - if (bs == null || bs.isUnset()) - return new BoundSize(min, pref, max, null); - - return new BoundSize( - min != null ? min : bs.getMin(), - pref != null ? pref : bs.getPreferred(), - max != null ? max : bs.getMax(), - bs.getGapPush(), - null); - } - - /** Returns if left-to-right orientation is used. If not set explicitly in the layout constraints the Locale - * of the parent is used. - * @param lc The constraint if there is one. Can be null. - * @param container The parent that may be used to get the left-to-right if lc does not specify this. - * @return If left-to-right orientation is currently used. - */ - public static boolean isLeftToRight(LC lc, ContainerWrapper container) - { - if (lc != null && lc.getLeftToRight() != null) - return lc.getLeftToRight(); - - return container == null || container.isLeftToRight(); - } - - /** Round a number of float sizes into int sizes so that the total length match up - * @param sizes The sizes to round - * @return An array of equal length as sizes. - */ - static int[] roundSizes(float[] sizes) - { - int[] retInts = new int[sizes.length]; - float posD = 0; - - for (int i = 0; i < retInts.length; i++) { - int posI = (int) (posD + 0.5f); - - posD += sizes[i]; - - retInts[i] = (int) (posD + 0.5f) - posI; - } - - return retInts; - } - - /** Safe equals. null == null, but null never equals anything else. - * @param o1 The first object. May be null. - * @param o2 The second object. May be null. - * @return Returns true if o1 and o2 are equal (using .equals()) or both are null. - */ - static boolean equals(Object o1, Object o2) - { - return o1 == o2 || (o1 != null && o2 != null && o1.equals(o2)); - } - -// static int getBaselineCorrect(Component comp) -// { -// Dimension pSize = comp.getPreferredSize(); -// int baseline = comp.getBaseline(pSize.width, pSize.height); -// int nextBaseline = comp.getBaseline(pSize.width, pSize.height + 1); -// -// // Amount to add to height when calculating where baseline -// // lands for a particular height: -// int padding = 0; -// -// // Where the baseline is relative to the mid point -// int baselineOffset = baseline - pSize.height / 2; -// if (pSize.height % 2 == 0 && baseline != nextBaseline) { -// padding = 1; -// } else if (pSize.height % 2 == 1 && baseline == nextBaseline) { -// baselineOffset--; -// padding = 1; -// } -// -// // The following calculates where the baseline lands for -// // the height z: -// return (pSize.height + padding) / 2 + baselineOffset; -// } - - - /** Returns the insets for the side. - * @param side top == 0, left == 1, bottom = 2, right = 3. - * @param getDefault If true the default insets will get retrieved if lc has none set. - * @return The insets for the side. Never null. - */ - static UnitValue getInsets(LC lc, int side, boolean getDefault) - { - UnitValue[] i = lc.getInsets(); - return (i != null && i[side] != null) ? i[side] : (getDefault ? PlatformDefaults.getPanelInsets(side) : UnitValue.ZERO); - } - - /** Writes the object and CLOSES the stream. Uses the persistence delegate registered in this class. - * @param os The stream to write to. Will be closed. - * @param o The object to be serialized. - * @param listener The listener to receive the exceptions if there are any. If null not used. - */ - static void writeXMLObject(OutputStream os, Object o, ExceptionListener listener) - { - ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(LayoutUtil.class.getClassLoader()); - - XMLEncoder encoder = new XMLEncoder(os); - - if (listener != null) - encoder.setExceptionListener(listener); - - encoder.writeObject(o); - encoder.close(); // Must be closed to write. - - Thread.currentThread().setContextClassLoader(oldClassLoader); - } - - private static ByteArrayOutputStream writeOutputStream = null; - /** Writes an object to XML. - * @param out The object out to write to. Will not be closed. - * @param o The object to write. - */ - public static synchronized void writeAsXML(ObjectOutput out, Object o) throws IOException - { - if (writeOutputStream == null) - writeOutputStream = new ByteArrayOutputStream(16384); - - writeOutputStream.reset(); - - writeXMLObject(writeOutputStream, o, new ExceptionListener() { - @Override - public void exceptionThrown(Exception e) { - e.printStackTrace(); - }}); - - byte[] buf = writeOutputStream.toByteArray(); - - out.writeInt(buf.length); - out.write(buf); - } - - private static byte[] readBuf = null; - /** Reads an object from in using the - * @param in The object input to read from. - * @return The object. Never null. - * @throws IOException If there was a problem saving as XML - */ - public static synchronized Object readAsXML(ObjectInput in) throws IOException - { - if (readBuf == null) - readBuf = new byte[16384]; - - Thread cThread = Thread.currentThread(); - ClassLoader oldCL = null; - - try { - oldCL = cThread.getContextClassLoader(); - cThread.setContextClassLoader(LayoutUtil.class.getClassLoader()); - } catch(SecurityException ignored) { - } - - Object o = null; - try { - int length = in.readInt(); - if (length > readBuf.length) - readBuf = new byte[length]; - - in.readFully(readBuf, 0, length); - - o = new XMLDecoder(new ByteArrayInputStream(readBuf, 0, length)).readObject(); - - } catch(EOFException ignored) { - } - - if (oldCL != null) - cThread.setContextClassLoader(oldCL); - - return o; - } - - private static final IdentityHashMap SER_MAP = new IdentityHashMap(2); - - /** Sets the serialized object and associates it with caller. - * @param caller The object created o - * @param o The just serialized object. - */ - public static void setSerializedObject(Object caller, Object o) - { - synchronized(SER_MAP) { - SER_MAP.put(caller, o); - } - } - - /** Returns the serialized object that are associated with caller. It also removes it from the list. - * @param caller The original creator of the object. - * @return The object. - */ - public static Object getSerializedObject(Object caller) - { - synchronized(SER_MAP) { - return SER_MAP.remove(caller); - } - } -} diff --git a/src2/net/miginfocom/layout/LinkHandler.java b/src2/net/miginfocom/layout/LinkHandler.java deleted file mode 100644 index 2aab6f1..0000000 --- a/src2/net/miginfocom/layout/LinkHandler.java +++ /dev/null @@ -1,182 +0,0 @@ -package net.miginfocom.layout; - -import java.util.HashMap; -import java.util.WeakHashMap; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** - */ -public final class LinkHandler -{ - public static final int X = 0; - public static final int Y = 1; - public static final int WIDTH = 2; - public static final int HEIGHT = 3; - public static final int X2 = 4; - public static final int Y2 = 5; - - // indices for values of LAYOUTS - private static final int VALUES = 0; - private static final int VALUES_TEMP = 1; - - private static final WeakHashMap[]> LAYOUTS = new WeakHashMap[]>(); - - private LinkHandler() - { - } - - public synchronized static Integer getValue(Object layout, String key, int type) - { - Integer ret = null; - - HashMap[] layoutValues = LAYOUTS.get(layout); - if (layoutValues != null) { - int[] rect = layoutValues[VALUES_TEMP].get(key); - if (rect != null && rect[type] != LayoutUtil.NOT_SET) { - ret = rect[type]; - } else { - rect = layoutValues[VALUES].get(key); - ret = (rect != null && rect[type] != LayoutUtil.NOT_SET) ? rect[type] : null; - } - } - return ret; - } - - /** Sets a key that can be linked to from any component. - * @param layout The MigLayout instance - * @param key The key to link to. This is the same as the ID in a component constraint. - * @param x x - * @param y y - * @param width Width - * @param height Height - * @return If the value was changed - */ - public synchronized static boolean setBounds(Object layout, String key, int x, int y, int width, int height) - { - return setBounds(layout, key, x, y, width, height, false, false); - } - - synchronized static boolean setBounds(Object layout, String key, int x, int y, int width, int height, boolean temporary, boolean incCur) - { - HashMap[] layoutValues = LAYOUTS.get(layout); - if (layoutValues != null) { - HashMap map = layoutValues[temporary ? VALUES_TEMP : VALUES]; - int[] old = map.get(key); - - if (old == null || old[X] != x || old[Y] != y || old[WIDTH] != width || old[HEIGHT] != height) { - if (old == null || incCur == false) { - map.put(key, new int[] {x, y, width, height, x + width, y + height}); - return true; - } else { - boolean changed = false; - - if (x != LayoutUtil.NOT_SET) { - if (old[X] == LayoutUtil.NOT_SET || x < old[X]) { - old[X] = x; - old[WIDTH] = old[X2] - x; - changed = true; - } - - if (width != LayoutUtil.NOT_SET) { - int x2 = x + width; - if (old[X2] == LayoutUtil.NOT_SET || x2 > old[X2]) { - old[X2] = x2; - old[WIDTH] = x2 - old[X]; - changed = true; - } - } - } - - if (y != LayoutUtil.NOT_SET) { - if (old[Y] == LayoutUtil.NOT_SET || y < old[Y]) { - old[Y] = y; - old[HEIGHT] = old[Y2] - y; - changed = true; - } - - if (height != LayoutUtil.NOT_SET) { - int y2 = y + height; - if (old[Y2] == LayoutUtil.NOT_SET || y2 > old[Y2]) { - old[Y2] = y2; - old[HEIGHT] = y2 - old[Y]; - changed = true; - } - } - } - return changed; - } - } - return false; - } - - int[] bounds = new int[] {x, y, width, height, x + width, y + height}; - - HashMap values_temp = new HashMap(4); - if (temporary) - values_temp.put(key, bounds); - - HashMap values = new HashMap(4); - if (temporary == false) - values.put(key, bounds); - - LAYOUTS.put(layout, new HashMap[] {values, values_temp}); - - return true; - } - - /** This method clear any weak references right away instead of waiting for the GC. This might be advantageous - * if lots of layout are created and disposed of quickly to keep memory consumption down. - * @since 3.7.4 - */ - public synchronized static void clearWeakReferencesNow() - { - LAYOUTS.clear(); - } - - public synchronized static boolean clearBounds(Object layout, String key) - { - HashMap[] layoutValues = LAYOUTS.get(layout); - if (layoutValues != null) - return layoutValues[VALUES].remove(key) != null; - return false; - } - - synchronized static void clearTemporaryBounds(Object layout) - { - HashMap[] layoutValues = LAYOUTS.get(layout); - if (layoutValues != null) - layoutValues[VALUES_TEMP].clear(); - } -} diff --git a/src2/net/miginfocom/layout/PlatformDefaults.java b/src2/net/miginfocom/layout/PlatformDefaults.java deleted file mode 100644 index e1b72c4..0000000 --- a/src2/net/miginfocom/layout/PlatformDefaults.java +++ /dev/null @@ -1,855 +0,0 @@ -package net.miginfocom.layout; - -import java.util.HashMap; - -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - * @author Xxxx Xxxx, Xxxx - Gnome support - * Date: 2008-jan-16 - */ - -/** Currently handles Windows, Mac OS X, and GNOME spacing. - */ -public final class PlatformDefaults -{ - /** Property to use in LAF settings and as JComponent client property - * to specify the visual padding. - *

- */ - public static String VISUAL_PADDING_PROPERTY = "visualPadding"; - - private static int DEF_H_UNIT = UnitValue.LPX; - private static int DEF_V_UNIT = UnitValue.LPY; - - private static InCellGapProvider GAP_PROVIDER = null; - - private static volatile int MOD_COUNT = 0; - -// private static final UnitValue LPX1 = new UnitValue(1, UnitValue.LPX, null); -// private static final UnitValue LPX4 = new UnitValue(4, UnitValue.LPX, null); - private static final UnitValue LPX6 = new UnitValue(6, UnitValue.LPX, null); - private static final UnitValue LPX7 = new UnitValue(7, UnitValue.LPX, null); -// private static final UnitValue LPX8 = new UnitValue(8, UnitValue.LPX, null); -// private static final UnitValue LPX9 = new UnitValue(9, UnitValue.LPX, null); -// private static final UnitValue LPX10 = new UnitValue(10, UnitValue.LPX, null); - private static final UnitValue LPX11 = new UnitValue(11, UnitValue.LPX, null); - private static final UnitValue LPX12 = new UnitValue(12, UnitValue.LPX, null); -// private static final UnitValue LPX14 = new UnitValue(14, UnitValue.LPX, null); - private static final UnitValue LPX16 = new UnitValue(16, UnitValue.LPX, null); - private static final UnitValue LPX18 = new UnitValue(18, UnitValue.LPX, null); - private static final UnitValue LPX20 = new UnitValue(20, UnitValue.LPX, null); - -// private static final UnitValue LPY1 = new UnitValue(1, UnitValue.LPY, null); -// private static final UnitValue LPY4 = new UnitValue(4, UnitValue.LPY, null); - private static final UnitValue LPY6 = new UnitValue(6, UnitValue.LPY, null); - private static final UnitValue LPY7 = new UnitValue(7, UnitValue.LPY, null); -// private static final UnitValue LPY8 = new UnitValue(8, UnitValue.LPY, null); -// private static final UnitValue LPY9 = new UnitValue(9, UnitValue.LPY, null); -// private static final UnitValue LPY10 = new UnitValue(10, UnitValue.LPY, null); - private static final UnitValue LPY11 = new UnitValue(11, UnitValue.LPY, null); - private static final UnitValue LPY12 = new UnitValue(12, UnitValue.LPY, null); -// private static final UnitValue LPY14 = new UnitValue(14, UnitValue.LPY, null); - private static final UnitValue LPY16 = new UnitValue(16, UnitValue.LPY, null); - private static final UnitValue LPY18 = new UnitValue(18, UnitValue.LPY, null); - private static final UnitValue LPY20 = new UnitValue(20, UnitValue.LPY, null); - - public static final int WINDOWS_XP = 0; - public static final int MAC_OSX = 1; - public static final int GNOME = 2; -// private static final int KDE = 3; - - private static int CUR_PLAF = WINDOWS_XP; - - // Used for holding values. - private final static UnitValue[] PANEL_INS = new UnitValue[4]; - private final static UnitValue[] DIALOG_INS = new UnitValue[4]; - - private static String BUTTON_FORMAT = null; - - private static final HashMap HOR_DEFS = new HashMap(32); - private static final HashMap VER_DEFS = new HashMap(32); - private static BoundSize DEF_VGAP = null, DEF_HGAP = null; - static BoundSize RELATED_X = null, RELATED_Y = null, UNRELATED_X = null, UNRELATED_Y = null; - private static UnitValue BUTT_WIDTH = null; - private static UnitValue BUTT_PADDING = null; - - private static Float horScale = null, verScale = null; - - /** I value indicating that the size of the font for the container of the component - * will be used as a base for calculating the logical pixel size. This is much as how - * Windows calculated DLU (dialog units). - * @see net.miginfocom.layout.UnitValue#LPX - * @see net.miginfocom.layout.UnitValue#LPY - * @see #setLogicalPixelBase(int) - */ - public static final int BASE_FONT_SIZE = 100; - - /** I value indicating that the screen DPI will be used as a base for calculating the - * logical pixel size. - *

- * This is the default value. - * @see net.miginfocom.layout.UnitValue#LPX - * @see net.miginfocom.layout.UnitValue#LPY - * @see #setLogicalPixelBase(int) - * @see #setVerticalScaleFactor(Float) - * @see #setHorizontalScaleFactor(Float) - */ - public static final int BASE_SCALE_FACTOR = 101; - - /** I value indicating that the size of a logical pixel should always be a real pixel - * and thus no compensation will be made. - * @see net.miginfocom.layout.UnitValue#LPX - * @see net.miginfocom.layout.UnitValue#LPY - * @see #setLogicalPixelBase(int) - */ - public static final int BASE_REAL_PIXEL = 102; - - private static int LP_BASE = BASE_SCALE_FACTOR; - - private static Integer BASE_DPI_FORCED = null; - private static int BASE_DPI = 96; - - private static boolean dra = true; - - private static final HashMap VISUAL_BOUNDS = new HashMap(64); - - static { - setPlatform(getCurrentPlatform()); - MOD_COUNT = 0; - } - - /** Returns the platform that the JRE is running on currently. - * @return The platform that the JRE is running on currently. E.g. {@link #MAC_OSX}, {@link #WINDOWS_XP}, or {@link #GNOME}. - */ - public static int getCurrentPlatform() - { - final String os = System.getProperty("os.name"); - if (os.startsWith("Mac OS")) { - return MAC_OSX; - } else if (os.startsWith("Linux")) { - return GNOME; - } else { - return WINDOWS_XP; - } - } - - private PlatformDefaults() - { - } - - /** Set the defaults to the default for the platform - * @param plaf The platform. PlatformDefaults.WINDOWS_XP, - * PlatformDefaults.MAC_OSX, or - * PlatformDefaults.GNOME. - */ - public static void setPlatform(int plaf) - { - switch (plaf) { - case WINDOWS_XP: - setDefaultVisualPadding("TabbedPane." + VISUAL_PADDING_PROPERTY, new int[]{1, 0, 1, 2}); - setRelatedGap(LPX7, LPY7); - setUnrelatedGap(LPX11, LPY11); - setParagraphGap(LPX20, LPY20); - setIndentGap(LPX11, LPY11); - setGridCellGap(LPX7, LPY7); - - setMinimumButtonWidth(new UnitValue(75, UnitValue.LPX, null)); - setButtonOrder("L_E+U+YNBXOCAH_I_R"); - setDialogInsets(LPY11, LPX11, LPY11, LPX11); - setPanelInsets(LPY7, LPX7, LPY7, LPX7); - break; - - case MAC_OSX: - - setDefaultVisualPadding("Button." + VISUAL_PADDING_PROPERTY, new int[]{3, 6, 5, 6}); - setDefaultVisualPadding("Button.icon." + VISUAL_PADDING_PROPERTY, new int[]{3, 2, 3, 2}); - setDefaultVisualPadding("Button.square." + VISUAL_PADDING_PROPERTY, new int[]{4, 4, 4, 4}); - setDefaultVisualPadding("Button.square.icon." + VISUAL_PADDING_PROPERTY, new int[]{4, 4, 4, 4}); - setDefaultVisualPadding("Button.gradient." + VISUAL_PADDING_PROPERTY, new int[]{5, 4, 5, 4}); - setDefaultVisualPadding("Button.gradient.icon." + VISUAL_PADDING_PROPERTY, new int[]{5, 4, 5, 4}); - setDefaultVisualPadding("Button.bevel." + VISUAL_PADDING_PROPERTY, new int[]{2, 2, 3, 2}); - setDefaultVisualPadding("Button.bevel.icon." + VISUAL_PADDING_PROPERTY, new int[]{2, 2, 3, 2}); - setDefaultVisualPadding("Button.textured." + VISUAL_PADDING_PROPERTY, new int[]{3, 2, 3, 2}); - setDefaultVisualPadding("Button.textured.icon." + VISUAL_PADDING_PROPERTY, new int[]{3, 2, 3, 2}); - setDefaultVisualPadding("Button.roundRect." + VISUAL_PADDING_PROPERTY, new int[]{5, 4, 5, 4}); - setDefaultVisualPadding("Button.roundRect.icon." + VISUAL_PADDING_PROPERTY, new int[]{5, 4, 5, 4}); - setDefaultVisualPadding("Button.recessed." + VISUAL_PADDING_PROPERTY, new int[]{5, 4, 5, 4}); - setDefaultVisualPadding("Button.recessed.icon." + VISUAL_PADDING_PROPERTY, new int[]{5, 4, 5, 4}); - setDefaultVisualPadding("Button.help." + VISUAL_PADDING_PROPERTY, new int[]{4, 3, 3, 4}); - setDefaultVisualPadding("Button.help.icon." + VISUAL_PADDING_PROPERTY, new int[]{4, 3, 3, 4}); - - setDefaultVisualPadding("ComboBox." + VISUAL_PADDING_PROPERTY, new int[]{2, 4, 4, 5}); - setDefaultVisualPadding("ComboBox.isPopDown." + VISUAL_PADDING_PROPERTY, new int[]{2, 5, 4, 5}); - setDefaultVisualPadding("ComboBox.isSquare." + VISUAL_PADDING_PROPERTY, new int[]{1, 6, 5, 7}); - - setDefaultVisualPadding("ComboBox.editable." + VISUAL_PADDING_PROPERTY, new int[]{3, 3, 3, 2}); - setDefaultVisualPadding("ComboBox.editable.isSquare." + VISUAL_PADDING_PROPERTY, new int[]{3, 3, 3, 1}); - - setDefaultVisualPadding("TextField." + VISUAL_PADDING_PROPERTY, new int[]{3, 3, 3, 3}); - setDefaultVisualPadding("TabbedPane." + VISUAL_PADDING_PROPERTY, new int[]{4, 8, 11, 8}); - - setDefaultVisualPadding("Spinner." + VISUAL_PADDING_PROPERTY, new int[]{3, 3, 3, 1}); - - setDefaultVisualPadding("RadioButton." + VISUAL_PADDING_PROPERTY, new int[]{4, 6, 3, 5}); - setDefaultVisualPadding("RadioButton.small." + VISUAL_PADDING_PROPERTY, new int[]{4, 6, 3, 5}); - setDefaultVisualPadding("RadioButton.mini." + VISUAL_PADDING_PROPERTY, new int[]{5, 7, 4, 5}); - setDefaultVisualPadding("CheckBox." + VISUAL_PADDING_PROPERTY, new int[]{5, 7, 4, 5}); - setDefaultVisualPadding("CheckBox.small." + VISUAL_PADDING_PROPERTY, new int[]{5, 7, 4, 5}); - setDefaultVisualPadding("CheckBox.mini." + VISUAL_PADDING_PROPERTY, new int[]{6, 7, 3, 5}); - - setRelatedGap(LPX7, LPY7); - setUnrelatedGap(LPX11, LPY11); - setParagraphGap(LPX20, LPY20); - setIndentGap(LPX11, LPY11); - setGridCellGap(LPX7, LPY7); - - setMinimumButtonWidth(new UnitValue(70, UnitValue.LPX, null)); - setMinimumButtonPadding(new UnitValue(8, UnitValue.LPX, null)); - setButtonOrder("L_HE+U+NYBXCOA_I_R"); - setDialogInsets(LPY20, LPX20, LPY20, LPX20); - setPanelInsets(LPY16, LPX16, LPY16, LPX16); - break; - - case GNOME: - setRelatedGap(LPX6, LPY6); // GNOME HIG 8.2.3 - setUnrelatedGap(LPX12, LPY12); // GNOME HIG 8.2.3 - setParagraphGap(LPX18, LPY18); // GNOME HIG 8.2.3 - setIndentGap(LPX12, LPY12); // GNOME HIG 8.2.3 - setGridCellGap(LPX6, LPY6); // GNOME HIG 8.2.3 - - // GtkButtonBox, child-min-width property default value - setMinimumButtonWidth(new UnitValue(85, UnitValue.LPX, null)); - setButtonOrder("L_HE+UNYACBXO_I_R"); // GNOME HIG 3.4.2, 3.7.1 - setDialogInsets(LPY12, LPX12, LPY12, LPX12); // GNOME HIG 3.4.3 - setPanelInsets(LPY6, LPX6, LPY6, LPX6); // ??? - break; - default: - throw new IllegalArgumentException("Unknown platform: " + plaf); - } - CUR_PLAF = plaf; - BASE_DPI = BASE_DPI_FORCED != null ? BASE_DPI_FORCED : getPlatformDPI(plaf); - } - - /** Sets the visual bounds for a component type. - * @param key The component type. E.g. "TabbedPane.visualPadding" or "ComboBox.editable.isSquare.visualPadding". See source code for list. - * @param insets Top, left, bottom, right. Always length 4 or null. - * @see net.miginfocom.layout.ComponentWrapper#getVisualPadding() - */ - public static void setDefaultVisualPadding(String key, int[] insets) - { - VISUAL_BOUNDS.put(key, insets); - } - - /** Returns the visual bounds for a component type. - * @param key The component type. E.g. "TabbedPane.visualPadding" or "ComboBox.editable.isSquare.visualPadding". See source code for list. - * @return insets Top, left, bottom, right. Always length 4 or null. Live object, MUST NOT BE CHANGED!. - * @see net.miginfocom.layout.ComponentWrapper#getVisualPadding() - */ - public static int[] getDefaultVisualPadding(String key) - { - return VISUAL_BOUNDS.get(key); - } - - public static int getPlatformDPI(int plaf) - { - switch (plaf) { - case WINDOWS_XP: - case GNOME: - return 96; - case MAC_OSX: - try { - return java.awt.Toolkit.getDefaultToolkit().getScreenResolution(); - } catch (Throwable t) { - return 72; - } - default: - throw new IllegalArgumentException("Unknown platform: " + plaf); - } - } - - /** Returns the current platform - * @return PlatformDefaults.WINDOWS or PlatformDefaults.MAC_OSX - */ - public static int getPlatform() - { - return CUR_PLAF; - } - - public static int getDefaultDPI() - { - return BASE_DPI; - } - - /** Sets the default platform DPI. Normally this is set in the {@link #setPlatform(int)} for the different platforms - * but it can be tweaked here. For instance SWT on Mac does this. - *

- * Note that this is not the actual current DPI, but the base DPI for the toolkit. - * @param dpi The base DPI. If null the default DPI is reset to the platform base DPI. - */ - public static void setDefaultDPI(Integer dpi) - { - BASE_DPI = dpi != null ? dpi : getPlatformDPI(CUR_PLAF); - BASE_DPI_FORCED = dpi; - } - - /** The forced scale factor that all screen relative units (e.g. millimeters, inches and logical pixels) will be multiplied - * with. If null this will default to a scale that will scale the current screen to the default screen resolution - * (72 DPI for Mac and 92 DPI for Windows). - * @return The forced scale or null for default scaling. - * @see #getHorizontalScaleFactor() - * @see ComponentWrapper#getHorizontalScreenDPI() - */ - public static Float getHorizontalScaleFactor() - { - return horScale; - } - - /** The forced scale factor that all screen relative units (e.g. millimeters, inches and logical pixels) will be multiplied - * with. If null this will default to a scale that will scale the current screen to the default screen resolution - * (72 DPI for Mac and 92 DPI for Windows). - * @param f The forced scale or null for default scaling. - * @see #getHorizontalScaleFactor() - * @see ComponentWrapper#getHorizontalScreenDPI() - */ - public static void setHorizontalScaleFactor(Float f) - { - if (!LayoutUtil.equals(horScale, f)) { - horScale = f; - MOD_COUNT++; - } - } - - /** The forced scale factor that all screen relative units (e.g. millimeters, inches and logical pixels) will be multiplied - * with. If null this will default to a scale that will scale the current screen to the default screen resolution - * (72 DPI for Mac and 92 DPI for Windows). - * @return The forced scale or null for default scaling. - * @see #getHorizontalScaleFactor() - * @see ComponentWrapper#getVerticalScreenDPI() - */ - public static Float getVerticalScaleFactor() - { - return verScale; - } - - /** The forced scale factor that all screen relative units (e.g. millimeters, inches and logical pixels) will be multiplied - * with. If null this will default to a scale that will scale the current screen to the default screen resolution - * (72 DPI for Mac and 92 DPI for Windows). - * @param f The forced scale or null for default scaling. - * @see #getHorizontalScaleFactor() - * @see ComponentWrapper#getVerticalScreenDPI() - */ - public static void setVerticalScaleFactor(Float f) - { - if (!LayoutUtil.equals(verScale, f)) { - verScale = f; - MOD_COUNT++; - } - } - - /** What base value should be used to calculate logical pixel sizes. - * @return The current base. Default is {@link #BASE_SCALE_FACTOR} - * @see #BASE_FONT_SIZE - * @see #BASE_SCALE_FACTOR - * @see #BASE_REAL_PIXEL -*/ - public static int getLogicalPixelBase() - { - return LP_BASE; - } - - /** What base value should be used to calculate logical pixel sizes. - * @param base The new base. Default is {@link #BASE_SCALE_FACTOR} - * @see #BASE_FONT_SIZE - * @see #BASE_SCALE_FACTOR - * @see #BASE_REAL_PIXEL - */ - public static void setLogicalPixelBase(int base) - { - if (LP_BASE != base) { - if (base < BASE_FONT_SIZE || base > BASE_REAL_PIXEL) - throw new IllegalArgumentException("Unrecognized base: " + base); - - LP_BASE = base; - MOD_COUNT++; - } - } - - /** Sets gap value for components that are "related". - * @param x The value that will be transformed to pixels. If null the current value will not change. - * @param y The value that will be transformed to pixels. If null the current value will not change. - */ - public static void setRelatedGap(UnitValue x, UnitValue y) - { - setUnitValue(new String[] {"r", "rel", "related"}, x, y); - - RELATED_X = new BoundSize(x, x, null, "rel:rel"); - RELATED_Y = new BoundSize(y, y, null, "rel:rel"); - } - - /** Sets gap value for components that are "unrelated". - * @param x The value that will be transformed to pixels. If null the current value will not change. - * @param y The value that will be transformed to pixels. If null the current value will not change. - */ - public static void setUnrelatedGap(UnitValue x, UnitValue y) - { - setUnitValue(new String[] {"u", "unrel", "unrelated"}, x, y); - - UNRELATED_X = new BoundSize(x, x, null, "unrel:unrel"); - UNRELATED_Y = new BoundSize(y, y, null, "unrel:unrel"); - } - - /** Sets paragraph gap value for components. - * @param x The value that will be transformed to pixels. If null the current value will not change. - * @param y The value that will be transformed to pixels. If null the current value will not change. - */ - public static void setParagraphGap(UnitValue x, UnitValue y) - { - setUnitValue(new String[] {"p", "para", "paragraph"}, x, y); - } - - /** Sets gap value for components that are "intended". - * @param x The value that will be transformed to pixels. If null the current value will not change. - * @param y The value that will be transformed to pixels. If null the current value will not change. - */ - public static void setIndentGap(UnitValue x, UnitValue y) - { - setUnitValue(new String[] {"i", "ind", "indent"}, x, y); - } - - /** Sets gap between two cells in the grid. Note that this is not a gap between component IN a cell, that has to be set - * on the component constraints. The value will be the min and preferred size of the gap. - * @param x The value that will be transformed to pixels. If null the current value will not change. - * @param y The value that will be transformed to pixels. If null the current value will not change. - */ - public static void setGridCellGap(UnitValue x, UnitValue y) - { - if (x != null) - DEF_HGAP = new BoundSize(x, x, null, null); - - if (y != null) - DEF_VGAP = new BoundSize(y, y, null, null); - - MOD_COUNT++; - } - - /** Sets the recommended minimum button width. - * @param width The recommended minimum button width. - */ - public static void setMinimumButtonWidth(UnitValue width) - { - BUTT_WIDTH = width; - MOD_COUNT++; - } - - /** Returns the recommended minimum button width depending on the current set platform. - * @return The recommended minimum button width depending on the current set platform. - */ - public static UnitValue getMinimumButtonWidth() - { - return BUTT_WIDTH; - } - - public static void setMinimumButtonPadding(UnitValue padding) - { - BUTT_PADDING = padding; - MOD_COUNT++; - } - - public static UnitValue getMinimumButtonPadding() - { - return BUTT_PADDING; - } - - public static float getMinimumButtonWidthIncludingPadding(float refValue, ContainerWrapper parent, ComponentWrapper comp) - { - final int buttonMinWidth = getMinimumButtonWidth().getPixels(refValue, parent, comp); - if (comp != null && getMinimumButtonPadding() != null) { - return Math.max(comp.getMinimumWidth(comp.getWidth()) + getMinimumButtonPadding().getPixels(refValue, parent, comp) * 2, buttonMinWidth); - } else { - return buttonMinWidth; - } - } - - /** Returns the unit value associated with the unit. (E.i. "related" or "indent"). Must be lower case. - * @param unit The unit string. - * @return The unit value associated with the unit. null for unrecognized units. - */ - public static UnitValue getUnitValueX(String unit) - { - return HOR_DEFS.get(unit); - } - - /** Returns the unit value associated with the unit. (E.i. "related" or "indent"). Must be lower case. - * @param unit The unit string. - * @return The unit value associated with the unit. null for unrecognized units. - */ - public static UnitValue getUnitValueY(String unit) - { - return VER_DEFS.get(unit); - } - - /** Sets the unit value associated with a unit string. This may be used to store values for new unit strings - * or modify old. Note that if a built in unit (such as "related") is modified all versions of it must be - * set (I.e. "r", "rel" and "related"). The build in values will be reset to the default ones if the platform - * is re-set. - * @param unitStrings The unit strings. E.g. "mu", "myunit". Will be converted to lower case and trimmed. Not null. - * @param x The value for the horizontal dimension. If null the value is not changed. - * @param y The value for the vertical dimension. Might be same object as for x. If null the value is not changed. - */ - public static void setUnitValue(String[] unitStrings, UnitValue x, UnitValue y) - { - for (String unitString : unitStrings) { - String s = unitString.toLowerCase().trim(); - if (x != null) - HOR_DEFS.put(s, x); - if (y != null) - VER_DEFS.put(s, y); - } - MOD_COUNT++; - } - - /** Understands ("r", "rel", "related") OR ("u", "unrel", "unrelated") OR ("i", "ind", "indent") OR ("p", "para", "paragraph"). - */ - static int convertToPixels(float value, String unit, boolean isHor, float ref, ContainerWrapper parent, ComponentWrapper comp) - { - UnitValue uv = (isHor ? HOR_DEFS : VER_DEFS).get(unit); - return uv != null ? Math.round(value * uv.getPixels(ref, parent, comp)) : UnitConverter.UNABLE; - } - - /** Returns the order for the typical buttons in a standard button bar. It is one letter per button type. - * @return The button order. - * @see #setButtonOrder(String) - */ - public static String getButtonOrder() - { - return BUTTON_FORMAT; - } - - /** Sets the order for the typical buttons in a standard button bar. It is one letter per button type. - *

- * Letter in upper case will get the minimum button width that the {@link #getMinimumButtonWidth()} specifies - * and letters in lower case will get the width the current look&feel specifies. - *

- * Gaps will never be added to before the first component or after the last component. However, '+' (push) will be - * applied before and after as well, but with a minimum size of 0 if first/last so there will not be a gap - * before or after. - *

- * If gaps are explicitly set on buttons they will never be reduced, but they may be increased. - *

- * These are the characters that can be used: - *

    - *
  • 'L' - Buttons with this style tag will statically end up on the left end of the bar. - *
  • 'R' - Buttons with this style tag will statically end up on the right end of the bar. - *
  • 'H' - A tag for the "help" button that normally is supposed to be on the right. - *
  • 'E' - A tag for the "help2" button that normally is supposed to be on the left. - *
  • 'Y' - A tag for the "yes" button. - *
  • 'N' - A tag for the "no" button. - *
  • 'X' - A tag for the "next >" or "forward >" button. - *
  • 'B' - A tag for the "< back" or "< previous" button. - *
  • 'I' - A tag for the "finish" button. - *
  • 'A' - A tag for the "apply" button. - *
  • 'C' - A tag for the "cancel" or "close" button. - *
  • 'O' - A tag for the "ok" or "done" button. - *
  • 'U' - All Uncategorized, Other, or "Unknown" buttons. Tag will be "other". - *
  • '+' - A glue push gap that will take as much space as it can and at least an "unrelated" gap. (Platform dependent) - *
  • '_' - (underscore) An "unrelated" gap. (Platform dependent) - *
- *

- * Even though the style tags are normally applied to buttons this works with all components. - *

- * The normal style for MAC OS X is "L_HE+U+NYBXCOA_I_R", - * for Windows is "L_E+U+YNBXOCAH_I_R", and for GNOME is - * "L_HE+UNYACBXO_I_R". - * - * @param order The new button order for the current platform. - */ - public static void setButtonOrder(String order) - { - BUTTON_FORMAT = order; - MOD_COUNT++; - } - - /** Returns the tag (used in the {@link CC}) for a char. The char is same as used in {@link #getButtonOrder()}. - * @param c The char. Must be lower case! - * @return The tag that corresponds to the char or null if the char is unrecognized. - */ - static String getTagForChar(char c) - { - switch (c) { - case 'o': - return "ok"; - case 'c': - return "cancel"; - case 'h': - return "help"; - case 'e': - return "help2"; - case 'y': - return "yes"; - case 'n': - return "no"; - case 'a': - return "apply"; - case 'x': - return "next"; // a.k.a forward - case 'b': - return "back"; // a.k.a. previous - case 'i': - return "finish"; - case 'l': - return "left"; - case 'r': - return "right"; - case 'u': - return "other"; - default: - return null; - } - } - - /** Returns the platform recommended inter-cell gap in the horizontal (x) dimension.. - * @return The platform recommended inter-cell gap in the horizontal (x) dimension.. - */ - public static BoundSize getGridGapX() - { - return DEF_HGAP; - } - - /** Returns the platform recommended inter-cell gap in the vertical (x) dimension.. - * @return The platform recommended inter-cell gap in the vertical (x) dimension.. - */ - public static BoundSize getGridGapY() - { - return DEF_VGAP; - } - - /** Returns the default dialog insets depending of the current platform. - * @param side top == 0, left == 1, bottom = 2, right = 3. - * @return The insets. Never null. - */ - public static UnitValue getDialogInsets(int side) - { - return DIALOG_INS[side]; - } - - /** Sets the default insets for a dialog. Values that are null will not be changed. - * @param top The top inset. May be null. - * @param left The left inset. May be null. - * @param bottom The bottom inset. May be null. - * @param right The right inset. May be null. - */ - public static void setDialogInsets(UnitValue top, UnitValue left, UnitValue bottom, UnitValue right) - { - if (top != null) - DIALOG_INS[0] = top; - - if (left != null) - DIALOG_INS[1] = left; - - if (bottom != null) - DIALOG_INS[2] = bottom; - - if (right != null) - DIALOG_INS[3] = right; - - MOD_COUNT++; - } - - /** Returns the default panel insets depending of the current platform. - * @param side top == 0, left == 1, bottom = 2, right = 3. - * @return The insets. Never null. - */ - public static UnitValue getPanelInsets(int side) - { - return PANEL_INS[side]; - } - - /** Sets the default insets for a dialog. Values that are null will not be changed. - * @param top The top inset. May be null. - * @param left The left inset. May be null. - * @param bottom The bottom inset. May be null. - * @param right The right inset. May be null. - */ - public static void setPanelInsets(UnitValue top, UnitValue left, UnitValue bottom, UnitValue right) - { - if (top != null) - PANEL_INS[0] = top; - - if (left != null) - PANEL_INS[1] = left; - - if (bottom != null) - PANEL_INS[2] = bottom; - - if (right != null) - PANEL_INS[3] = right; - - MOD_COUNT++; - } - - /** Returns the percentage used for alignment for labels (0 is left, 50 is center and 100 is right). - * @return The percentage used for alignment for labels - */ - public static float getLabelAlignPercentage() - { - return CUR_PLAF == MAC_OSX ? 1f : 0f; - } - - /** Returns the default gap between two components that are in the same cell. - * @param comp The component that the gap is for. Never null. - * @param adjacentComp The adjacent component if any. May be null. - * @param adjacentSide What side the adjacentComp is on. {@link javax.swing.SwingUtilities#TOP} (1) or - * {@link javax.swing.SwingUtilities#LEFT} (2) or {@link javax.swing.SwingUtilities#BOTTOM} (3) or {@link javax.swing.SwingUtilities#RIGHT} (4). - * @param tag The tag string that the component might be tagged with in the component constraints. May be null. - * @param isLTR If it is left-to-right. - * @return The default gap between two components or null if there should be no gap. - */ - static BoundSize getDefaultComponentGap(ComponentWrapper comp, ComponentWrapper adjacentComp, int adjacentSide, String tag, boolean isLTR) - { - if (GAP_PROVIDER != null) - return GAP_PROVIDER.getDefaultGap(comp, adjacentComp, adjacentSide, tag, isLTR); - - if (adjacentComp == null) - return null; - -// if (adjacentComp == null || adjacentSide == SwingConstants.LEFT || adjacentSide == SwingConstants.TOP) -// return null; - -// SwingConstants.RIGHT == 4, SwingConstants.LEFT == 2 - return (adjacentSide == 2 || adjacentSide == 4) ? RELATED_X : RELATED_Y; - } - - /** Returns the current gap provider or null if none is set and "related" should always be used. - * @return The current gap provider or null if none is set and "related" should always be used. - */ - public static InCellGapProvider getGapProvider() - { - return GAP_PROVIDER; - } - - /** Sets the current gap provider or null if none is set and "related" should always be used. - * @param provider The current gap provider or null if none is set and "related" should always be used. - */ - public static void setGapProvider(InCellGapProvider provider) - { - GAP_PROVIDER = provider; - } - - /** Returns how many times the defaults has been changed. This can be used as a light weight check to - * see if layout caches needs to be refreshed. - * @return How many times the defaults has been changed. - */ - public static int getModCount() - { - return MOD_COUNT; - } - - /** Tells all layout manager instances to revalidate and recalculated everything. - */ - public void invalidate() - { - MOD_COUNT++; - } - - /** Returns the current default unit. The default unit is the unit used if no unit is set. E.g. "width 10". - * @return The current default unit. - * @see UnitValue#PIXEL - * @see UnitValue#LPX - */ - public static int getDefaultHorizontalUnit() - { - return DEF_H_UNIT; - } - - /** Sets the default unit. The default unit is the unit used if no unit is set. E.g. "width 10". - * @param unit The new default unit. - * @see UnitValue#PIXEL - * @see UnitValue#LPX - */ - public static void setDefaultHorizontalUnit(int unit) - { - if (unit < UnitValue.PIXEL || unit > UnitValue.LABEL_ALIGN) - throw new IllegalArgumentException("Illegal Unit: " + unit); - - if (DEF_H_UNIT != unit) { - DEF_H_UNIT = unit; - MOD_COUNT++; - } - } - - /** Returns the current default unit. The default unit is the unit used if no unit is set. E.g. "width 10". - * @return The current default unit. - * @see UnitValue#PIXEL - * @see UnitValue#LPY - */ - public static int getDefaultVerticalUnit() - { - return DEF_V_UNIT; - } - - /** Sets the default unit. The default unit is the unit used if no unit is set. E.g. "width 10". - * @param unit The new default unit. - * @see UnitValue#PIXEL - * @see UnitValue#LPY - */ - public static void setDefaultVerticalUnit(int unit) - { - if (unit < UnitValue.PIXEL || unit > UnitValue.LABEL_ALIGN) - throw new IllegalArgumentException("Illegal Unit: " + unit); - - if (DEF_V_UNIT != unit) { - DEF_V_UNIT = unit; - MOD_COUNT++; - } - } - - /** The default alignment for rows. Pre v3.5 this was false but now it is - * true. - * @return The current value. Default is true. - * @since 3.5 - */ - public static boolean getDefaultRowAlignmentBaseline() - { - return dra; - } - - /** The default alignment for rows. Pre v3.5 this was false but now it is - * true. - * @param b The new value. Default is true from v3.5. - * @since 3.5 - */ - public static void setDefaultRowAlignmentBaseline(boolean b) - { - dra = b; - } -} diff --git a/src2/net/miginfocom/layout/ResizeConstraint.java b/src2/net/miginfocom/layout/ResizeConstraint.java deleted file mode 100644 index d4fff62..0000000 --- a/src2/net/miginfocom/layout/ResizeConstraint.java +++ /dev/null @@ -1,94 +0,0 @@ -package net.miginfocom.layout; - -import java.io.*; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** A parsed constraint that specifies how an entity (normally column/row or component) can shrink or - * grow compared to other entities. - */ -final class ResizeConstraint implements Externalizable -{ - static final Float WEIGHT_100 = 100f; - - /** How flexible the entity should be, relative to other entities, when it comes to growing. null or - * zero mean it will never grow. An entity that has twice the growWeight compared to another entity will get twice - * as much of available space. - *

- * "grow" are only compared within the same "growPrio". - */ - Float grow = null; - - /** The relative priority used for determining which entities gets the extra space first. - */ - int growPrio = 100; - - Float shrink = WEIGHT_100; - - int shrinkPrio = 100; - - public ResizeConstraint() // For Externalizable - { - } - - ResizeConstraint(int shrinkPrio, Float shrinkWeight, int growPrio, Float growWeight) - { - this.shrinkPrio = shrinkPrio; - this.shrink = shrinkWeight; - this.growPrio = growPrio; - this.grow = growWeight; - } - - // ************************************************ - // Persistence Delegate and Serializable combined. - // ************************************************ - - private Object readResolve() throws ObjectStreamException - { - return LayoutUtil.getSerializedObject(this); - } - - @Override - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException - { - LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in)); - } - - @Override - public void writeExternal(ObjectOutput out) throws IOException - { - if (getClass() == ResizeConstraint.class) - LayoutUtil.writeAsXML(out, this); - } -} diff --git a/src2/net/miginfocom/layout/UnitConverter.java b/src2/net/miginfocom/layout/UnitConverter.java deleted file mode 100644 index 3a03ea2..0000000 --- a/src2/net/miginfocom/layout/UnitConverter.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.miginfocom.layout; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -/** - */ -public abstract class UnitConverter -{ - /** Value to return if this converter can not handle the unit sent in as an argument - * to the convert method. - */ - public static final int UNABLE = -87654312; - - /** Converts value to pixels. - * @param value The value to be converted. - * @param unit The unit of value. Never null and at least one character. - * @param refValue Some reference value that may of may not be used. If the unit is percent for instance this value - * is the value to take the percent from. Usually the size of the parent component in the appropriate dimension. - * @param isHor If the value is horizontal (true) or vertical (false). - * @param parent The parent of the target component that value is to be applied to. - * Might for instance be needed to get the screen that the component is on in a multi screen environment. - *

- * May be null in which case a "best guess" value should be returned. - * @param comp The component, if applicable, or null if none. - * @return The number of pixels if unit is handled by this converter, UnitConverter.UNABLE if not. - */ - public abstract int convertToPixels(float value, String unit, boolean isHor, float refValue, ContainerWrapper parent, ComponentWrapper comp); -} diff --git a/src2/net/miginfocom/layout/UnitValue.java b/src2/net/miginfocom/layout/UnitValue.java deleted file mode 100644 index 70d8f72..0000000 --- a/src2/net/miginfocom/layout/UnitValue.java +++ /dev/null @@ -1,691 +0,0 @@ -package net.miginfocom.layout; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -import java.beans.Encoder; -import java.beans.Expression; -import java.beans.PersistenceDelegate; -import java.io.*; -import java.util.ArrayList; -import java.util.HashMap; - -public final class UnitValue implements Serializable -{ - private static final HashMap UNIT_MAP = new HashMap(32); - - private static final ArrayList CONVERTERS = new ArrayList(); - - /** An operation indicating a static value. - */ - public static final int STATIC = 100; - - /** An operation indicating a addition of two sub units. - */ - public static final int ADD = 101; // Must have "sub-unit values" - - /** An operation indicating a subtraction of two sub units - */ - public static final int SUB = 102; // Must have "sub-unit values" - - /** An operation indicating a multiplication of two sub units. - */ - public static final int MUL = 103; // Must have "sub-unit values" - - /** An operation indicating a division of two sub units. - */ - public static final int DIV = 104; // Must have "sub-unit values" - - /** An operation indicating the minimum of two sub units - */ - public static final int MIN = 105; // Must have "sub-unit values" - - /** An operation indicating the maximum of two sub units - */ - public static final int MAX = 106; // Must have "sub-unit values" - - /** An operation indicating the middle value of two sub units - */ - public static final int MID = 107; // Must have "sub-unit values" - - - - - /** A unit indicating pixels. - */ - public static final int PIXEL = 0; - - /** A unit indicating logical horizontal pixels. - */ - public static final int LPX = 1; - - /** A unit indicating logical vertical pixels. - */ - public static final int LPY = 2; - - /** A unit indicating millimeters. - */ - public static final int MM = 3; - - /** A unit indicating centimeters. - */ - public static final int CM = 4; - - /** A unit indicating inches. - */ - public static final int INCH = 5; - - /** A unit indicating percent. - */ - public static final int PERCENT = 6; - - /** A unit indicating points. - */ - public static final int PT = 7; - - /** A unit indicating screen percentage width. - */ - public static final int SPX = 8; - - /** A unit indicating screen percentage height. - */ - public static final int SPY = 9; - - /** A unit indicating alignment. - */ - public static final int ALIGN = 12; - - /** A unit indicating minimum size. - */ - public static final int MIN_SIZE = 13; - - /** A unit indicating preferred size. - */ - public static final int PREF_SIZE = 14; - - /** A unit indicating maximum size. - */ - public static final int MAX_SIZE = 15; - - /** A unit indicating button size. - */ - public static final int BUTTON = 16; - - /** A unit indicating linking to x. - */ - public static final int LINK_X = 18; // First link - - /** A unit indicating linking to y. - */ - public static final int LINK_Y = 19; - - /** A unit indicating linking to width. - */ - public static final int LINK_W = 20; - - /** A unit indicating linking to height. - */ - public static final int LINK_H = 21; - - /** A unit indicating linking to x2. - */ - public static final int LINK_X2 = 22; - - /** A unit indicating linking to y2. - */ - public static final int LINK_Y2 = 23; - - /** A unit indicating linking to x position on screen. - */ - public static final int LINK_XPOS = 24; - - /** A unit indicating linking to y position on screen. - */ - public static final int LINK_YPOS = 25; // Last link - - /** A unit indicating a lookup. - */ - public static final int LOOKUP = 26; - - /** A unit indicating label alignment. - */ - public static final int LABEL_ALIGN = 27; - - private static final int IDENTITY = -1; - - static { - UNIT_MAP.put("px", PIXEL); - UNIT_MAP.put("lpx", LPX); - UNIT_MAP.put("lpy", LPY); - UNIT_MAP.put("%", PERCENT); - UNIT_MAP.put("cm", CM); - UNIT_MAP.put("in", INCH); - UNIT_MAP.put("spx", SPX); - UNIT_MAP.put("spy", SPY); - UNIT_MAP.put("al", ALIGN); - UNIT_MAP.put("mm", MM); - UNIT_MAP.put("pt", PT); - UNIT_MAP.put("min", MIN_SIZE); - UNIT_MAP.put("minimum", MIN_SIZE); - UNIT_MAP.put("p", PREF_SIZE); - UNIT_MAP.put("pref", PREF_SIZE); - UNIT_MAP.put("max", MAX_SIZE); - UNIT_MAP.put("maximum", MAX_SIZE); - UNIT_MAP.put("button", BUTTON); - UNIT_MAP.put("label", LABEL_ALIGN); - } - - static final UnitValue ZERO = new UnitValue(0, null, PIXEL, true, STATIC, null, null, "0px"); - static final UnitValue TOP = new UnitValue(0, null, PERCENT, false, STATIC, null, null, "top"); - static final UnitValue LEADING = new UnitValue(0, null, PERCENT, true, STATIC, null, null, "leading"); - static final UnitValue LEFT = new UnitValue(0, null, PERCENT, true, STATIC, null, null, "left"); - static final UnitValue CENTER = new UnitValue(50, null, PERCENT, true, STATIC, null, null, "center"); - static final UnitValue TRAILING = new UnitValue(100, null, PERCENT, true, STATIC, null, null, "trailing"); - static final UnitValue RIGHT = new UnitValue(100, null, PERCENT, true, STATIC, null, null, "right"); - static final UnitValue BOTTOM = new UnitValue(100, null, PERCENT, false, STATIC, null, null, "bottom"); - static final UnitValue LABEL = new UnitValue(0, null, LABEL_ALIGN, false, STATIC, null, null, "label"); - - static final UnitValue INF = new UnitValue(LayoutUtil.INF, null, PIXEL, true, STATIC, null, null, "inf"); - - static final UnitValue BASELINE_IDENTITY = new UnitValue(0, null, IDENTITY, false, STATIC, null, null, "baseline"); - - private final transient float value; - private final transient int unit; - private final transient int oper; - private final transient String unitStr; - private transient String linkId = null; // Should be final, but initializes in a sub method. - private final transient boolean isHor; - private final transient UnitValue[] subUnits; - - // Pixel - public UnitValue(float value) // If hor/ver does not matter. - { - this(value, null, PIXEL, true, STATIC, null, null, value + "px"); - } - - public UnitValue(float value, int unit, String createString) // If hor/ver does not matter. - { - this(value, null, unit, true, STATIC, null, null, createString); - } - - public UnitValue(float value, String unitStr, boolean isHor, int oper, String createString) - { - this(value, unitStr, -1, isHor, oper, null, null, createString); - } - - UnitValue(boolean isHor, int oper, UnitValue sub1, UnitValue sub2, String createString) - { - this(0, "", -1, isHor, oper, sub1, sub2, createString); - if (sub1 == null || sub2 == null) - throw new IllegalArgumentException("Sub units is null!"); - } - - private UnitValue(float value, String unitStr, int unit, boolean isHor, int oper, UnitValue sub1, UnitValue sub2, String createString) - { - if (oper < STATIC || oper > MID) - throw new IllegalArgumentException("Unknown Operation: " + oper); - - if (oper >= ADD && oper <= MID && (sub1 == null || sub2 == null)) - throw new IllegalArgumentException(oper + " Operation may not have null sub-UnitValues."); - - this.value = value; - this.oper = oper; - this.isHor = isHor; - this.unitStr = unitStr; - this.unit = unitStr != null ? parseUnitString() : unit; - this.subUnits = sub1 != null && sub2 != null ? new UnitValue[] {sub1, sub2} : null; - - LayoutUtil.putCCString(this, createString); // "this" escapes!! Safe though. - } - - /** Returns the size in pixels rounded. - * @param refValue The reference value. Normally the size of the parent. For unit {@link #ALIGN} the current size of the component should be sent in. - * @param parent The parent. May be null for testing the validity of the value, but should normally not and are not - * required to return any usable value if null. - * @param comp The component, if any, that the value is for. Might be null if the value is not - * connected to any component. - * @return The size in pixels. - */ - public final int getPixels(float refValue, ContainerWrapper parent, ComponentWrapper comp) - { - return Math.round(getPixelsExact(refValue, parent, comp)); - } - - private static final float[] SCALE = new float[] {25.4f, 2.54f, 1f, 0f, 72f}; - /** Returns the size in pixels. - * @param refValue The reference value. Normally the size of the parent. For unit {@link #ALIGN} the current size of the component should be sent in. - * @param parent The parent. May be null for testing the validity of the value, but should normally not and are not - * required to return any usable value if null. - * @param comp The component, if any, that the value is for. Might be null if the value is not - * connected to any component. - * @return The size in pixels. - */ - public final float getPixelsExact(float refValue, ContainerWrapper parent, ComponentWrapper comp) - { - if (parent == null) - return 1; - - if (oper == STATIC) { - switch (unit) { - case PIXEL: - return value; - - case LPX: - case LPY: - return parent.getPixelUnitFactor(unit == LPX) * value; - - case MM: - case CM: - case INCH: - case PT: - float f = SCALE[unit - MM]; - Float s = isHor ? PlatformDefaults.getHorizontalScaleFactor() : PlatformDefaults.getVerticalScaleFactor(); - if (s != null) - f *= s; - - return (isHor ? parent.getHorizontalScreenDPI() : parent.getVerticalScreenDPI()) * value / f; - - case PERCENT: - return value * refValue * 0.01f; - - case SPX: - case SPY: - return (unit == SPX ? parent.getScreenWidth() : parent.getScreenHeight()) * value * 0.01f; - - case ALIGN: - Integer st = LinkHandler.getValue(parent.getLayout(), "visual", isHor ? LinkHandler.X : LinkHandler.Y); - Integer sz = LinkHandler.getValue(parent.getLayout(), "visual", isHor ? LinkHandler.WIDTH : LinkHandler.HEIGHT); - if (st == null || sz == null) - return 0; - return value * (Math.max(0, sz.intValue()) - refValue) + st; - - case MIN_SIZE: - if (comp == null) - return 0; - return isHor ? comp.getMinimumWidth(comp.getHeight()) : comp.getMinimumHeight(comp.getWidth()); - - case PREF_SIZE: - if (comp == null) - return 0; - return isHor ? comp.getPreferredWidth(comp.getHeight()) : comp.getPreferredHeight(comp.getWidth()); - - case MAX_SIZE: - if (comp == null) - return 0; - return isHor ? comp.getMaximumWidth(comp.getHeight()) : comp.getMaximumHeight(comp.getWidth()); - - case BUTTON: - return PlatformDefaults.getMinimumButtonWidthIncludingPadding(refValue, parent, comp); - - case LINK_X: - case LINK_Y: - case LINK_W: - case LINK_H: - case LINK_X2: - case LINK_Y2: - case LINK_XPOS: - case LINK_YPOS: - Integer v = LinkHandler.getValue(parent.getLayout(), getLinkTargetId(), unit - (unit >= LINK_XPOS ? LINK_XPOS : LINK_X)); - if (v == null) - return 0; - - if (unit == LINK_XPOS) - return parent.getScreenLocationX() + v; - if (unit == LINK_YPOS) - return parent.getScreenLocationY() + v; - - return v; - - case LOOKUP: - float res = lookup(refValue, parent, comp); - if (res != UnitConverter.UNABLE) - return res; - - case LABEL_ALIGN: - return PlatformDefaults.getLabelAlignPercentage() * refValue; - - case IDENTITY: - } - throw new IllegalArgumentException("Unknown/illegal unit: " + unit + ", unitStr: " + unitStr); - } - - if (subUnits != null && subUnits.length == 2) { - float r1 = subUnits[0].getPixelsExact(refValue, parent, comp); - float r2 = subUnits[1].getPixelsExact(refValue, parent, comp); - switch (oper) { - case ADD: - return r1 + r2; - case SUB: - return r1 - r2; - case MUL: - return r1 * r2; - case DIV: - return r1 / r2; - case MIN: - return r1 < r2 ? r1 : r2; - case MAX: - return r1 > r2 ? r1 : r2; - case MID: - return (r1 + r2) * 0.5f; - } - } - - throw new IllegalArgumentException("Internal: Unknown Oper: " + oper); - } - - private float lookup(float refValue, ContainerWrapper parent, ComponentWrapper comp) - { - float res = UnitConverter.UNABLE; - for (int i = CONVERTERS.size() - 1; i >= 0; i--) { - res = CONVERTERS.get(i).convertToPixels(value, unitStr, isHor, refValue, parent, comp); - if (res != UnitConverter.UNABLE) - return res; - } - return PlatformDefaults.convertToPixels(value, unitStr, isHor, refValue, parent, comp); - } - - private int parseUnitString() - { - int len = unitStr.length(); - if (len == 0) - return isHor ? PlatformDefaults.getDefaultHorizontalUnit() : PlatformDefaults.getDefaultVerticalUnit(); - - Integer u = UNIT_MAP.get(unitStr); - if (u != null) { - if (!isHor && (u == BUTTON || u == LABEL_ALIGN)) - throw new IllegalArgumentException("Not valid in vertical contexts: '" + unitStr + "'"); - - return u; - } - - if (unitStr.equals("lp")) - return isHor ? LPX : LPY; - - if (unitStr.equals("sp")) - return isHor ? SPX : SPY; - - if (lookup(0, null, null) != UnitConverter.UNABLE) // To test so we can fail fast - return LOOKUP; - - // Only link left. E.g. "otherID.width" - - int pIx = unitStr.indexOf('.'); - if (pIx != -1) { - linkId = unitStr.substring(0, pIx); - String e = unitStr.substring(pIx + 1); - - if (e.equals("x")) - return LINK_X; - if (e.equals("y")) - return LINK_Y; - if (e.equals("w") || e.equals("width")) - return LINK_W; - if (e.equals("h") || e.equals("height")) - return LINK_H; - if (e.equals("x2")) - return LINK_X2; - if (e.equals("y2")) - return LINK_Y2; - if (e.equals("xpos")) - return LINK_XPOS; - if (e.equals("ypos")) - return LINK_YPOS; - } - - throw new IllegalArgumentException("Unknown keyword: " + unitStr); - } - - final boolean isAbsolute() - { - switch (unit) { - case PIXEL: - case LPX: - case LPY: - case MM: - case CM: - case INCH: - case PT: - return true; - - case SPX: - case SPY: - case PERCENT: - case ALIGN: - case MIN_SIZE: - case PREF_SIZE: - case MAX_SIZE: - case BUTTON: - case LINK_X: - case LINK_Y: - case LINK_W: - case LINK_H: - case LINK_X2: - case LINK_Y2: - case LINK_XPOS: - case LINK_YPOS: - case LOOKUP: - case LABEL_ALIGN: - return false; - - case IDENTITY: - } - throw new IllegalArgumentException("Unknown/illegal unit: " + unit + ", unitStr: " + unitStr); - } - - final boolean isAbsoluteDeep() - { - if (subUnits != null) { - for (UnitValue subUnit : subUnits) { - if (subUnit.isAbsoluteDeep()) - return true; - } - } - return isAbsolute(); - } - - final boolean isLinked() - { - return linkId != null; - } - - final boolean isLinkedDeep() - { - if (subUnits != null) { - for (UnitValue subUnit : subUnits) { - if (subUnit.isLinkedDeep()) - return true; - } - } - return isLinked(); - } - - final String getLinkTargetId() - { - return linkId; - } - - final UnitValue getSubUnitValue(int i) - { - return subUnits[i]; - } - - final int getSubUnitCount() - { - return subUnits != null ? subUnits.length : 0; - } - - public final UnitValue[] getSubUnits() - { - return subUnits != null ? subUnits.clone() : null; - } - - public final int getUnit() - { - return unit; - } - - public final String getUnitString() - { - return unitStr; - } - - public final int getOperation() - { - return oper; - } - - public final float getValue() - { - return value; - } - - public final boolean isHorizontal() - { - return isHor; - } - - @Override - final public String toString() - { - return getClass().getName() + ". Value=" + value + ", unit=" + unit + ", unitString: " + unitStr + ", oper=" + oper + ", isHor: " + isHor; - } - - /** Returns the creation string for this object. Note that {@link LayoutUtil#setDesignTime(ContainerWrapper, boolean)} must be - * set to true for the creation strings to be stored. - * @return The constraint string or null if none is registered. - */ - public final String getConstraintString() - { - return LayoutUtil.getCCString(this); - } - - @Override - public final int hashCode() - { - return (int) (value * 12345) + (oper >>> 5) + unit >>> 17; - } - - /** Adds a global unit converter that can convert from some unit to pixels. - *

- * This converter will be asked before the platform converter so the values for it (e.g. "related" and "unrelated") - * can be overridden. It is however not possible to override the built in ones (e.g. "mm", "pixel" or "lp"). - * @param conv The converter. Not null. - */ - public synchronized static void addGlobalUnitConverter(UnitConverter conv) - { - if (conv == null) - throw new NullPointerException(); - CONVERTERS.add(conv); - } - - /** Removed the converter. - * @param unit The converter. - * @return If there was a converter found and thus removed. - */ - public synchronized static boolean removeGlobalUnitConverter(UnitConverter unit) - { - return CONVERTERS.remove(unit); - } - - /** Returns the global converters currently registered. The platform converter will not be in this list. - * @return The converters. Never null. - */ - public synchronized static UnitConverter[] getGlobalUnitConverters() - { - return CONVERTERS.toArray(new UnitConverter[CONVERTERS.size()]); - } - - /** Returns the current default unit. The default unit is the unit used if no unit is set. E.g. "width 10". - * @return The current default unit. - * @see #PIXEL - * @see #LPX - * @deprecated Use {@link PlatformDefaults#getDefaultHorizontalUnit()} and {@link PlatformDefaults#getDefaultVerticalUnit()} instead. - */ - public static int getDefaultUnit() - { - return PlatformDefaults.getDefaultHorizontalUnit(); - } - - /** Sets the default unit. The default unit is the unit used if no unit is set. E.g. "width 10". - * @param unit The new default unit. - * @see #PIXEL - * @see #LPX - * @deprecated Use {@link PlatformDefaults#setDefaultHorizontalUnit(int)} and {@link PlatformDefaults#setDefaultVerticalUnit(int)} instead. - */ - public static void setDefaultUnit(int unit) - { - PlatformDefaults.setDefaultHorizontalUnit(unit); - PlatformDefaults.setDefaultVerticalUnit(unit); - } - - static { - if(LayoutUtil.HAS_BEANS){ - LayoutUtil.setDelegate(UnitValue.class, new PersistenceDelegate() { - @Override - protected Expression instantiate(Object oldInstance, Encoder out) - { - UnitValue uv = (UnitValue) oldInstance; - String cs = uv.getConstraintString(); - if (cs == null) - throw new IllegalStateException("Design time must be on to use XML persistence. See LayoutUtil."); - - return new Expression(oldInstance, ConstraintParser.class, "parseUnitValueOrAlign", new Object[] { - uv.getConstraintString(), (uv.isHorizontal() ? Boolean.TRUE : Boolean.FALSE), null - }); - } - }); - } - } - - // ************************************************ - // Persistence Delegate and Serializable combined. - // ************************************************ - - private static final long serialVersionUID = 1L; - - private Object readResolve() throws ObjectStreamException - { - return LayoutUtil.getSerializedObject(this); - } - - private void writeObject(ObjectOutputStream out) throws IOException - { - if (getClass() == UnitValue.class) - LayoutUtil.writeAsXML(out, this); - } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException - { - LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in)); - } -} diff --git a/src2/net/miginfocom/swing/MigLayout.java b/src2/net/miginfocom/swing/MigLayout.java deleted file mode 100644 index fdd7718..0000000 --- a/src2/net/miginfocom/swing/MigLayout.java +++ /dev/null @@ -1,786 +0,0 @@ -package net.miginfocom.swing; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -import net.miginfocom.layout.*; - -import javax.swing.*; -import javax.swing.Timer; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.util.*; - -/** A very flexible layout manager. - *

- * Read the documentation that came with this layout manager for information on usage. - */ -public class MigLayout implements LayoutManager2, Externalizable -{ - // ******** Instance part ******** - - /** The component to string constraints mappings. - */ - private final Map scrConstrMap = new IdentityHashMap(8); - - /** Hold the serializable text representation of the constraints. - */ - private Object layoutConstraints = "", colConstraints = "", rowConstraints = ""; // Should never be null! - - // ******** Transient part ******** - - private transient ContainerWrapper cacheParentW = null; - - private transient final Map ccMap = new HashMap(8); - private transient javax.swing.Timer debugTimer = null; - - private transient LC lc = null; - private transient AC colSpecs = null, rowSpecs = null; - private transient Grid grid = null; - private transient int lastModCount = PlatformDefaults.getModCount(); - private transient int lastHash = -1; - private transient Dimension lastInvalidSize = null; - private transient boolean lastWasInvalid = false; // Added in 3.7.1. May have regressions - private transient Dimension lastParentSize = null; - - private transient ArrayList callbackList = null; - - private transient boolean dirty = true; - - /** Constructor with no constraints. - */ - public MigLayout() - { - this("", "", ""); - } - - /** Constructor. - * @param layoutConstraints The constraints that concern the whole layout. null will be treated as "". - */ - public MigLayout(String layoutConstraints) - { - this(layoutConstraints, "", ""); - } - - /** Constructor. - * @param layoutConstraints The constraints that concern the whole layout. null will be treated as "". - * @param colConstraints The constraints for the columns in the grid. null will be treated as "". - */ - public MigLayout(String layoutConstraints, String colConstraints) - { - this(layoutConstraints, colConstraints, ""); - } - - /** Constructor. - * @param layoutConstraints The constraints that concern the whole layout. null will be treated as "". - * @param colConstraints The constraints for the columns in the grid. null will be treated as "". - * @param rowConstraints The constraints for the rows in the grid. null will be treated as "". - */ - public MigLayout(String layoutConstraints, String colConstraints, String rowConstraints) - { - setLayoutConstraints(layoutConstraints); - setColumnConstraints(colConstraints); - setRowConstraints(rowConstraints); - } - - /** Constructor. - * @param layoutConstraints The constraints that concern the whole layout. null will be treated as an empty constraint. - */ - public MigLayout(LC layoutConstraints) - { - this(layoutConstraints, null, null); - } - - /** Constructor. - * @param layoutConstraints The constraints that concern the whole layout. null will be treated as an empty constraint. - * @param colConstraints The constraints for the columns in the grid. null will be treated as an empty constraint. - */ - public MigLayout(LC layoutConstraints, AC colConstraints) - { - this(layoutConstraints, colConstraints, null); - } - - /** Constructor. - * @param layoutConstraints The constraints that concern the whole layout. null will be treated as an empty constraint. - * @param colConstraints The constraints for the columns in the grid. null will be treated as an empty constraint. - * @param rowConstraints The constraints for the rows in the grid. null will be treated as an empty constraint. - */ - public MigLayout(LC layoutConstraints, AC colConstraints, AC rowConstraints) - { - setLayoutConstraints(layoutConstraints); - setColumnConstraints(colConstraints); - setRowConstraints(rowConstraints); - } - - /** Returns layout constraints either as a String or {@link net.miginfocom.layout.LC} depending what was sent in - * to the constructor or set with {@link #setLayoutConstraints(Object)}. - * @return The layout constraints either as a String or {@link net.miginfocom.layout.LC} depending what was sent in - * to the constructor or set with {@link #setLayoutConstraints(Object)}. Never null. - */ - public Object getLayoutConstraints() - { - return layoutConstraints; - } - - /** Sets the layout constraints for the layout manager instance as a String. - *

- * See the class JavaDocs for information on how this string is formatted. - * @param constr The layout constraints as a String or {@link net.miginfocom.layout.LC} representation. null is converted to "" for storage. - * @throws RuntimeException if the constraint was not valid. - */ - public void setLayoutConstraints(Object constr) - { - if (constr == null || constr instanceof String) { - constr = ConstraintParser.prepare((String) constr); - lc = ConstraintParser.parseLayoutConstraint((String) constr); - } else if (constr instanceof LC) { - lc = (LC) constr; - } else { - throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString()); - } - layoutConstraints = constr; - dirty = true; - } - - /** Returns the column layout constraints either as a String or {@link net.miginfocom.layout.AC}. - * @return The column constraints either as a String or {@link net.miginfocom.layout.AC} depending what was sent in - * to the constructor or set with {@link #setColumnConstraints(Object)}. Never null. - */ - public Object getColumnConstraints() - { - return colConstraints; - } - - /** Sets the column layout constraints for the layout manager instance as a String. - *

- * See the class JavaDocs for information on how this string is formatted. - * @param constr The column layout constraints as a String or {@link net.miginfocom.layout.AC} representation. null is converted to "" for storage. - * @throws RuntimeException if the constraint was not valid. - */ - public void setColumnConstraints(Object constr) - { - if (constr == null || constr instanceof String) { - constr = ConstraintParser.prepare((String) constr); - colSpecs = ConstraintParser.parseColumnConstraints((String) constr); - } else if (constr instanceof AC) { - colSpecs = (AC) constr; - } else { - throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString()); - } - colConstraints = constr; - dirty = true; - } - - /** Returns the row layout constraints either as a String or {@link net.miginfocom.layout.AC}. - * @return The row constraints either as a String or {@link net.miginfocom.layout.AC} depending what was sent in - * to the constructor or set with {@link #setRowConstraints(Object)}. Never null. - */ - public Object getRowConstraints() - { - return rowConstraints; - } - - /** Sets the row layout constraints for the layout manager instance as a String. - *

- * See the class JavaDocs for information on how this string is formatted. - * @param constr The row layout constraints as a String or {@link net.miginfocom.layout.AC} representation. null is converted to "" for storage. - * @throws RuntimeException if the constraint was not valid. - */ - public void setRowConstraints(Object constr) - { - if (constr == null || constr instanceof String) { - constr = ConstraintParser.prepare((String) constr); - rowSpecs = ConstraintParser.parseRowConstraints((String) constr); - } else if (constr instanceof AC) { - rowSpecs = (AC) constr; - } else { - throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString()); - } - rowConstraints = constr; - dirty = true; - } - - /** Returns a shallow copy of the constraints map. - * @return A shallow copy of the constraints map. Never null. - */ - public Map getConstraintMap() - { - return new IdentityHashMap(scrConstrMap); - } - - /** Sets the constraints map. - * @param map The map. Will be copied. - */ - public void setConstraintMap(Map map) - { - scrConstrMap.clear(); - ccMap.clear(); - for (Map.Entry e : map.entrySet()) - setComponentConstraintsImpl(e.getKey(), e.getValue(), true); - } - - /** Returns the component constraints as a String representation. This string is the exact string as set with {@link #setComponentConstraints(java.awt.Component, Object)} - * or set when adding the component to the parent component. - *

- * See the class JavaDocs for information on how this string is formatted. - * @param comp The component to return the constraints for. - * @return The component constraints as a String representation or null if the component is not registered - * with this layout manager. The returned values is either a String or a {@link net.miginfocom.layout.CC} - * depending on what constraint was sent in when the component was added. May be null. - */ - public Object getComponentConstraints(Component comp) - { - synchronized(comp.getParent().getTreeLock()) { - return scrConstrMap.get(comp); - } - } - - /** Sets the component constraint for the component that already must be handled by this layout manager. - *

- * See the class JavaDocs for information on how this string is formatted. - * @param constr The component constraints as a String or {@link net.miginfocom.layout.CC}. null is ok. - * @param comp The component to set the constraints for. - * @throws RuntimeException if the constraint was not valid. - * @throws IllegalArgumentException If the component is not handling the component. - */ - public void setComponentConstraints(Component comp, Object constr) - { - setComponentConstraintsImpl(comp, constr, false); - } - - /** Sets the component constraint for the component that already must be handled by this layout manager. - *

- * See the class JavaDocs for information on how this string is formatted. - * @param constr The component constraints as a String or {@link net.miginfocom.layout.CC}. null is ok. - * @param comp The component to set the constraints for. - * @param noCheck Does not check if the component is handled if true - * @throws RuntimeException if the constraint was not valid. - * @throws IllegalArgumentException If the component is not handling the component. - */ - private void setComponentConstraintsImpl(Component comp, Object constr, boolean noCheck) - { - Container parent = comp.getParent(); - synchronized(parent != null ? parent.getTreeLock() : new Object()) { // 3.7.2. No sync if not added to a hierarchy. Defeats a NPE. - if (noCheck == false && scrConstrMap.containsKey(comp) == false) - throw new IllegalArgumentException("Component must already be added to parent!"); - - ComponentWrapper cw = new SwingComponentWrapper(comp); - - if (constr == null || constr instanceof String) { - String cStr = ConstraintParser.prepare((String) constr); - - scrConstrMap.put(comp, constr); - ccMap.put(cw, ConstraintParser.parseComponentConstraint(cStr)); - - } else if (constr instanceof CC) { - - scrConstrMap.put(comp, constr); - ccMap.put(cw, (CC) constr); - - } else { - throw new IllegalArgumentException("Constraint must be String or ComponentConstraint: " + constr.getClass().toString()); - } - - dirty = true; - } - } - - /** Returns if this layout manager is currently managing this component. - * @param c The component to check. If null then false will be returned. - * @return If this layout manager is currently managing this component. - */ - public boolean isManagingComponent(Component c) - { - return scrConstrMap.containsKey(c); - } - - /** Adds the callback function that will be called at different stages of the layout cycle. - * @param callback The callback. Not null. - */ - public void addLayoutCallback(LayoutCallback callback) - { - if (callback == null) - throw new NullPointerException(); - - if (callbackList == null) - callbackList = new ArrayList(1); - - callbackList.add(callback); - - grid = null; - } - - /** Removes the callback if it exists. - * @param callback The callback. May be null. - */ - public void removeLayoutCallback(LayoutCallback callback) - { - if (callbackList != null) - callbackList.remove(callback); - } - - /** Sets the debugging state for this layout manager instance. If debug is turned on a timer will repaint the last laid out parent - * with debug information on top. - *

- * Red fill and dashed red outline is used to indicate occupied cells in the grid. Blue dashed outline indicate - * component bounds set. - *

- * Note that debug can also be set on the layout constraints. There it will be persisted. The value set here will not. See the class - * JavaDocs for information. - * @param parentW The parent to set debug for. - * @param b true means debug is turned on. - */ - private void setDebug(final ComponentWrapper parentW, boolean b) - { - if (b && (debugTimer == null || debugTimer.getDelay() != getDebugMillis())) { - if (debugTimer != null) - debugTimer.stop(); - - ContainerWrapper pCW = parentW.getParent(); - final Component parent = pCW != null ? (Component) pCW.getComponent() : null; - - debugTimer = new Timer(getDebugMillis(), new MyDebugRepaintListener()); - - if (parent != null) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - Container p = parent.getParent(); - if (p != null) { - if (p instanceof JComponent) { - ((JComponent) p).revalidate(); - } else { - parent.invalidate(); - p.validate(); - } - } - } - }); - } - - debugTimer.setInitialDelay(100); - debugTimer.start(); - - } else if (!b && debugTimer != null) { - debugTimer.stop(); - debugTimer = null; - } - } - - /** Returns the current debugging state. - * @return The current debugging state. - */ - private boolean getDebug() - { - return debugTimer != null; - } - - /** Returns the debug millis. Combines the value from {@link net.miginfocom.layout.LC#getDebugMillis()} and {@link net.miginfocom.layout.LayoutUtil#getGlobalDebugMillis()} - * @return The combined value. - */ - private int getDebugMillis() - { - int globalDebugMillis = LayoutUtil.getGlobalDebugMillis(); - return globalDebugMillis > 0 ? globalDebugMillis : lc.getDebugMillis(); - } - - /** Check if something has changed and if so recreate it to the cached objects. - * @param parent The parent that is the target for this layout manager. - */ - private void checkCache(Container parent) - { - if (parent == null) - return; - - if (dirty) - grid = null; - - cleanConstraintMaps(parent); - - // Check if the grid is valid - int mc = PlatformDefaults.getModCount(); - if (lastModCount != mc) { - grid = null; - lastModCount = mc; - } - - if (!parent.isValid()) { - if (!lastWasInvalid) { - lastWasInvalid = true; - - int hash = 0; - boolean resetLastInvalidOnParent = false; // Added in 3.7.3 to resolve a timing regression introduced in 3.7.1 - for (ComponentWrapper wrapper : ccMap.keySet()) { - Object component = wrapper.getComponent(); - if (component instanceof JTextArea || component instanceof JEditorPane) - resetLastInvalidOnParent = true; - - hash ^= wrapper.getLayoutHashCode(); - hash += 285134905; - } - if (resetLastInvalidOnParent) - resetLastInvalidOnParent(parent); - - if (hash != lastHash) { - grid = null; - lastHash = hash; - } - - Dimension ps = parent.getSize(); - if (lastInvalidSize == null || !lastInvalidSize.equals(ps)) { - grid = null; - lastInvalidSize = ps; - } - } - } else { - lastWasInvalid = false; - } - - ContainerWrapper par = checkParent(parent); - - setDebug(par, getDebugMillis() > 0); - - if (grid == null) - grid = new Grid(par, lc, rowSpecs, colSpecs, ccMap, callbackList); - - dirty = false; - } - - /** Checks so all components in ccMap actually exist in the parent's collection. Removes - * any references that don't. - * @param parent The parent to compare ccMap against. Never null. - */ - private void cleanConstraintMaps(Container parent) - { - HashSet parentCompSet = new HashSet(Arrays.asList(parent.getComponents())); - - Iterator> it = ccMap.entrySet().iterator(); - while(it.hasNext()) { - Component c = (Component) it.next().getKey().getComponent(); - if (parentCompSet.contains(c) == false) { - it.remove(); - scrConstrMap.remove(c); - } - } - } - - /** - * @since 3.7.3 - */ - private void resetLastInvalidOnParent(Container parent) - { - while (parent != null) { - LayoutManager layoutManager = parent.getLayout(); - if (layoutManager instanceof MigLayout) { - ((MigLayout) layoutManager).lastWasInvalid = false; - } - parent = parent.getParent(); - } - } - - private ContainerWrapper checkParent(Container parent) - { - if (parent == null) - return null; - - if (cacheParentW == null || cacheParentW.getComponent() != parent) - cacheParentW = new SwingContainerWrapper(parent); - - return cacheParentW; - } - - private long lastSize = 0; - - @Override - public void layoutContainer(final Container parent) - { - synchronized(parent.getTreeLock()) { - checkCache(parent); - - Insets i = parent.getInsets(); - int[] b = new int[] { - i.left, - i.top, - parent.getWidth() - i.left - i.right, - parent.getHeight() - i.top - i.bottom - }; - - if (grid.layout(b, lc.getAlignX(), lc.getAlignY(), getDebug())) { - grid = null; - checkCache(parent); - grid.layout(b, lc.getAlignX(), lc.getAlignY(), getDebug()); - } - - long newSize = grid.getHeight()[1] + (((long) grid.getWidth()[1]) << 32); - if (lastSize != newSize) { - lastSize = newSize; - final ContainerWrapper containerWrapper = checkParent(parent); - Window win = ((Window) SwingUtilities.getAncestorOfClass(Window.class, (Component)containerWrapper.getComponent())); - if (win != null) { - if (win.isVisible()) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - adjustWindowSize(containerWrapper); - } - }); - } else { - adjustWindowSize(containerWrapper); - } - } - } - lastInvalidSize = null; - } - } - - /** Checks the parent window/popup if its size is within parameters as set by the LC. - * @param parent The parent who's window to possibly adjust the size for. - */ - private void adjustWindowSize(ContainerWrapper parent) - { - BoundSize wBounds = lc.getPackWidth(); - BoundSize hBounds = lc.getPackHeight(); - - if (wBounds == BoundSize.NULL_SIZE && hBounds == BoundSize.NULL_SIZE) - return; - - Container packable = getPackable((Component) parent.getComponent()); - - if (packable != null) { - - Component pc = (Component) parent.getComponent(); - - Container c = pc instanceof Container ? (Container) pc : pc.getParent(); - for (; c != null; c = c.getParent()) { - LayoutManager layout = c.getLayout(); - if (layout instanceof BoxLayout || layout instanceof OverlayLayout) - ((LayoutManager2) layout).invalidateLayout(c); - } - - Dimension prefSize = packable.getPreferredSize(); - int targW = constrain(checkParent(packable), packable.getWidth(), prefSize.width, wBounds); - int targH = constrain(checkParent(packable), packable.getHeight(), prefSize.height, hBounds); - - Point p = packable.isShowing() ? packable.getLocationOnScreen() : packable.getLocation(); - - int x = Math.round(p.x - ((targW - packable.getWidth()) * (1 - lc.getPackWidthAlign()))); - int y = Math.round(p.y - ((targH - packable.getHeight()) * (1 - lc.getPackHeightAlign()))); - - if (packable instanceof JPopupMenu) { - JPopupMenu popupMenu = (JPopupMenu) packable; - popupMenu.setVisible(false); - popupMenu.setPopupSize(targW, targH); - Component invoker = popupMenu.getInvoker(); - Point popPoint = new Point(x, y); - SwingUtilities.convertPointFromScreen(popPoint, invoker); - ((JPopupMenu) packable).show(invoker, popPoint.x, popPoint.y); - - packable.setPreferredSize(null); // Reset preferred size so we don't read it again. - - } else { - packable.setBounds(x, y, targW, targH); - } - } - } - - /** Returns a high level window or popup to pack, if any. - * @return May be null. - */ - private Container getPackable(Component comp) - { - JPopupMenu popup = findType(JPopupMenu.class, comp); - if (popup != null) { // Lightweight/HeavyWeight popup must be handled separately - Container popupComp = popup; - while (popupComp != null) { - if (popupComp.getClass().getName().contains("HeavyWeightWindow")) - return popupComp; // Return the heavy weight window for normal processing - popupComp = popupComp.getParent(); - } - return popup; // Return the JPopup. - } - - return findType(Window.class, comp); - } - - public static E findType(Class clazz, Component comp) - { - while (comp != null && !clazz.isInstance(comp)) - comp = comp.getParent(); - - return (E) comp; - } - - - private int constrain(ContainerWrapper parent, int winSize, int prefSize, BoundSize constrain) - { - if (constrain == null) - return winSize; - - int retSize = winSize; - UnitValue wUV = constrain.getPreferred(); - if (wUV != null) - retSize = wUV.getPixels(prefSize, parent, parent); - - retSize = constrain.constrain(retSize, prefSize, parent); - - return constrain.getGapPush() ? Math.max(winSize, retSize) : retSize; - } - - @Override - public Dimension minimumLayoutSize(Container parent) - { - synchronized(parent.getTreeLock()) { - return getSizeImpl(parent, LayoutUtil.MIN); - } - } - - @Override - public Dimension preferredLayoutSize(Container parent) - { - synchronized(parent.getTreeLock()) { - if (lastParentSize == null || !parent.getSize().equals(lastParentSize)) { - for (ComponentWrapper wrapper : ccMap.keySet()) { - if (wrapper.getContentBias() != -1) { - layoutContainer(parent); - break; - } - } - } - - lastParentSize = parent.getSize(); - return getSizeImpl(parent, LayoutUtil.PREF); - } - } - - @Override - public Dimension maximumLayoutSize(Container parent) - { - return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); - } - - // Implementation method that does the job. - private Dimension getSizeImpl(Container parent, int sizeType) - { - checkCache(parent); - - Insets i = parent.getInsets(); - - int w = LayoutUtil.getSizeSafe(grid != null ? grid.getWidth() : null, sizeType) + i.left + i.right; - int h = LayoutUtil.getSizeSafe(grid != null ? grid.getHeight() : null, sizeType) + i.top + i.bottom; - - return new Dimension(w, h); - } - - @Override - public float getLayoutAlignmentX(Container parent) - { - return lc != null && lc.getAlignX() != null ? lc.getAlignX().getPixels(1, checkParent(parent), null) : 0; - } - - @Override - public float getLayoutAlignmentY(Container parent) - { - return lc != null && lc.getAlignY() != null ? lc.getAlignY().getPixels(1, checkParent(parent), null) : 0; - } - - @Override - public void addLayoutComponent(String s, Component comp) - { - addLayoutComponent(comp, s); - } - - @Override - public void addLayoutComponent(Component comp, Object constraints) - { - synchronized(comp.getParent().getTreeLock()) { - setComponentConstraintsImpl(comp, constraints, true); - } - } - - @Override - public void removeLayoutComponent(Component comp) - { - synchronized(comp.getParent().getTreeLock()) { - scrConstrMap.remove(comp); - ccMap.remove(new SwingComponentWrapper(comp)); - grid = null; // To clear references - } - } - - @Override - public void invalidateLayout(Container target) - { - dirty = true; - } - - // ************************************************ - // Persistence Delegate and Serializable combined. - // ************************************************ - - private Object readResolve() throws ObjectStreamException - { - return LayoutUtil.getSerializedObject(this); - } - - @Override - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException - { - LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in)); - } - - @Override - public void writeExternal(ObjectOutput out) throws IOException - { - if (getClass() == MigLayout.class) - LayoutUtil.writeAsXML(out, this); - } - - private class MyDebugRepaintListener implements ActionListener - { - @Override - public void actionPerformed(ActionEvent e) - { - if (grid != null) { - Component comp = (Component) grid.getContainer().getComponent(); - if (comp.isShowing()) { - grid.paintDebug(); - return; - } - } - debugTimer.stop(); - debugTimer = null; - } - } -} \ No newline at end of file diff --git a/src2/net/miginfocom/swing/SwingComponentWrapper.java b/src2/net/miginfocom/swing/SwingComponentWrapper.java deleted file mode 100644 index 46a78fd..0000000 --- a/src2/net/miginfocom/swing/SwingComponentWrapper.java +++ /dev/null @@ -1,679 +0,0 @@ -package net.miginfocom.swing; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -import net.miginfocom.layout.ComponentWrapper; -import net.miginfocom.layout.ContainerWrapper; -import net.miginfocom.layout.LayoutUtil; -import net.miginfocom.layout.PlatformDefaults; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.text.JTextComponent; -import java.awt.*; -import java.awt.geom.Rectangle2D; -import java.util.IdentityHashMap; -import java.util.StringTokenizer; - -/** - */ -public class SwingComponentWrapper implements ComponentWrapper -{ - private static boolean maxSet = false; - - private static boolean vp = true; - - /** Debug color for component bounds outline. - */ - private static final Color DB_COMP_OUTLINE = new Color(0, 0, 200); - - /** Property to use in LAF settings and as JComponent client property - * to specify the visual padding. - *

- */ - private static final String VISUAL_PADDING_PROPERTY = net.miginfocom.layout.PlatformDefaults.VISUAL_PADDING_PROPERTY; - - private final Component c; - private int compType = TYPE_UNSET; - private Boolean bl = null; - private boolean prefCalled = false; - - public SwingComponentWrapper(Component c) - { - this.c = c; - } - - @Override - public final int getBaseline(int width, int height) - { - int h = height; - int[] visPad = getVisualPadding(); - if (h < 0) { - h = c.getHeight(); - } else if (visPad != null) { - h = height + visPad[0] + visPad[2]; - } - int baseLine = c.getBaseline(width < 0 ? c.getWidth() : width, h); - if (baseLine != -1 && visPad != null) - baseLine -= visPad[0]; - - return baseLine; - } - - @Override - public final Object getComponent() - { - return c; - } - - /** Cache. - */ - private final static IdentityHashMap FM_MAP = new IdentityHashMap(4); - private final static Font SUBST_FONT = new Font("sansserif", Font.PLAIN, 11); - - @Override - public final float getPixelUnitFactor(boolean isHor) - { - switch (PlatformDefaults.getLogicalPixelBase()) { - case PlatformDefaults.BASE_FONT_SIZE: - Font font = c.getFont(); - FontMetrics fm = c.getFontMetrics(font != null ? font : SUBST_FONT); - Point.Float p = FM_MAP.get(fm); - if (p == null) { - Rectangle2D r = fm.getStringBounds("X", c.getGraphics()); - p = new Point.Float(((float) r.getWidth()) / 6f, ((float) r.getHeight()) / 13.27734375f); - FM_MAP.put(fm, p); - } - return isHor ? p.x : p.y; - - case PlatformDefaults.BASE_SCALE_FACTOR: - - Float s = isHor ? PlatformDefaults.getHorizontalScaleFactor() : PlatformDefaults.getVerticalScaleFactor(); - float scaleFactor = (s != null) ? s : 1f; - - // Swing in Java 9 scales automatically using the system scale factor(s) that the - // user can change in the system settings (Windows: Control Panel; Mac: System Preferences). - // Each connected screen may use its own scale factor - // (e.g. 1.5 for primary 4K 40inch screen and 1.0 for secondary HD screen). - float screenScale = isJava9orLater - ? 1f // use system scale factor(s) - : (float) (isHor ? getHorizontalScreenDPI() : getVerticalScreenDPI()) / (float) PlatformDefaults.getDefaultDPI(); - return scaleFactor * screenScale; - - default: - return 1f; - } - } - - private static boolean isJava9orLater; - static { - try { - // Java 9 version-String Scheme: http://openjdk.java.net/jeps/223 - StringTokenizer st = new StringTokenizer(System.getProperty("java.version"), "._-+"); - int majorVersion = Integer.parseInt(st.nextToken()); - isJava9orLater = majorVersion >= 9; - } catch (Exception e) { - // Java 8 or older - } - } - -// /** Cache. -// */ -// private final static IdentityHashMap FM_MAP2 = new IdentityHashMap(4); -// private final static Font SUBST_FONT2 = new Font("sansserif", Font.PLAIN, 11); -// -// public float getDialogUnit(boolean isHor) -// { -// Font font = c.getFont(); -// FontMetrics fm = c.getFontMetrics(font != null ? font : SUBST_FONT2); -// Point.Float dluP = FM_MAP2.get(fm); -// if (dluP == null) { -// float w = fm.charWidth('X') / 4f; -// int ascent = fm.getAscent(); -// float h = (ascent > 14 ? ascent : ascent + (15 - ascent) / 3) / 8f; -// -// dluP = new Point.Float(w, h); -// FM_MAP2.put(fm, dluP); -// } -// return isHor ? dluP.x : dluP.y; -// } - - @Override - public final int getX() - { - return c.getX(); - } - - @Override - public final int getY() - { - return c.getY(); - } - - @Override - public final int getHeight() - { - return c.getHeight(); - } - - @Override - public final int getWidth() - { - return c.getWidth(); - } - - @Override - public final int getScreenLocationX() - { - Point p = new Point(); - SwingUtilities.convertPointToScreen(p, c); - return p.x; - } - - @Override - public final int getScreenLocationY() - { - Point p = new Point(); - SwingUtilities.convertPointToScreen(p, c); - return p.y; - } - - @Override - public final int getMinimumHeight(int sz) - { - if (prefCalled == false) { - c.getPreferredSize(); // To defeat a bug where the minimum size is different before and after the first call to getPreferredSize(); - prefCalled = true; - } - return c.getMinimumSize().height; - } - - @Override - public final int getMinimumWidth(int sz) - { - if (prefCalled == false) { - c.getPreferredSize(); // To defeat a bug where the minimum size is different before and after the first call to getPreferredSize(); - prefCalled = true; - } - return c.getMinimumSize().width; - } - @Override - public final int getPreferredHeight(int sz) - { - // If the component has not gotten size yet and there is a size hint, trick Swing to return a better height. - if (c.getWidth() == 0 && c.getHeight() == 0 && sz != -1) - c.setBounds(c.getX(), c.getY(), sz, 1); - - return c.getPreferredSize().height; - } - - @Override - public final int getPreferredWidth(int sz) - { - // If the component has not gotten size yet and there is a size hint, trick Swing to return a better height. - if (c.getWidth() == 0 && c.getHeight() == 0 && sz != -1) - c.setBounds(c.getX(), c.getY(), 1, sz); - - return c.getPreferredSize().width; - } - - @Override - public final int getMaximumHeight(int sz) - { - if (!isMaxSet(c)) - return Integer.MAX_VALUE; - - return c.getMaximumSize().height; - } - - @Override - public final int getMaximumWidth(int sz) - { - if (!isMaxSet(c)) - return Integer.MAX_VALUE; - - return c.getMaximumSize().width; - } - - - private boolean isMaxSet(Component c) - { - return c.isMaximumSizeSet(); - } - - @Override - public final ContainerWrapper getParent() - { - Container p = c.getParent(); - return p != null ? new SwingContainerWrapper(p) : null; - } - - @Override - public final int getHorizontalScreenDPI() { - try { - return c.getToolkit().getScreenResolution(); - } catch (HeadlessException ex) { - return PlatformDefaults.getDefaultDPI(); - } - } - - @Override - public final int getVerticalScreenDPI() - { - try { - return c.getToolkit().getScreenResolution(); - } catch (HeadlessException ex) { - return PlatformDefaults.getDefaultDPI(); - } - } - - @Override - public final int getScreenWidth() - { - try { - return c.getToolkit().getScreenSize().width; - } catch (HeadlessException ex) { - return 1024; - } - } - - @Override - public final int getScreenHeight() - { - try { - return c.getToolkit().getScreenSize().height; - } catch (HeadlessException ex) { - return 768; - } - } - - @Override - public final boolean hasBaseline() - { - if (bl == null) { - try { - // Removed since OTHER is sometimes returned even though there is a valid baseline (e.g. an empty JComboBox) -// if (c.getBaselineResizeBehavior() == Component.BaselineResizeBehavior.OTHER) { -// bl = Boolean.FALSE; -// } else { - // Removed since it made some components layout themselves to the minimum size and that stuck after that. E.g. JLabel with HTML content and white spaces would be very tall. -// Dimension d = c.getPreferredSize(); -// bl = getBaseline(d.width, d.height) > -1; - bl = getBaseline(8192, 8192) > -1; // Use large number but don't risk overflow or exposing size bugs with Integer.MAX_VALUE -// } - } catch (Throwable ex) { - bl = Boolean.FALSE; - } - } - return bl; - } - - @Override - public final String getLinkId() - { - return c.getName(); - } - - @Override - public final void setBounds(int x, int y, int width, int height) - { - c.setBounds(x, y, width, height); - } - - @Override - public boolean isVisible() - { - return c.isVisible(); - } - - @Override - public final int[] getVisualPadding() - { - int[] padding = null; - if (isVisualPaddingEnabled()) { - //First try "visualPadding" client property - if (c instanceof JComponent) { - JComponent component = (JComponent) c; - Object padValue = component.getClientProperty(VISUAL_PADDING_PROPERTY); - - if (padValue instanceof int[] ) { - //client property value could be an int[] - padding = (int[]) padValue; - } else if (padValue instanceof Insets) { - //OR client property value could be an Insets - Insets padInsets = (Insets) padValue; - padding = new int[] { padInsets.top, padInsets.left, padInsets.bottom, padInsets.right }; - } - - if (padding == null) { - //No client property set on the individual JComponent, - // so check for a LAF setting for the component type. - String classID; - switch (getComponentType(false)) { - case TYPE_BUTTON: - Border border = component.getBorder(); - if (border != null && border.getClass().getName().startsWith("com.apple.laf.AquaButtonBorder")) { - if (PlatformDefaults.getPlatform() == PlatformDefaults.MAC_OSX) { - Object buttonType = component.getClientProperty("JButton.buttonType"); - if (buttonType == null) { - classID = component.getHeight() < 33 ? "Button" : "Button.bevel"; - } else { - classID = "Button." + buttonType; - } - if (((AbstractButton) component).getIcon() != null) - classID += ".icon"; - } else { - classID = "Button"; - } - } else { - classID = ""; - } - break; - - case TYPE_CHECK_BOX: - border = component.getBorder(); - if (border != null && border.getClass().getName().startsWith("com.apple.laf.AquaButtonBorder")) { - Object size = component.getClientProperty("JComponent.sizeVariant"); - if (size != null && size.toString().equals("regular") == false) { - size = "." + size; - } else { - size = ""; - } - - if (component instanceof JRadioButton) { - classID = "RadioButton" + size; - } else if (component instanceof JCheckBox) { - classID = "CheckBox" + size; - } else { - classID = "ToggleButton" + size; - } - } else { - classID = ""; - } - break; - - case TYPE_COMBO_BOX: - if (PlatformDefaults.getPlatform() == PlatformDefaults.MAC_OSX) { - if (((JComboBox) component).isEditable()) { - Object isSquare = component.getClientProperty("JComboBox.isSquare"); - if (isSquare != null && isSquare.toString().equals("true")) { - classID = "ComboBox.editable.isSquare"; - } else { - classID = "ComboBox.editable"; - } - - } else { - Object isSquare = component.getClientProperty("JComboBox.isSquare"); - Object isPopDown = component.getClientProperty("JComboBox.isPopDown"); - - if (isSquare != null && isSquare.toString().equals("true")) { - classID = "ComboBox.isSquare"; - } else if (isPopDown != null && isPopDown.toString().equals("true")) { - classID = "ComboBox.isPopDown"; - } else { - classID = "ComboBox"; - } - } - } else { - classID = "ComboBox"; - } - break; - case TYPE_CONTAINER: - classID = "Container"; - break; - case TYPE_IMAGE: - classID = "Image"; - break; - case TYPE_LABEL: - classID = "Label"; - break; - case TYPE_LIST: - classID = "List"; - break; - case TYPE_PANEL: - classID = "Panel"; - break; - case TYPE_PROGRESS_BAR: - classID = "ProgressBar"; - break; - case TYPE_SCROLL_BAR: - classID = "ScrollBar"; - break; - case TYPE_SCROLL_PANE: - classID = "ScrollPane"; - break; - case TYPE_SEPARATOR: - classID = "Separator"; - break; - case TYPE_SLIDER: - classID = "Slider"; - break; - case TYPE_SPINNER: - classID = "Spinner"; - break; - case TYPE_TABLE: - classID = "Table"; - break; - case TYPE_TABBED_PANE: - classID = "TabbedPane"; - break; - case TYPE_TEXT_AREA: - classID = "TextArea"; - break; - case TYPE_TEXT_FIELD: - border = component.getBorder(); - if (!component.isOpaque() && border != null && border.getClass().getSimpleName().equals("AquaTextFieldBorder")) { - classID = "TextField"; - } else { - classID = ""; - } - break; - case TYPE_TREE: - classID = "Tree"; - break; - case TYPE_UNKNOWN: - classID = "Other"; - break; - case TYPE_UNSET: - default: - classID = ""; - break; - } - - padValue = PlatformDefaults.getDefaultVisualPadding(classID + "." + VISUAL_PADDING_PROPERTY); - if (padValue instanceof int[]) { - //client property value could be an int[] - padding = (int[]) padValue; - } else if (padValue instanceof Insets) { - //OR client property value could be an Insets - Insets padInsets = (Insets) padValue; - padding = new int[] { padInsets.top, padInsets.left, padInsets.bottom, padInsets.right }; - } - } - } - } - return padding; - } - - /** - * @deprecated Java 1.4 is not supported anymore - */ - public static boolean isMaxSizeSetOn1_4() - { - return maxSet; - } - - /** - * @deprecated Java 1.4 is not supported anymore - */ - public static void setMaxSizeSetOn1_4(boolean b) - { - maxSet = b; - } - - public static boolean isVisualPaddingEnabled() - { - return vp; - } - - public static void setVisualPaddingEnabled(boolean b) - { - vp = b; - } - - @Override - public final void paintDebugOutline(boolean showVisualPadding) - { - if (c.isShowing() == false) - return; - - Graphics2D g = (Graphics2D) c.getGraphics(); - if (g == null) - return; - - g.setPaint(DB_COMP_OUTLINE); - g.setStroke(new BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, new float[] {2f, 4f}, 0)); - g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); - - if (showVisualPadding && isVisualPaddingEnabled()) { - int[] padding = getVisualPadding(); - if (padding != null) { - g.setColor(Color.GREEN); - g.drawRect(padding[1], padding[0], (getWidth() - 1) - (padding[1] + padding[3]), (getHeight() - 1) - (padding[0] + padding[2])); - } - } - } - - @Override - public int getComponentType(boolean disregardScrollPane) - { - if (compType == TYPE_UNSET) - compType = checkType(disregardScrollPane); - - return compType; - } - - @Override - public int getLayoutHashCode() - { - Dimension d = c.getMaximumSize(); - int hash = d.width + (d.height << 5); - - d = c.getPreferredSize(); - hash += (d.width << 10) + (d.height << 15); - - d = c.getMinimumSize(); - hash += (d.width << 20) + (d.height << 25); - - if (c.isVisible()) - hash += 1324511; - - String id = getLinkId(); - if (id != null) - hash += id.hashCode(); - - return hash; - } - - private int checkType(boolean disregardScrollPane) - { - Component c = this.c; - - if (disregardScrollPane) { - if (c instanceof JScrollPane) { - c = ((JScrollPane) c).getViewport().getView(); - } else if (c instanceof ScrollPane) { - c = ((ScrollPane) c).getComponent(0); - } - } - - if (c instanceof JTextField || c instanceof TextField) { - return TYPE_TEXT_FIELD; - } else if (c instanceof JLabel || c instanceof Label) { - return TYPE_LABEL; - } else if (c instanceof JCheckBox || c instanceof JRadioButton || c instanceof Checkbox) { - return TYPE_CHECK_BOX; - } else if (c instanceof AbstractButton || c instanceof Button) { - return TYPE_BUTTON; - } else if (c instanceof JComboBox || c instanceof Choice) { - return TYPE_COMBO_BOX; - } else if (c instanceof JTextComponent || c instanceof TextComponent) { - return TYPE_TEXT_AREA; - } else if (c instanceof JPanel || c instanceof Canvas) { - return TYPE_PANEL; - } else if (c instanceof JList || c instanceof List) { - return TYPE_LIST; - } else if (c instanceof JTable) { - return TYPE_TABLE; - } else if (c instanceof JSeparator) { - return TYPE_SEPARATOR; - } else if (c instanceof JSpinner) { - return TYPE_SPINNER; - } else if (c instanceof JTabbedPane) { - return TYPE_TABBED_PANE; - } else if (c instanceof JProgressBar) { - return TYPE_PROGRESS_BAR; - } else if (c instanceof JSlider) { - return TYPE_SLIDER; - } else if (c instanceof JScrollPane) { - return TYPE_SCROLL_PANE; - } else if (c instanceof JScrollBar || c instanceof Scrollbar) { - return TYPE_SCROLL_BAR; - } else if (c instanceof Container) { // only AWT components is not containers. - return TYPE_CONTAINER; - } - return TYPE_UNKNOWN; - } - - @Override - public final int hashCode() - { - return getComponent().hashCode(); - } - - @Override - public final boolean equals(Object o) - { - if (o instanceof ComponentWrapper == false) - return false; - - return c.equals(((ComponentWrapper) o).getComponent()); - } - - @Override - public int getContentBias() - { - return c instanceof JTextArea || c instanceof JEditorPane || (c instanceof JComponent && Boolean.TRUE.equals(((JComponent)c).getClientProperty("migLayout.dynamicAspectRatio"))) ? LayoutUtil.HORIZONTAL : -1; - } -} diff --git a/src2/net/miginfocom/swing/SwingContainerWrapper.java b/src2/net/miginfocom/swing/SwingContainerWrapper.java deleted file mode 100644 index ae352ba..0000000 --- a/src2/net/miginfocom/swing/SwingContainerWrapper.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.miginfocom.swing; -/* - * License (BSD): - * ============== - * - * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * Neither the name of the MiG InfoCom AB nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * @version 1.0 - * @author Mikael Grev, MiG InfoCom AB - * Date: 2006-sep-08 - */ - -import net.miginfocom.layout.ComponentWrapper; -import net.miginfocom.layout.ContainerWrapper; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Graphics2D; - -/** - */ -public final class SwingContainerWrapper extends SwingComponentWrapper implements ContainerWrapper -{ - /** Debug color for cell outline. - */ - private static final Color DB_CELL_OUTLINE = new Color(255, 0, 0); - - public SwingContainerWrapper(Container c) - { - super(c); - } - - @Override - public ComponentWrapper[] getComponents() - { - Container c = (Container) getComponent(); - ComponentWrapper[] cws = new ComponentWrapper[c.getComponentCount()]; - for (int i = 0; i < cws.length; i++) - cws[i] = new SwingComponentWrapper(c.getComponent(i)); - return cws; - } - - @Override - public int getComponentCount() - { - return ((Container) getComponent()).getComponentCount(); - } - - @Override - public Object getLayout() - { - return ((Container) getComponent()).getLayout(); - } - - @Override - public final boolean isLeftToRight() - { - return ((Container) getComponent()).getComponentOrientation().isLeftToRight(); - } - - @Override - public final void paintDebugCell(int x, int y, int width, int height) - { - Component c = (Component) getComponent(); - if (c.isShowing() == false) - return; - - Graphics2D g = (Graphics2D) c.getGraphics(); - if (g == null) - return; - - g.setStroke(new BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, new float[] {2f, 3f}, 0)); - g.setPaint(DB_CELL_OUTLINE); - g.drawRect(x, y, width - 1, height - 1); - } - - @Override - public int getComponentType(boolean disregardScrollPane) - { - return TYPE_CONTAINER; - } - - // Removed for 2.3 because the parent.isValid() in MigLayout will catch this instead. - @Override - public int getLayoutHashCode() - { - long n = System.nanoTime(); - int h = super.getLayoutHashCode(); - - if (isLeftToRight()) - h += 416343; - - return 0; - } -} diff --git a/src2/org/json/simple/ItemList.java b/src2/org/json/simple/ItemList.java deleted file mode 100644 index 830961b..0000000 --- a/src2/org/json/simple/ItemList.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * $Id: ItemList.java,v 1.1 2006/04/15 14:10:48 platform Exp $ - * Created on 2006-3-24 - */ -package org.json.simple; - -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - -/** - * |a:b:c| => |a|,|b|,|c| - * |:| => ||,|| - * |a:| => |a|,|| - * @author FangYidong - */ -public class ItemList { - private String sp=","; - List items=new ArrayList(); - - - public ItemList(){} - - - public ItemList(String s){ - this.split(s,sp,items); - } - - public ItemList(String s,String sp){ - this.sp=s; - this.split(s,sp,items); - } - - public ItemList(String s,String sp,boolean isMultiToken){ - split(s,sp,items,isMultiToken); - } - - public List getItems(){ - return this.items; - } - - public String[] getArray(){ - return (String[])this.items.toArray(); - } - - public void split(String s,String sp,List append,boolean isMultiToken){ - if(s==null || sp==null) - return; - if(isMultiToken){ - StringTokenizer tokens=new StringTokenizer(s,sp); - while(tokens.hasMoreTokens()){ - append.add(tokens.nextToken().trim()); - } - } - else{ - this.split(s,sp,append); - } - } - - public void split(String s,String sp,List append){ - if(s==null || sp==null) - return; - int pos=0; - int prevPos=0; - do{ - prevPos=pos; - pos=s.indexOf(sp,pos); - if(pos==-1) - break; - append.add(s.substring(prevPos,pos).trim()); - pos+=sp.length(); - }while(pos!=-1); - append.add(s.substring(prevPos).trim()); - } - - public void setSP(String sp){ - this.sp=sp; - } - - public void add(int i,String item){ - if(item==null) - return; - items.add(i,item.trim()); - } - - public void add(String item){ - if(item==null) - return; - items.add(item.trim()); - } - - public void addAll(ItemList list){ - items.addAll(list.items); - } - - public void addAll(String s){ - this.split(s,sp,items); - } - - public void addAll(String s,String sp){ - this.split(s,sp,items); - } - - public void addAll(String s,String sp,boolean isMultiToken){ - this.split(s,sp,items,isMultiToken); - } - - /** - * @param i 0-based - * @return - */ - public String get(int i){ - return (String)items.get(i); - } - - public int size(){ - return items.size(); - } - - public String toString(){ - return toString(sp); - } - - public String toString(String sp){ - StringBuffer sb=new StringBuffer(); - - for(int i=0;i - */ -public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware { - private static final long serialVersionUID = 3957988303675231981L; - - /** - * Constructs an empty JSONArray. - */ - public JSONArray(){ - super(); - } - - /** - * Constructs a JSONArray containing the elements of the specified - * collection, in the order they are returned by the collection's iterator. - * - * @param c the collection whose elements are to be placed into this JSONArray - */ - public JSONArray(Collection c){ - super(c); - } - - /** - * Encode a list into JSON text and write it to out. - * If this list is also a JSONStreamAware or a JSONAware, JSONStreamAware and JSONAware specific behaviours will be ignored at this top level. - * - * @see org.json.simple.JSONValue#writeJSONString(Object, Writer) - * - * @param collection - * @param out - */ - public static void writeJSONString(Collection collection, Writer out) throws IOException{ - if(collection == null){ - out.write("null"); - return; - } - - boolean first = true; - Iterator iter=collection.iterator(); - - out.write('['); - while(iter.hasNext()){ - if(first) - first = false; - else - out.write(','); - - Object value=iter.next(); - if(value == null){ - out.write("null"); - continue; - } - - JSONValue.writeJSONString(value, out); - } - out.write(']'); - } - - public void writeJSONString(Writer out) throws IOException{ - writeJSONString(this, out); - } - - /** - * Convert a list to JSON text. The result is a JSON array. - * If this list is also a JSONAware, JSONAware specific behaviours will be omitted at this top level. - * - * @see org.json.simple.JSONValue#toJSONString(Object) - * - * @param collection - * @return JSON text, or "null" if list is null. - */ - public static String toJSONString(Collection collection){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(collection, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(byte[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("["); - out.write(String.valueOf(array[0])); - - for(int i = 1; i < array.length; i++){ - out.write(","); - out.write(String.valueOf(array[i])); - } - - out.write("]"); - } - } - - public static String toJSONString(byte[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(short[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("["); - out.write(String.valueOf(array[0])); - - for(int i = 1; i < array.length; i++){ - out.write(","); - out.write(String.valueOf(array[i])); - } - - out.write("]"); - } - } - - public static String toJSONString(short[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(int[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("["); - out.write(String.valueOf(array[0])); - - for(int i = 1; i < array.length; i++){ - out.write(","); - out.write(String.valueOf(array[i])); - } - - out.write("]"); - } - } - - public static String toJSONString(int[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(long[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("["); - out.write(String.valueOf(array[0])); - - for(int i = 1; i < array.length; i++){ - out.write(","); - out.write(String.valueOf(array[i])); - } - - out.write("]"); - } - } - - public static String toJSONString(long[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(float[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("["); - out.write(String.valueOf(array[0])); - - for(int i = 1; i < array.length; i++){ - out.write(","); - out.write(String.valueOf(array[i])); - } - - out.write("]"); - } - } - - public static String toJSONString(float[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(double[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("["); - out.write(String.valueOf(array[0])); - - for(int i = 1; i < array.length; i++){ - out.write(","); - out.write(String.valueOf(array[i])); - } - - out.write("]"); - } - } - - public static String toJSONString(double[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(boolean[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("["); - out.write(String.valueOf(array[0])); - - for(int i = 1; i < array.length; i++){ - out.write(","); - out.write(String.valueOf(array[i])); - } - - out.write("]"); - } - } - - public static String toJSONString(boolean[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(char[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("[\""); - out.write(String.valueOf(array[0])); - - for(int i = 1; i < array.length; i++){ - out.write("\",\""); - out.write(String.valueOf(array[i])); - } - - out.write("\"]"); - } - } - - public static String toJSONString(char[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public static void writeJSONString(Object[] array, Writer out) throws IOException{ - if(array == null){ - out.write("null"); - } else if(array.length == 0) { - out.write("[]"); - } else { - out.write("["); - JSONValue.writeJSONString(array[0], out); - - for(int i = 1; i < array.length; i++){ - out.write(","); - JSONValue.writeJSONString(array[i], out); - } - - out.write("]"); - } - } - - public static String toJSONString(Object[] array){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(array, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - public String toJSONString(){ - return toJSONString(this); - } - - /** - * Returns a string representation of this array. This is equivalent to - * calling {@link JSONArray#toJSONString()}. - */ - public String toString() { - return toJSONString(); - } -} diff --git a/src2/org/json/simple/JSONAware.java b/src2/org/json/simple/JSONAware.java deleted file mode 100644 index 5e7452f..0000000 --- a/src2/org/json/simple/JSONAware.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.json.simple; - -/** - * Beans that support customized output of JSON text shall implement this interface. - * @author FangYidong - */ -public interface JSONAware { - /** - * @return JSON text - */ - String toJSONString(); -} diff --git a/src2/org/json/simple/JSONObject.java b/src2/org/json/simple/JSONObject.java deleted file mode 100644 index fafa36b..0000000 --- a/src2/org/json/simple/JSONObject.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * $Id: JSONObject.java,v 1.1 2006/04/15 14:10:48 platform Exp $ - * Created on 2006-4-10 - */ -package org.json.simple; - -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -/** - * A JSON object. Key value pairs are unordered. JSONObject supports java.util.Map interface. - * - * @author FangYidong - */ -public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware{ - - private static final long serialVersionUID = -503443796854799292L; - - - public JSONObject() { - super(); - } - - /** - * Allows creation of a JSONObject from a Map. After that, both the - * generated JSONObject and the Map can be modified independently. - * - * @param map - */ - public JSONObject(Map map) { - super(map); - } - - - /** - * Encode a map into JSON text and write it to out. - * If this map is also a JSONAware or JSONStreamAware, JSONAware or JSONStreamAware specific behaviours will be ignored at this top level. - * - * @see org.json.simple.JSONValue#writeJSONString(Object, Writer) - * - * @param map - * @param out - */ - public static void writeJSONString(Map map, Writer out) throws IOException { - if(map == null){ - out.write("null"); - return; - } - - boolean first = true; - Iterator iter=map.entrySet().iterator(); - - out.write('{'); - while(iter.hasNext()){ - if(first) - first = false; - else - out.write(','); - Map.Entry entry=(Map.Entry)iter.next(); - out.write('\"'); - out.write(escape(String.valueOf(entry.getKey()))); - out.write('\"'); - out.write(':'); - JSONValue.writeJSONString(entry.getValue(), out); - } - out.write('}'); - } - - public void writeJSONString(Writer out) throws IOException{ - writeJSONString(this, out); - } - - /** - * Convert a map to JSON text. The result is a JSON object. - * If this map is also a JSONAware, JSONAware specific behaviours will be omitted at this top level. - * - * @see org.json.simple.JSONValue#toJSONString(Object) - * - * @param map - * @return JSON text, or "null" if map is null. - */ - public static String toJSONString(Map map){ - final StringWriter writer = new StringWriter(); - - try { - writeJSONString(map, writer); - return writer.toString(); - } catch (IOException e) { - // This should never happen with a StringWriter - throw new RuntimeException(e); - } - } - - public String toJSONString(){ - return toJSONString(this); - } - - public String toString(){ - return toJSONString(); - } - - public static String toString(String key,Object value){ - StringBuffer sb = new StringBuffer(); - sb.append('\"'); - if(key == null) - sb.append("null"); - else - JSONValue.escape(key, sb); - sb.append('\"').append(':'); - - sb.append(JSONValue.toJSONString(value)); - - return sb.toString(); - } - - /** - * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F). - * It's the same as JSONValue.escape() only for compatibility here. - * - * @see org.json.simple.JSONValue#escape(String) - * - * @param s - * @return - */ - public static String escape(String s){ - return JSONValue.escape(s); - } -} diff --git a/src2/org/json/simple/JSONStreamAware.java b/src2/org/json/simple/JSONStreamAware.java deleted file mode 100644 index ab63b3e..0000000 --- a/src2/org/json/simple/JSONStreamAware.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.json.simple; - -import java.io.IOException; -import java.io.Writer; - -/** - * Beans that support customized output of JSON text to a writer shall implement this interface. - * @author FangYidong - */ -public interface JSONStreamAware { - /** - * write JSON string to out. - */ - void writeJSONString(Writer out) throws IOException; -} diff --git a/src2/org/json/simple/JSONValue.java b/src2/org/json/simple/JSONValue.java deleted file mode 100644 index 5da3cd0..0000000 --- a/src2/org/json/simple/JSONValue.java +++ /dev/null @@ -1,316 +0,0 @@ -/* - * $Id: JSONValue.java,v 1.1 2006/04/15 14:37:04 platform Exp $ - * Created on 2006-4-15 - */ -package org.json.simple; - -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.io.StringWriter; -import java.io.Writer; -import java.util.Collection; -// import java.util.List; -import java.util.Map; - -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; - - -/** - * @author FangYidong - */ -public class JSONValue { - /** - * Parse JSON text into java object from the input source. - * Please use parseWithException() if you don't want to ignore the exception. - * - * @see org.json.simple.parser.JSONParser#parse(Reader) - * @see #parseWithException(Reader) - * - * @param in - * @return Instance of the following: - * org.json.simple.JSONObject, - * org.json.simple.JSONArray, - * java.lang.String, - * java.lang.Number, - * java.lang.Boolean, - * null - * - * @deprecated this method may throw an {@code Error} instead of returning - * {@code null}; please use {@link JSONValue#parseWithException(Reader)} - * instead - */ - public static Object parse(Reader in){ - try{ - JSONParser parser=new JSONParser(); - return parser.parse(in); - } - catch(Exception e){ - return null; - } - } - - /** - * Parse JSON text into java object from the given string. - * Please use parseWithException() if you don't want to ignore the exception. - * - * @see org.json.simple.parser.JSONParser#parse(Reader) - * @see #parseWithException(Reader) - * - * @param s - * @return Instance of the following: - * org.json.simple.JSONObject, - * org.json.simple.JSONArray, - * java.lang.String, - * java.lang.Number, - * java.lang.Boolean, - * null - * - * @deprecated this method may throw an {@code Error} instead of returning - * {@code null}; please use {@link JSONValue#parseWithException(String)} - * instead - */ - public static Object parse(String s){ - StringReader in=new StringReader(s); - return parse(in); - } - - /** - * Parse JSON text into java object from the input source. - * - * @see org.json.simple.parser.JSONParser - * - * @param in - * @return Instance of the following: - * org.json.simple.JSONObject, - * org.json.simple.JSONArray, - * java.lang.String, - * java.lang.Number, - * java.lang.Boolean, - * null - * - * @throws IOException - * @throws ParseException - */ - public static Object parseWithException(Reader in) throws IOException, ParseException{ - JSONParser parser=new JSONParser(); - return parser.parse(in); - } - - public static Object parseWithException(String s) throws ParseException{ - JSONParser parser=new JSONParser(); - return parser.parse(s); - } - - /** - * Encode an object into JSON text and write it to out. - *

- * If this object is a Map or a List, and it's also a JSONStreamAware or a JSONAware, JSONStreamAware or JSONAware will be considered firstly. - *

- * DO NOT call this method from writeJSONString(Writer) of a class that implements both JSONStreamAware and (Map or List) with - * "this" as the first parameter, use JSONObject.writeJSONString(Map, Writer) or JSONArray.writeJSONString(List, Writer) instead. - * - * @see org.json.simple.JSONObject#writeJSONString(Map, Writer) - * @see org.json.simple.JSONArray#writeJSONString(List, Writer) - * - * @param value - * @param writer - */ - public static void writeJSONString(Object value, Writer out) throws IOException { - if(value == null){ - out.write("null"); - return; - } - - if(value instanceof String){ - out.write('\"'); - out.write(escape((String)value)); - out.write('\"'); - return; - } - - if(value instanceof Double){ - if(((Double)value).isInfinite() || ((Double)value).isNaN()) - out.write("null"); - else - out.write(value.toString()); - return; - } - - if(value instanceof Float){ - if(((Float)value).isInfinite() || ((Float)value).isNaN()) - out.write("null"); - else - out.write(value.toString()); - return; - } - - if(value instanceof Number){ - out.write(value.toString()); - return; - } - - if(value instanceof Boolean){ - out.write(value.toString()); - return; - } - - if((value instanceof JSONStreamAware)){ - ((JSONStreamAware)value).writeJSONString(out); - return; - } - - if((value instanceof JSONAware)){ - out.write(((JSONAware)value).toJSONString()); - return; - } - - if(value instanceof Map){ - JSONObject.writeJSONString((Map)value, out); - return; - } - - if(value instanceof Collection){ - JSONArray.writeJSONString((Collection)value, out); - return; - } - - if(value instanceof byte[]){ - JSONArray.writeJSONString((byte[])value, out); - return; - } - - if(value instanceof short[]){ - JSONArray.writeJSONString((short[])value, out); - return; - } - - if(value instanceof int[]){ - JSONArray.writeJSONString((int[])value, out); - return; - } - - if(value instanceof long[]){ - JSONArray.writeJSONString((long[])value, out); - return; - } - - if(value instanceof float[]){ - JSONArray.writeJSONString((float[])value, out); - return; - } - - if(value instanceof double[]){ - JSONArray.writeJSONString((double[])value, out); - return; - } - - if(value instanceof boolean[]){ - JSONArray.writeJSONString((boolean[])value, out); - return; - } - - if(value instanceof char[]){ - JSONArray.writeJSONString((char[])value, out); - return; - } - - if(value instanceof Object[]){ - JSONArray.writeJSONString((Object[])value, out); - return; - } - - out.write(value.toString()); - } - - /** - * Convert an object to JSON text. - *

- * If this object is a Map or a List, and it's also a JSONAware, JSONAware will be considered firstly. - *

- * DO NOT call this method from toJSONString() of a class that implements both JSONAware and Map or List with - * "this" as the parameter, use JSONObject.toJSONString(Map) or JSONArray.toJSONString(List) instead. - * - * @see org.json.simple.JSONObject#toJSONString(Map) - * @see org.json.simple.JSONArray#toJSONString(List) - * - * @param value - * @return JSON text, or "null" if value is null or it's an NaN or an INF number. - */ - public static String toJSONString(Object value){ - final StringWriter writer = new StringWriter(); - - try{ - writeJSONString(value, writer); - return writer.toString(); - } catch(IOException e){ - // This should never happen for a StringWriter - throw new RuntimeException(e); - } - } - - /** - * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F). - * @param s - * @return - */ - public static String escape(String s){ - if(s==null) - return null; - StringBuffer sb = new StringBuffer(); - escape(s, sb); - return sb.toString(); - } - - /** - * @param s - Must not be null. - * @param sb - */ - static void escape(String s, StringBuffer sb) { - final int len = s.length(); - for(int i=0;i='\u0000' && ch<='\u001F') || (ch>='\u007F' && ch<='\u009F') || (ch>='\u2000' && ch<='\u20FF')){ - String ss=Integer.toHexString(ch); - sb.append("\\u"); - for(int k=0;k<4-ss.length();k++){ - sb.append('0'); - } - sb.append(ss.toUpperCase()); - } - else{ - sb.append(ch); - } - } - }//for - } - -} diff --git a/src2/org/json/simple/README.txt b/src2/org/json/simple/README.txt deleted file mode 100644 index 43b3a6c..0000000 --- a/src2/org/json/simple/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -https://github.com/SwingJS/json-simple.git -forked 6/23/2018 from https://github.com/fangyidong/json-simple/tree/master/src/main/java/org/json/simple -Bob Hanson -hansonr@stolaf.edu \ No newline at end of file diff --git a/src2/org/json/simple/parser/ContainerFactory.java b/src2/org/json/simple/parser/ContainerFactory.java deleted file mode 100644 index 0bb7baf..0000000 --- a/src2/org/json/simple/parser/ContainerFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.json.simple.parser; - -import java.util.List; -import java.util.Map; - -/** - * Container factory for creating containers for JSON object and JSON array. - * - * @see org.json.simple.parser.JSONParser#parse(java.io.Reader, ContainerFactory) - * - * @author FangYidong - */ -public interface ContainerFactory { - /** - * @return A Map instance to store JSON object, or null if you want to use org.json.simple.JSONObject. - */ - Map createObjectContainer(); - - /** - * @return A List instance to store JSON array, or null if you want to use org.json.simple.JSONArray. - */ - List creatArrayContainer(); -} diff --git a/src2/org/json/simple/parser/ContentHandler.java b/src2/org/json/simple/parser/ContentHandler.java deleted file mode 100644 index 056a85c..0000000 --- a/src2/org/json/simple/parser/ContentHandler.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.json.simple.parser; - -import java.io.IOException; - -/** - * A simplified and stoppable SAX-like content handler for stream processing of JSON text. - * - * @see org.xml.sax.ContentHandler - * @see org.json.simple.parser.JSONParser#parse(java.io.Reader, ContentHandler, boolean) - * - * @author FangYidong - */ -public interface ContentHandler { - /** - * Receive notification of the beginning of JSON processing. - * The parser will invoke this method only once. - * - * @throws ParseException - * - JSONParser will stop and throw the same exception to the caller when receiving this exception. - */ - void startJSON() throws ParseException, IOException; - - /** - * Receive notification of the end of JSON processing. - * - * @throws ParseException - */ - void endJSON() throws ParseException, IOException; - - /** - * Receive notification of the beginning of a JSON object. - * - * @return false if the handler wants to stop parsing after return. - * @throws ParseException - * - JSONParser will stop and throw the same exception to the caller when receiving this exception. - * @see #endJSON - */ - boolean startObject() throws ParseException, IOException; - - /** - * Receive notification of the end of a JSON object. - * - * @return false if the handler wants to stop parsing after return. - * @throws ParseException - * - * @see #startObject - */ - boolean endObject() throws ParseException, IOException; - - /** - * Receive notification of the beginning of a JSON object entry. - * - * @param key - Key of a JSON object entry. - * - * @return false if the handler wants to stop parsing after return. - * @throws ParseException - * - * @see #endObjectEntry - */ - boolean startObjectEntry(String key) throws ParseException, IOException; - - /** - * Receive notification of the end of the value of previous object entry. - * - * @return false if the handler wants to stop parsing after return. - * @throws ParseException - * - * @see #startObjectEntry - */ - boolean endObjectEntry() throws ParseException, IOException; - - /** - * Receive notification of the beginning of a JSON array. - * - * @return false if the handler wants to stop parsing after return. - * @throws ParseException - * - * @see #endArray - */ - boolean startArray() throws ParseException, IOException; - - /** - * Receive notification of the end of a JSON array. - * - * @return false if the handler wants to stop parsing after return. - * @throws ParseException - * - * @see #startArray - */ - boolean endArray() throws ParseException, IOException; - - /** - * Receive notification of the JSON primitive values: - * java.lang.String, - * java.lang.Number, - * java.lang.Boolean - * null - * - * @param value - Instance of the following: - * java.lang.String, - * java.lang.Number, - * java.lang.Boolean - * null - * - * @return false if the handler wants to stop parsing after return. - * @throws ParseException - */ - boolean primitive(Object value) throws ParseException, IOException; - -} diff --git a/src2/org/json/simple/parser/JSONParser.java b/src2/org/json/simple/parser/JSONParser.java deleted file mode 100644 index 70e04cc..0000000 --- a/src2/org/json/simple/parser/JSONParser.java +++ /dev/null @@ -1,611 +0,0 @@ -/* - * $Id: JSONParser.java,v 1.1 2006/04/15 14:10:48 platform Exp $ - * Created on 2006-4-15 - */ -package org.json.simple.parser; - -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -/** - * Parser for JSON text. Please note that JSONParser is NOT thread-safe. - * - * @author FangYidong - */ -public class JSONParser -{ - public static final int S_INIT = 0; - - public static final int S_IN_FINISHED_VALUE = 1;// string,number,boolean,null,object,array - - public static final int S_IN_OBJECT = 2; - - public static final int S_IN_ARRAY = 3; - - public static final int S_PASSED_PAIR_KEY = 4; - - public static final int S_IN_PAIR_VALUE = 5; - - public static final int S_END = 6; - - public static final int S_IN_ERROR = -1; - - private LinkedList handlerStatusStack; - - private Yylex lexer = new Yylex((Reader) null); - - private Yytoken token = null; - - private int status = S_INIT; - - private int peekStatus(LinkedList statusStack) - { - if (statusStack.size() == 0) - return -1; - Integer status = (Integer) statusStack.getFirst(); - return status.intValue(); - } - - /** - * Reset the parser to the initial state without resetting the underlying - * reader. - * - */ - public void reset() - { - token = null; - status = S_INIT; - handlerStatusStack = null; - } - - /** - * Reset the parser to the initial state with a new character reader. - * - * @param in - * - The new character reader. - * @throws IOException - * @throws ParseException - */ - public void reset(Reader in) - { - lexer.yyreset(in); - reset(); - } - - /** - * @return The position of the beginning of the current token. - */ - public int getPosition() - { - return lexer.getPosition(); - } - - public Object parse(String s) throws ParseException - { - return parse(s, (ContainerFactory) null); - } - - public Object parse(String s, ContainerFactory containerFactory) - throws ParseException - { - StringReader in = new StringReader(s); - try - { - return parse(in, containerFactory); - } catch (IOException ie) - { - /* - * Actually it will never happen. - */ - throw new ParseException(-1, - ParseException.ERROR_UNEXPECTED_EXCEPTION, ie); - } - } - - public Object parse(Reader in) throws IOException, ParseException - { - return parse(in, (ContainerFactory) null); - } - - /** - * Parse JSON text into java object from the input source. - * - * @param in - * @param containerFactory - * - Use this factory to createyour own JSON object and JSON array - * containers. - * @return Instance of the following: org.json.simple.JSONObject, - * org.json.simple.JSONArray, java.lang.String, java.lang.Number, - * java.lang.Boolean, null - * - * @throws IOException - * @throws ParseException - */ - public Object parse(Reader in, ContainerFactory containerFactory) - throws IOException, ParseException - { - reset(in); - LinkedList statusStack = new LinkedList(); - LinkedList valueStack = new LinkedList(); - - try - { - do - { - nextToken(); - switch (status) - { - case S_INIT: - switch (token.type) - { - case Yytoken.TYPE_VALUE: - status = S_IN_FINISHED_VALUE; - statusStack.addFirst(new Integer(status)); - valueStack.addFirst(token.value); - break; - case Yytoken.TYPE_LEFT_BRACE: - status = S_IN_OBJECT; - statusStack.addFirst(new Integer(status)); - valueStack.addFirst(createObjectContainer(containerFactory)); - break; - case Yytoken.TYPE_LEFT_SQUARE: - status = S_IN_ARRAY; - statusStack.addFirst(new Integer(status)); - valueStack.addFirst(createArrayContainer(containerFactory)); - break; - default: - status = S_IN_ERROR; - }// inner switch - break; - - case S_IN_FINISHED_VALUE: - if (token.type == Yytoken.TYPE_EOF) - return valueStack.removeFirst(); - else - throw new ParseException(getPosition(), - ParseException.ERROR_UNEXPECTED_TOKEN, token); - - case S_IN_OBJECT: - switch (token.type) - { - case Yytoken.TYPE_COMMA: - break; - case Yytoken.TYPE_VALUE: - if (token.value instanceof String) - { - String key = (String) token.value; - valueStack.addFirst(key); - status = S_PASSED_PAIR_KEY; - statusStack.addFirst(new Integer(status)); - } - else - { - status = S_IN_ERROR; - } - break; - case Yytoken.TYPE_RIGHT_BRACE: - if (valueStack.size() > 1) - { - statusStack.removeFirst(); - valueStack.removeFirst(); - status = peekStatus(statusStack); - } - else - { - status = S_IN_FINISHED_VALUE; - } - break; - default: - status = S_IN_ERROR; - break; - }// inner switch - break; - - case S_PASSED_PAIR_KEY: - switch (token.type) - { - case Yytoken.TYPE_COLON: - break; - case Yytoken.TYPE_VALUE: - statusStack.removeFirst(); - String key = (String) valueStack.removeFirst(); - Map parent = (Map) valueStack.getFirst(); - parent.put(key, token.value); - status = peekStatus(statusStack); - break; - case Yytoken.TYPE_LEFT_SQUARE: - statusStack.removeFirst(); - key = (String) valueStack.removeFirst(); - parent = (Map) valueStack.getFirst(); - List newArray = createArrayContainer(containerFactory); - parent.put(key, newArray); - status = S_IN_ARRAY; - statusStack.addFirst(new Integer(status)); - valueStack.addFirst(newArray); - break; - case Yytoken.TYPE_LEFT_BRACE: - statusStack.removeFirst(); - key = (String) valueStack.removeFirst(); - parent = (Map) valueStack.getFirst(); - Map newObject = createObjectContainer(containerFactory); - parent.put(key, newObject); - status = S_IN_OBJECT; - statusStack.addFirst(new Integer(status)); - valueStack.addFirst(newObject); - break; - default: - status = S_IN_ERROR; - } - break; - - case S_IN_ARRAY: - switch (token.type) - { - case Yytoken.TYPE_COMMA: - break; - case Yytoken.TYPE_VALUE: - List val = (List) valueStack.getFirst(); - val.add(token.value); - break; - case Yytoken.TYPE_RIGHT_SQUARE: - if (valueStack.size() > 1) - { - statusStack.removeFirst(); - valueStack.removeFirst(); - status = peekStatus(statusStack); - } - else - { - status = S_IN_FINISHED_VALUE; - } - break; - case Yytoken.TYPE_LEFT_BRACE: - val = (List) valueStack.getFirst(); - Map newObject = createObjectContainer(containerFactory); - val.add(newObject); - status = S_IN_OBJECT; - statusStack.addFirst(new Integer(status)); - valueStack.addFirst(newObject); - break; - case Yytoken.TYPE_LEFT_SQUARE: - val = (List) valueStack.getFirst(); - List newArray = createArrayContainer(containerFactory); - val.add(newArray); - status = S_IN_ARRAY; - statusStack.addFirst(new Integer(status)); - valueStack.addFirst(newArray); - break; - default: - status = S_IN_ERROR; - }// inner switch - break; - case S_IN_ERROR: - throw new ParseException(getPosition(), - ParseException.ERROR_UNEXPECTED_TOKEN, token); - }// switch - if (status == S_IN_ERROR) - { - throw new ParseException(getPosition(), - ParseException.ERROR_UNEXPECTED_TOKEN, token); - } - } while (token.type != Yytoken.TYPE_EOF); - } catch (IOException ie) - { - throw ie; - } - - throw new ParseException(getPosition(), - ParseException.ERROR_UNEXPECTED_TOKEN, token); - } - - private void nextToken() throws ParseException, IOException - { - token = lexer.yylex(); - if (token == null) - token = new Yytoken(Yytoken.TYPE_EOF, null); - } - - private Map createObjectContainer(ContainerFactory containerFactory) - { - if (containerFactory == null) - return new JSONObject(); - Map m = containerFactory.createObjectContainer(); - - if (m == null) - return new JSONObject(); - return m; - } - - private List createArrayContainer(ContainerFactory containerFactory) - { - if (containerFactory == null) - return new JSONArray(); - List l = containerFactory.creatArrayContainer(); - - if (l == null) - return new JSONArray(); - return l; - } - - public void parse(String s, ContentHandler contentHandler) - throws ParseException - { - parse(s, contentHandler, false); - } - - public void parse(String s, ContentHandler contentHandler, - boolean isResume) throws ParseException - { - StringReader in = new StringReader(s); - try - { - parse(in, contentHandler, isResume); - } catch (IOException ie) - { - /* - * Actually it will never happen. - */ - throw new ParseException(-1, - ParseException.ERROR_UNEXPECTED_EXCEPTION, ie); - } - } - - public void parse(Reader in, ContentHandler contentHandler) - throws IOException, ParseException - { - parse(in, contentHandler, false); - } - - /** - * Stream processing of JSON text. - * - * @see ContentHandler - * - * @param in - * @param contentHandler - * @param isResume - * - Indicates if it continues previous parsing operation. If set to - * true, resume parsing the old stream, and parameter 'in' will be - * ignored. If this method is called for the first time in this - * instance, isResume will be ignored. - * - * @throws IOException - * @throws ParseException - */ - public void parse(Reader in, ContentHandler contentHandler, - boolean isResume) throws IOException, ParseException - { - if (!isResume) - { - reset(in); - handlerStatusStack = new LinkedList(); - } - else - { - if (handlerStatusStack == null) - { - isResume = false; - reset(in); - handlerStatusStack = new LinkedList(); - } - } - - LinkedList statusStack = handlerStatusStack; - - try - { - do - { - switch (status) - { - case S_INIT: - contentHandler.startJSON(); - nextToken(); - switch (token.type) - { - case Yytoken.TYPE_VALUE: - status = S_IN_FINISHED_VALUE; - statusStack.addFirst(new Integer(status)); - if (!contentHandler.primitive(token.value)) - return; - break; - case Yytoken.TYPE_LEFT_BRACE: - status = S_IN_OBJECT; - statusStack.addFirst(new Integer(status)); - if (!contentHandler.startObject()) - return; - break; - case Yytoken.TYPE_LEFT_SQUARE: - status = S_IN_ARRAY; - statusStack.addFirst(new Integer(status)); - if (!contentHandler.startArray()) - return; - break; - default: - status = S_IN_ERROR; - }// inner switch - break; - - case S_IN_FINISHED_VALUE: - nextToken(); - if (token.type == Yytoken.TYPE_EOF) - { - contentHandler.endJSON(); - status = S_END; - return; - } - else - { - status = S_IN_ERROR; - throw new ParseException(getPosition(), - ParseException.ERROR_UNEXPECTED_TOKEN, token); - } - - case S_IN_OBJECT: - nextToken(); - switch (token.type) - { - case Yytoken.TYPE_COMMA: - break; - case Yytoken.TYPE_VALUE: - if (token.value instanceof String) - { - String key = (String) token.value; - status = S_PASSED_PAIR_KEY; - statusStack.addFirst(new Integer(status)); - if (!contentHandler.startObjectEntry(key)) - return; - } - else - { - status = S_IN_ERROR; - } - break; - case Yytoken.TYPE_RIGHT_BRACE: - if (statusStack.size() > 1) - { - statusStack.removeFirst(); - status = peekStatus(statusStack); - } - else - { - status = S_IN_FINISHED_VALUE; - } - if (!contentHandler.endObject()) - return; - break; - default: - status = S_IN_ERROR; - break; - }// inner switch - break; - - case S_PASSED_PAIR_KEY: - nextToken(); - switch (token.type) - { - case Yytoken.TYPE_COLON: - break; - case Yytoken.TYPE_VALUE: - statusStack.removeFirst(); - status = peekStatus(statusStack); - if (!contentHandler.primitive(token.value)) - return; - if (!contentHandler.endObjectEntry()) - return; - break; - case Yytoken.TYPE_LEFT_SQUARE: - statusStack.removeFirst(); - statusStack.addFirst(new Integer(S_IN_PAIR_VALUE)); - status = S_IN_ARRAY; - statusStack.addFirst(new Integer(status)); - if (!contentHandler.startArray()) - return; - break; - case Yytoken.TYPE_LEFT_BRACE: - statusStack.removeFirst(); - statusStack.addFirst(new Integer(S_IN_PAIR_VALUE)); - status = S_IN_OBJECT; - statusStack.addFirst(new Integer(status)); - if (!contentHandler.startObject()) - return; - break; - default: - status = S_IN_ERROR; - } - break; - - case S_IN_PAIR_VALUE: - /* - * S_IN_PAIR_VALUE is just a marker to indicate the end of an object entry, it doesn't proccess any token, - * therefore delay consuming token until next round. - */ - statusStack.removeFirst(); - status = peekStatus(statusStack); - if (!contentHandler.endObjectEntry()) - return; - break; - - case S_IN_ARRAY: - nextToken(); - switch (token.type) - { - case Yytoken.TYPE_COMMA: - break; - case Yytoken.TYPE_VALUE: - if (!contentHandler.primitive(token.value)) - return; - break; - case Yytoken.TYPE_RIGHT_SQUARE: - if (statusStack.size() > 1) - { - statusStack.removeFirst(); - status = peekStatus(statusStack); - } - else - { - status = S_IN_FINISHED_VALUE; - } - if (!contentHandler.endArray()) - return; - break; - case Yytoken.TYPE_LEFT_BRACE: - status = S_IN_OBJECT; - statusStack.addFirst(new Integer(status)); - if (!contentHandler.startObject()) - return; - break; - case Yytoken.TYPE_LEFT_SQUARE: - status = S_IN_ARRAY; - statusStack.addFirst(new Integer(status)); - if (!contentHandler.startArray()) - return; - break; - default: - status = S_IN_ERROR; - }// inner switch - break; - - case S_END: - return; - - case S_IN_ERROR: - throw new ParseException(getPosition(), - ParseException.ERROR_UNEXPECTED_TOKEN, token); - }// switch - if (status == S_IN_ERROR) - { - throw new ParseException(getPosition(), - ParseException.ERROR_UNEXPECTED_TOKEN, token); - } - } while (token.type != Yytoken.TYPE_EOF); - } catch (IOException ie) - { - status = S_IN_ERROR; - throw ie; - } catch (ParseException pe) - { - status = S_IN_ERROR; - throw pe; - } catch (RuntimeException re) - { - status = S_IN_ERROR; - throw re; - } catch (Error e) - { - status = S_IN_ERROR; - throw e; - } - - status = S_IN_ERROR; - throw new ParseException(getPosition(), - ParseException.ERROR_UNEXPECTED_TOKEN, token); - } -} diff --git a/src2/org/json/simple/parser/ParseException.java b/src2/org/json/simple/parser/ParseException.java deleted file mode 100644 index 09b1fd4..0000000 --- a/src2/org/json/simple/parser/ParseException.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.json.simple.parser; - -/** - * ParseException explains why and where the error occurs in source JSON text. - * - * @author FangYidong - * - */ -public class ParseException extends Exception { - private static final long serialVersionUID = -7880698968187728547L; - - public static final int ERROR_UNEXPECTED_CHAR = 0; - public static final int ERROR_UNEXPECTED_TOKEN = 1; - public static final int ERROR_UNEXPECTED_EXCEPTION = 2; - - private int errorType; - private Object unexpectedObject; - private int position; - - public ParseException(int errorType){ - this(-1, errorType, null); - } - - public ParseException(int errorType, Object unexpectedObject){ - this(-1, errorType, unexpectedObject); - } - - public ParseException(int position, int errorType, Object unexpectedObject){ - this.position = position; - this.errorType = errorType; - this.unexpectedObject = unexpectedObject; - } - - public int getErrorType() { - return errorType; - } - - public void setErrorType(int errorType) { - this.errorType = errorType; - } - - /** - * @see org.json.simple.parser.JSONParser#getPosition() - * - * @return The character position (starting with 0) of the input where the error occurs. - */ - public int getPosition() { - return position; - } - - public void setPosition(int position) { - this.position = position; - } - - /** - * @see org.json.simple.parser.Yytoken - * - * @return One of the following base on the value of errorType: - * ERROR_UNEXPECTED_CHAR java.lang.Character - * ERROR_UNEXPECTED_TOKEN org.json.simple.parser.Yytoken - * ERROR_UNEXPECTED_EXCEPTION java.lang.Exception - */ - public Object getUnexpectedObject() { - return unexpectedObject; - } - - public void setUnexpectedObject(Object unexpectedObject) { - this.unexpectedObject = unexpectedObject; - } - - public String getMessage() { - StringBuffer sb = new StringBuffer(); - - switch(errorType){ - case ERROR_UNEXPECTED_CHAR: - sb.append("Unexpected character (").append(unexpectedObject).append(") at position ").append(position).append("."); - break; - case ERROR_UNEXPECTED_TOKEN: - sb.append("Unexpected token ").append(unexpectedObject).append(" at position ").append(position).append("."); - break; - case ERROR_UNEXPECTED_EXCEPTION: - sb.append("Unexpected exception at position ").append(position).append(": ").append(unexpectedObject); - break; - default: - sb.append("Unkown error at position ").append(position).append("."); - break; - } - return sb.toString(); - } -} diff --git a/src2/org/json/simple/parser/Yylex.java b/src2/org/json/simple/parser/Yylex.java deleted file mode 100644 index 41569d6..0000000 --- a/src2/org/json/simple/parser/Yylex.java +++ /dev/null @@ -1,758 +0,0 @@ -/* The following code was generated by JFlex 1.4.2 */ - -package org.json.simple.parser; - -class Yylex { - - /** This character denotes the end of file */ - public static final int YYEOF = -1; - - /** initial size of the lookahead buffer */ - private static final int ZZ_BUFFERSIZE = 16384; - - /** lexical states */ - public static final int YYINITIAL = 0; - public static final int STRING_BEGIN = 2; - - /** - * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l - * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l - * at the beginning of a line - * l is of the form l = 2*k, k a non negative integer - */ - private static final int ZZ_LEXSTATE[] = { - 0, 0, 1, 1 - }; - - /** - * Translates characters to character classes - */ - private static final String ZZ_CMAP_PACKED = - "\11\0\1\7\1\7\2\0\1\7\22\0\1\7\1\0\1\11\10\0"+ - "\1\6\1\31\1\2\1\4\1\12\12\3\1\32\6\0\4\1\1\5"+ - "\1\1\24\0\1\27\1\10\1\30\3\0\1\22\1\13\2\1\1\21"+ - "\1\14\5\0\1\23\1\0\1\15\3\0\1\16\1\24\1\17\1\20"+ - "\5\0\1\25\1\0\1\26\uff82\0"; - - /** - * Translates characters to character classes - */ - private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - - /** - * Translates DFA states to action switch labels. - */ - private static final int [] ZZ_ACTION = zzUnpackAction(); - - private static final String ZZ_ACTION_PACKED_0 = - "\2\0\2\1\1\2\1\3\1\4\3\1\1\5\1\6"+ - "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\5\0"+ - "\1\14\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+ - "\1\0\1\25\1\0\1\25\4\0\1\26\1\27\2\0"+ - "\1\30"; - - private static int [] zzUnpackAction() { - int [] result = new int[45]; - int offset = 0; - offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAction(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do result[j++] = value; while (--count > 0); - } - return j; - } - - - /** - * Translates a state to a row index in the transition table - */ - private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); - - private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\33\0\66\0\121\0\154\0\207\0\66\0\242"+ - "\0\275\0\330\0\66\0\66\0\66\0\66\0\66\0\66"+ - "\0\363\0\u010e\0\66\0\u0129\0\u0144\0\u015f\0\u017a\0\u0195"+ - "\0\66\0\66\0\66\0\66\0\66\0\66\0\66\0\66"+ - "\0\u01b0\0\u01cb\0\u01e6\0\u01e6\0\u0201\0\u021c\0\u0237\0\u0252"+ - "\0\66\0\66\0\u026d\0\u0288\0\66"; - - private static int [] zzUnpackRowMap() { - int [] result = new int[45]; - int offset = 0; - offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackRowMap(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int high = packed.codePointAt(i++) << 16; - result[j++] = high | packed.codePointAt(i++); - } - return j; - } - - /** - * The transition table of the DFA - */ - private static final int ZZ_TRANS [] = { - 2, 2, 3, 4, 2, 2, 2, 5, 2, 6, - 2, 2, 7, 8, 2, 9, 2, 2, 2, 2, - 2, 10, 11, 12, 13, 14, 15, 16, 16, 16, - 16, 16, 16, 16, 16, 17, 18, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 19, 20, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 20, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 16, 16, 16, 16, 16, 16, 16, - 16, -1, -1, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - -1, -1, -1, -1, -1, -1, -1, -1, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 34, 35, -1, -1, - 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 39, -1, 39, -1, 39, -1, -1, - -1, -1, -1, 39, 39, -1, -1, -1, -1, 39, - 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 33, -1, 20, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 20, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 35, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 38, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 41, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 42, -1, 42, -1, 42, - -1, -1, -1, -1, -1, 42, 42, -1, -1, -1, - -1, 42, 42, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 43, -1, 43, -1, 43, -1, -1, -1, - -1, -1, 43, 43, -1, -1, -1, -1, 43, 43, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, - -1, 44, -1, 44, -1, -1, -1, -1, -1, 44, - 44, -1, -1, -1, -1, 44, 44, -1, -1, -1, - -1, -1, -1, -1, -1, - }; - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - - /** - * ZZ_ATTRIBUTE[aState] contains the attributes of state aState - */ - private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); - - private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\2\0\1\11\3\1\1\11\3\1\6\11\2\1\1\11"+ - "\5\0\10\11\1\0\1\1\1\0\1\1\4\0\2\11"+ - "\2\0\1\11"; - - private static int [] zzUnpackAttribute() { - int [] result = new int[45]; - int offset = 0; - offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAttribute(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do result[j++] = value; while (--count > 0); - } - return j; - } - - /** the input device */ - private java.io.Reader zzReader; - - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** number of newlines encountered up to the start of the matched text */ - private int yyline; - - /** the number of characters up to the start of the matched text */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - - /* user code: */ -private StringBuffer sb=new StringBuffer(); - -int getPosition(){ - return yychar; -} - - - - /** - * Creates a new scanner - * There is also a java.io.InputStream version of this constructor. - * - * @param in the java.io.Reader to read input from. - */ - Yylex(java.io.Reader in) { - this.zzReader = in; - } - - /** - * Creates a new scanner. - * There is also java.io.Reader version of this constructor. - * - * @param in the java.io.Inputstream to read input from. - */ - Yylex(java.io.InputStream in) { - this(new java.io.InputStreamReader(in)); - } - - /** - * Unpacks the compressed character translation table. - * - * @param packed the packed character translation table - * @return the unpacked character translation table - */ - private static char [] zzUnpackCMap(String packed) { - char [] map = new char[0x10000]; - int i = 0; /* index in packed string */ - int j = 0; /* index in unpacked array */ - while (i < 90) { - int count = packed.charAt(i++); - char value = packed.charAt(i++); - do map[j++] = value; while (--count > 0); - } - return map; - } - - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - - /* first: make room (if you can) */ - if (zzStartRead > 0) { - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead-zzStartRead); - - /* translate stored positions */ - zzEndRead-= zzStartRead; - zzCurrentPos-= zzStartRead; - zzMarkedPos-= zzStartRead; - zzStartRead = 0; - } - - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length) { - /* if not: blow it up */ - char newBuffer[] = new char[zzCurrentPos*2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - } - - /* finally: fill the buffer with new input */ - int numRead = zzReader.read(zzBuffer, zzEndRead, - zzBuffer.length-zzEndRead); - - if (numRead > 0) { - zzEndRead+= numRead; - return false; - } - // unlikely but not impossible: read 0 characters, but not at end of stream - if (numRead == 0) { - int c = zzReader.read(); - if (c == -1) { - return true; - } else { - zzBuffer[zzEndRead++] = (char) c; - return false; - } - } - - // numRead < 0 - return true; - } - - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) - zzReader.close(); - } - - - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to ZZ_INITIAL. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead+pos]; - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ - private void zzScanError(int errorCode) { - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - - throw new Error(message); - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ - public void yypushback(int number) { - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - - /** - * Resumes scanning until the next regular expression is matched, the end of - * input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException - * if any I/O-Error occurs - */ - public Yytoken yylex() throws java.io.IOException, ParseException - { - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - char[] zzBufferL = zzBuffer; - char[] zzCMapL = ZZ_CMAP; - - int[] zzTransL = ZZ_TRANS; - int[] zzRowMapL = ZZ_ROWMAP; - int[] zzAttrL = ZZ_ATTRIBUTE; - - while (true) - { - zzMarkedPosL = zzMarkedPos; - - yychar += zzMarkedPosL - zzStartRead; - - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - - zzState = ZZ_LEXSTATE[zzLexicalState]; - - zzForAction: - { - while (true) - { - - if (zzCurrentPosL < zzEndReadL) - zzInput = zzBufferL[zzCurrentPosL++]; - else if (zzAtEOF) - { - zzInput = YYEOF; - break zzForAction; - } - else - { - // store back cached positions - zzCurrentPos = zzCurrentPosL; - zzMarkedPos = zzMarkedPosL; - boolean eof = zzRefill(); - // get translated positions and possibly new buffer - zzCurrentPosL = zzCurrentPos; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - zzEndReadL = zzEndRead; - if (eof) - { - zzInput = YYEOF; - break zzForAction; - } - else - { - zzInput = zzBufferL[zzCurrentPosL++]; - } - } - int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]]; - if (zzNext == -1) - break zzForAction; - zzState = zzNext; - - int zzAttributes = zzAttrL[zzState]; - if ((zzAttributes & 1) == 1) - { - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; - if ((zzAttributes & 8) == 8) - break zzForAction; - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; - switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) - { - case 11: - { - sb.append(yytext()); - } - case 25: - break; - case 4: - { - sb = null; - sb = new StringBuffer(); - yybegin(STRING_BEGIN); - } - case 26: - break; - case 16: - { - sb.append('\b'); - } - case 27: - break; - case 6: - { - return new Yytoken(Yytoken.TYPE_RIGHT_BRACE, null); - } - case 28: - break; - case 23: - { - Boolean val = Boolean.valueOf(yytext()); - return new Yytoken(Yytoken.TYPE_VALUE, val); - } - case 29: - break; - case 22: - { - return new Yytoken(Yytoken.TYPE_VALUE, null); - } - case 30: - break; - case 13: - { - yybegin(YYINITIAL); - return new Yytoken(Yytoken.TYPE_VALUE, sb.toString()); - } - case 31: - break; - case 12: - { - sb.append('\\'); - } - case 32: - break; - case 21: - { - Double val = Double.valueOf(yytext()); - return new Yytoken(Yytoken.TYPE_VALUE, val); - } - case 33: - break; - case 1: - { - throw new ParseException(yychar, - ParseException.ERROR_UNEXPECTED_CHAR, - new Character(yycharat(0))); - } - case 34: - break; - case 8: - { - return new Yytoken(Yytoken.TYPE_RIGHT_SQUARE, null); - } - case 35: - break; - case 19: - { - sb.append('\r'); - } - case 36: - break; - case 15: - { - sb.append('/'); - } - case 37: - break; - case 10: - { - return new Yytoken(Yytoken.TYPE_COLON, null); - } - case 38: - break; - case 14: - { - sb.append('"'); - } - case 39: - break; - case 5: - { - return new Yytoken(Yytoken.TYPE_LEFT_BRACE, null); - } - case 40: - break; - case 17: - { - sb.append('\f'); - } - case 41: - break; - case 24: - { - try - { - int ch = Integer.parseInt(yytext().substring(2), 16); - sb.append((char) ch); - } catch (Exception e) - { - throw new ParseException(yychar, - ParseException.ERROR_UNEXPECTED_EXCEPTION, e); - } - } - case 42: - break; - case 20: - { - sb.append('\t'); - } - case 43: - break; - case 7: - { - return new Yytoken(Yytoken.TYPE_LEFT_SQUARE, null); - } - case 44: - break; - case 2: - { - Long val = Long.valueOf(yytext()); - return new Yytoken(Yytoken.TYPE_VALUE, val); - } - case 45: - break; - case 18: - { - sb.append('\n'); - } - case 46: - break; - case 9: - { - return new Yytoken(Yytoken.TYPE_COMMA, null); - } - case 47: - break; - case 3: - { - } - case 48: - break; - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) - { - zzAtEOF = true; - return null; - } - else - { - zzScanError(ZZ_NO_MATCH); - } - } - } - } - - -} diff --git a/src2/org/json/simple/parser/Yytoken.java b/src2/org/json/simple/parser/Yytoken.java deleted file mode 100644 index 9d7e7e7..0000000 --- a/src2/org/json/simple/parser/Yytoken.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * $Id: Yytoken.java,v 1.1 2006/04/15 14:10:48 platform Exp $ - * Created on 2006-4-15 - */ -package org.json.simple.parser; - -/** - * @author FangYidong - */ -public class Yytoken { - public static final int TYPE_VALUE=0;//JSON primitive value: string,number,boolean,null - public static final int TYPE_LEFT_BRACE=1; - public static final int TYPE_RIGHT_BRACE=2; - public static final int TYPE_LEFT_SQUARE=3; - public static final int TYPE_RIGHT_SQUARE=4; - public static final int TYPE_COMMA=5; - public static final int TYPE_COLON=6; - public static final int TYPE_EOF=-1;//end of file - - public int type=0; - public Object value=null; - - public Yytoken(int type,Object value){ - this.type=type; - this.value=value; - } - - public String toString(){ - StringBuffer sb = new StringBuffer(); - switch(type){ - case TYPE_VALUE: - sb.append("VALUE(").append(value).append(")"); - break; - case TYPE_LEFT_BRACE: - sb.append("LEFT BRACE({)"); - break; - case TYPE_RIGHT_BRACE: - sb.append("RIGHT BRACE(})"); - break; - case TYPE_LEFT_SQUARE: - sb.append("LEFT SQUARE([)"); - break; - case TYPE_RIGHT_SQUARE: - sb.append("RIGHT SQUARE(])"); - break; - case TYPE_COMMA: - sb.append("COMMA(,)"); - break; - case TYPE_COLON: - sb.append("COLON(:)"); - break; - case TYPE_EOF: - sb.append("END OF FILE"); - break; - } - return sb.toString(); - } -}