[med-svn] [phyloviz-core] 12/14: New upstream version 0.0.20111121
Andreas Tille
tille at debian.org
Mon Dec 18 18:57:38 UTC 2017
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository phyloviz-core.
commit e16fb0361a61bfb2ef6458a01c60e4979f51e0e2
Author: Andreas Tille <tille at debian.org>
Date: Mon Dec 18 17:15:44 2017 +0100
New upstream version 0.0.20111121
---
.gitignore | 2 +
arch.xml | 1076 ++++++++++++++++++++
build.xml | 8 +
debian/changelog | 5 -
debian/compat | 1 -
debian/control | 38 -
debian/copyright | 61 --
debian/patches/build_xml.patch | 60 --
debian/patches/series | 1 -
debian/phyloviz-core.jlibs | 1 -
debian/rules | 6 -
debian/source/format | 1 -
debian/upstream/metadata | 12 -
debian/watch | 3 -
manifest.mf | 7 +
nbproject/build-impl.xml | 45 +
nbproject/genfiles.properties | 8 +
nbproject/platform.properties | 21 +
nbproject/private/platform-private.properties | 1 +
nbproject/private/private.xml | 4 +
nbproject/project.properties | 6 +
nbproject/project.xml | 122 +++
nbproject/suite.properties | 1 +
src/net/phyloviz/core/Bundle.properties | 9 +
.../core/DataSetExplorerTopComponentSettings.xml | 12 +
.../core/DataSetExplorerTopComponentWstcref.xml | 11 +
src/net/phyloviz/core/DataSetIcon.png | Bin 0 -> 3405 bytes
src/net/phyloviz/core/DataSetImage.png | Bin 0 -> 11063 bytes
src/net/phyloviz/core/PopulationIcon.png | Bin 0 -> 3498 bytes
src/net/phyloviz/core/PopulationImage.png | Bin 0 -> 10497 bytes
src/net/phyloviz/core/TypingIcon.png | Bin 0 -> 3258 bytes
src/net/phyloviz/core/TypingImage.png | Bin 0 -> 8306 bytes
src/net/phyloviz/core/data/AbstractProfile.java | 133 +++
src/net/phyloviz/core/data/DataItem.java | 89 ++
src/net/phyloviz/core/data/DataModel.java | 140 +++
src/net/phyloviz/core/data/DataSaver.java | 110 ++
src/net/phyloviz/core/data/DataSet.java | 134 +++
src/net/phyloviz/core/data/DataSetTracker.java | 83 ++
src/net/phyloviz/core/data/Isolate.java | 164 +++
src/net/phyloviz/core/data/Population.java | 451 ++++++++
src/net/phyloviz/core/data/Profile.java | 116 +++
src/net/phyloviz/core/data/TypingData.java | 509 +++++++++
src/net/phyloviz/core/explorer/Bundle.properties | 3 +
.../core/explorer/DataSetExplorerTopComponent.form | 18 +
.../core/explorer/DataSetExplorerTopComponent.java | 195 ++++
src/net/phyloviz/core/explorer/DataSetNode.java | 105 ++
.../phyloviz/core/explorer/ExplorerChildren.java | 74 ++
src/net/phyloviz/core/explorer/PopulationNode.java | 92 ++
src/net/phyloviz/core/explorer/TypingDataNode.java | 95 ++
src/net/phyloviz/core/layer.xml | 92 ++
src/net/phyloviz/core/util/NodeFactory.java | 54 +
src/net/phyloviz/core/util/PopulationFactory.java | 85 ++
src/net/phyloviz/core/util/TypingFactory.java | 92 ++
src/net/phyloviz/core/wizard/Bundle.properties | 13 +
.../core/wizard/LoadDataSetVisualPanel1.form | 144 +++
.../core/wizard/LoadDataSetVisualPanel1.html | 11 +
.../core/wizard/LoadDataSetVisualPanel1.java | 208 ++++
.../core/wizard/LoadDataSetVisualPanel2.form | 148 +++
.../core/wizard/LoadDataSetVisualPanel2.html | 21 +
.../core/wizard/LoadDataSetVisualPanel2.java | 175 ++++
.../core/wizard/LoadDataSetVisualPanel3.form | 173 ++++
.../core/wizard/LoadDataSetVisualPanel3.html | 10 +
.../core/wizard/LoadDataSetVisualPanel3.java | 239 +++++
.../core/wizard/LoadDataSetWizardAction.java | 125 +++
.../core/wizard/LoadDataSetWizardPanel1.java | 134 +++
.../core/wizard/LoadDataSetWizardPanel2.java | 128 +++
.../core/wizard/LoadDataSetWizardPanel3.java | 152 +++
67 files changed, 5848 insertions(+), 189 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3197301
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/build/
+/nbproject/private/
\ No newline at end of file
diff --git a/arch.xml b/arch.xml
new file mode 100644
index 0000000..39de493
--- /dev/null
+++ b/arch.xml
@@ -0,0 +1,1076 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE api-answers PUBLIC "-//NetBeans//DTD Arch Answers//EN" "http://hg.netbeans.org/main/raw-file/tip/nbbuild/antsrc/org/netbeans/nbbuild/Arch.dtd" [
+ <!ENTITY api-questions SYSTEM "http://hg.netbeans.org/main/raw-file/tip/nbbuild/antsrc/org/netbeans/nbbuild/Arch-api-questions.xml">
+]>
+
+<api-answers
+ question-version="1.29"
+ author="yourname at netbeans.org"
+>
+
+ &api-questions;
+
+
+<!--
+ <question id="arch-overall" when="init">
+ Describe the overall architecture.
+ <hint>
+ What will be API for
+ <a href="http://openide.netbeans.org/tutorial/api-design.html#design.apiandspi">
+ clients and what support API</a>?
+ What parts will be pluggable?
+ How will plug-ins be registered? Please use <code><api type="export"/></code>
+ to describe your general APIs and specify their
+ <a href="http://openide.netbeans.org/tutorial/api-design.html#category-private">
+ stability categories</a>.
+ If possible please provide simple diagrams.
+ </hint>
+ </question>
+-->
+ <answer id="arch-overall">
+ <p>
+ XXX no answer for arch-overall
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="arch-quality" when="init">
+ How will the <a href="http://www.netbeans.org/community/guidelines/q-evangelism.html">quality</a>
+ of your code be tested and
+ how are future regressions going to be prevented?
+ <hint>
+ What kind of testing do
+ you want to use? How much functionality, in which areas,
+ should be covered by the tests? How you find out that your
+ project was successful?
+ </hint>
+ </question>
+-->
+ <answer id="arch-quality">
+ <p>
+ XXX no answer for arch-quality
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="arch-time" when="init">
+ What are the time estimates of the work?
+ <hint>
+ Please express your estimates of how long the design, implementation,
+ stabilization are likely to last. How many people will be needed to
+ implement this and what is the expected milestone by which the work should be
+ ready?
+ </hint>
+ </question>
+-->
+ <answer id="arch-time">
+ <p>
+ XXX no answer for arch-time
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="arch-usecases" when="init">
+ <hint>
+ Content of this answer will be displayed as part of page at
+ http://www.netbeans.org/download/dev/javadoc/usecases.html
+ You can use tags <usecase name="name> regular html description </usecase>
+ and if you want to use an URL you can prefix if with @TOP@ to begin
+ at the root of your javadoc
+ </hint>
+
+ Describe the main <a href="http://openide.netbeans.org/tutorial/api-design.html#usecase">
+ use cases</a> of the new API. Who will use it under
+ what circumstances? What kind of code would typically need to be written
+ to use the module?
+ </question>
+-->
+ <answer id="arch-usecases">
+ <p>
+ XXX no answer for arch-usecases
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="arch-what" when="init">
+ What is this project good for?
+ <hint>
+ Please provide here a few lines describing the project,
+ what problem it should solve, provide links to documentation,
+ specifications, etc.
+ </hint>
+ </question>
+-->
+ <answer id="arch-what">
+ <p>
+ XXX no answer for arch-what
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="arch-where" when="impl">
+ Where one can find sources for your module?
+ <hint>
+ Please provide link to the Hg web client at
+ http://hg.netbeans.org/
+ or just use tag defaultanswer generate='here'
+ </hint>
+ </question>
+-->
+ <answer id="arch-where">
+ <defaultanswer generate='here' />
+ </answer>
+
+
+
+<!--
+ <question id="compat-deprecation" when="init">
+ How the introduction of your project influences functionality
+ provided by previous version of the product?
+ <hint>
+ If you are planning to deprecate/remove/change any existing APIs,
+ list them here accompanied with the reason explaining why you
+ are doing so.
+ </hint>
+ </question>
+-->
+ <answer id="compat-deprecation">
+ <p>
+ XXX no answer for compat-deprecation
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="compat-i18n" when="impl">
+ Is your module correctly internationalized?
+ <hint>
+ Correct internationalization means that it obeys instructions
+ at <a href="http://www.netbeans.org/download/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/i18n-branding.html">
+ NetBeans I18N pages</a>.
+ </hint>
+ </question>
+-->
+ <answer id="compat-i18n">
+ <p>
+ XXX no answer for compat-i18n
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="compat-standards" when="init">
+ Does the module implement or define any standards? Is the
+ implementation exact or does it deviate somehow?
+ </question>
+-->
+ <answer id="compat-standards">
+ <p>
+ XXX no answer for compat-standards
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="compat-version" when="impl">
+ Can your module coexist with earlier and future
+ versions of itself? Can you correctly read all old settings? Will future
+ versions be able to read your current settings? Can you read
+ or politely ignore settings stored by a future version?
+
+ <hint>
+ Very helpful for reading settings is to store version number
+ there, so future versions can decide whether how to read/convert
+ the settings and older versions can ignore the new ones.
+ </hint>
+ </question>
+-->
+ <answer id="compat-version">
+ <p>
+ XXX no answer for compat-version
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="dep-jre" when="final">
+ Which version of JRE do you need (1.2, 1.3, 1.4, etc.)?
+ <hint>
+ It is expected that if your module runs on 1.x that it will run
+ on 1.x+1 if no, state that please. Also describe here cases where
+ you run different code on different versions of JRE and why.
+ </hint>
+ </question>
+-->
+ <answer id="dep-jre">
+ <p>
+ XXX no answer for dep-jre
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="dep-jrejdk" when="final">
+ Do you require the JDK or is the JRE enough?
+ </question>
+-->
+ <answer id="dep-jrejdk">
+ <p>
+ XXX no answer for dep-jrejdk
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="dep-nb" when="init">
+ What other NetBeans projects and modules does this one depend on?
+ <hint>
+ Depending on other NetBeans projects influnces the ability of
+ users of your work to customize their own branded version of
+ NetBeans by enabling and disabling some modules. Too
+ much dependencies restrict this kind of customization. If that
+ is your case, then you may want to split your functionality into
+ pieces of autoload, eager and regular modules which can be
+ enabled independently. Usually the answer to this question
+ is generated from your <code>project.xml</code> file, but
+ if it is not guessed correctly, you can suppress it by
+ specifying <defaultanswer generate="none"/> and
+ write here your own. Please describe such projects as imported APIs using
+ the <code><api name="identification" type="import or export" category="stable" url="where is the description" /></code>.
+ By doing this information gets listed in the summary page of your
+ javadoc.
+ </hint>
+ </question>
+-->
+ <answer id="dep-nb">
+ <defaultanswer generate='here' />
+ </answer>
+
+
+
+<!--
+ <question id="dep-non-nb" when="init">
+ What other projects outside NetBeans does this one depend on?
+
+ <hint>
+ Depending on 3rd party libraries is always problematic,
+ especially if they are not open source, as that complicates
+ the licensing scheme of NetBeans. Please enumerate your
+ external dependencies here, so it is correctly understood since
+ the begining what are the legal implications of your project.
+ Also please note that
+ some non-NetBeans projects are packaged as NetBeans modules
+ (see <a href="http://libs.netbeans.org/">libraries</a>) and
+ it is preferred to use this approach when more modules may
+ depend and share such third-party libraries.
+ </hint>
+ </question>
+-->
+ <answer id="dep-non-nb">
+ <p>
+ XXX no answer for dep-non-nb
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="dep-platform" when="init">
+ On which platforms does your module run? Does it run in the same
+ way on each?
+ <hint>
+ If you plan any dependency on OS or any usage of native code,
+ please describe why you are doing so and describe how you envision
+ to enforce the portability of your code.
+ Please note that there is a support for <a href="http://www.netbeans.org/download/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html#how-os-specific">OS conditionally
+ enabled modules</a> which together with autoload/eager modules
+ can allow you to enable to provide the best OS aware support
+ on certain OSes while providing compatibility bridge on the not
+ supported ones.
+ Also please list the supported
+ OSes/HW platforms and mentioned the lovest version of JDK required
+ for your project to run on. Also state whether JRE is enough or
+ you really need JDK.
+ </hint>
+ </question>
+-->
+ <answer id="dep-platform">
+ <p>
+ XXX no answer for dep-platform
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="deploy-dependencies" when="final">
+ What do other modules need to do to declare a dependency on this one,
+ in addition to or instead of the normal module dependency declaration
+ (e.g. tokens to require)?
+ <hint>
+ Provide a sample of the actual lines you would add to a module manifest
+ to declare a dependency, for example OpenIDE-Module-Requires: some.token.
+ If other modules should not depend on this module, or should just use a
+ simple regular module dependency, you can just answer "nothing". If you
+ intentionally expose a semistable API to clients using implementation
+ dependencies, you should mention that here (but there is no need to give
+ an example of usage).
+ </hint>
+ </question>
+-->
+ <answer id="deploy-dependencies">
+ <p>
+ XXX no answer for deploy-dependencies
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="deploy-jar" when="impl">
+ Do you deploy just module JAR file(s) or other files as well?
+ <hint>
+ Usually a module consist of one JAR file (perhaps with Class-Path
+ extensions) and also a configuration file that enables it. If you
+ have any other files, use
+ <api group="java.io.File" name="yourname" type="export" category="friend">...</api>
+ to define the location, name and stability of your files (of course
+ changing "yourname" and "friend" to suit your needs).
+
+ If it uses more than one JAR, describe where they are located, how
+ they refer to each other.
+ If it consist of module JAR(s) and other files, please describe
+ what is their purpose, why other files are necessary. Please
+ make sure that installation/uninstallation leaves the system
+ in state as it was before installation.
+ </hint>
+ </question>
+-->
+ <answer id="deploy-jar">
+ <p>
+ XXX no answer for deploy-jar
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="deploy-nbm" when="impl">
+ Can you deploy an NBM via the Update Center?
+ <hint>
+ If not why?
+ </hint>
+ </question>
+-->
+ <answer id="deploy-nbm">
+ <p>
+ XXX no answer for deploy-nbm
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="deploy-packages" when="init">
+ Are packages of your module made inaccessible by not declaring them
+ public?
+
+ <hint>
+ By default NetBeans build harness treats all packages are private.
+ If you export some of them - either as public or friend packages,
+ you should have a reason. If the reason is described elsewhere
+ in this document, you can ignore this question.
+ </hint>
+ </question>
+-->
+ <answer id="deploy-packages">
+ <p>
+ XXX no answer for deploy-packages
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="deploy-shared" when="final">
+ Do you need to be installed in the shared location only, or in the user directory only,
+ or can your module be installed anywhere?
+ <hint>
+ Installation location shall not matter, if it does explain why.
+ Consider also whether <code>InstalledFileLocator</code> can help.
+ </hint>
+ </question>
+-->
+ <answer id="deploy-shared">
+ <p>
+ XXX no answer for deploy-shared
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-ant-tasks" when="impl">
+ Do you define or register any ant tasks that other can use?
+
+ <hint>
+ If you provide an ant task that users can use, you need to be very
+ careful about its syntax and behaviour, as it most likely forms an
+ API for end users and as there is a lot of end users, their reaction
+ when such API gets broken can be pretty strong.
+ </hint>
+ </question>
+-->
+ <answer id="exec-ant-tasks">
+ <p>
+ XXX no answer for exec-ant-tasks
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-classloader" when="impl">
+ Does your code create its own class loader(s)?
+ <hint>
+ A bit unusual. Please explain why and what for.
+ </hint>
+ </question>
+-->
+ <answer id="exec-classloader">
+ <p>
+ XXX no answer for exec-classloader
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-component" when="impl">
+ Is execution of your code influenced by any (string) property
+ of any of your components?
+
+ <hint>
+ Often <code>JComponent.getClientProperty</code>, <code>Action.getValue</code>
+ or <code>PropertyDescriptor.getValue</code>, etc. are used to influence
+ a behavior of some code. This of course forms an interface that should
+ be documented. Also if one depends on some interface that an object
+ implements (<code>component instanceof Runnable</code>) that forms an
+ API as well.
+ </hint>
+ </question>
+-->
+ <answer id="exec-component">
+ <p>
+ XXX no answer for exec-component
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-introspection" when="impl">
+ Does your module use any kind of runtime type information (<code>instanceof</code>,
+ work with <code>java.lang.Class</code>, etc.)?
+ <hint>
+ Check for cases when you have an object of type A and you also
+ expect it to (possibly) be of type B and do some special action. That
+ should be documented. The same applies on operations in meta-level
+ (Class.isInstance(...), Class.isAssignableFrom(...), etc.).
+ </hint>
+ </question>
+-->
+ <answer id="exec-introspection">
+ <p>
+ XXX no answer for exec-introspection
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-privateaccess" when="final">
+ Are you aware of any other parts of the system calling some of
+ your methods by reflection?
+ <hint>
+ If so, describe the "contract" as an API. Likely private or friend one, but
+ still API and consider rewrite of it.
+ </hint>
+ </question>
+-->
+ <answer id="exec-privateaccess">
+ <p>
+ XXX no answer for exec-privateaccess
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-process" when="impl">
+ Do you execute an external process from your module? How do you ensure
+ that the result is the same on different platforms? Do you parse output?
+ Do you depend on result code?
+ <hint>
+ If you feed an input, parse the output please declare that as an API.
+ </hint>
+ </question>
+-->
+ <answer id="exec-process">
+ <p>
+ XXX no answer for exec-process
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-property" when="impl">
+ Is execution of your code influenced by any environment or
+ Java system (<code>System.getProperty</code>) property?
+ On a similar note, is there something interesting that you
+ pass to <code>java.util.logging.Logger</code>? Or do you observe
+ what others log?
+ <hint>
+ If there is a property that can change the behavior of your
+ code, somebody will likely use it. You should describe what it does
+ and the <a href="http://openide.netbeans.org/tutorial/api-design.html#life">stability category</a>
+ of this API. You may use
+ <pre>
+ <api type="export" group="property" name="id" category="private" url="http://...">
+ description of the property, where it is used, what it influence, etc.
+ </api>
+ </pre>
+ </hint>
+ </question>
+-->
+ <answer id="exec-property">
+ <p>
+ XXX no answer for exec-property
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-reflection" when="impl">
+ Does your code use Java Reflection to execute other code?
+ <hint>
+ This usually indicates a missing or insufficient API in the other
+ part of the system. If the other side is not aware of your dependency
+ this contract can be easily broken.
+ </hint>
+ </question>
+-->
+ <answer id="exec-reflection">
+ <p>
+ XXX no answer for exec-reflection
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="exec-threading" when="init">
+ What threading models, if any, does your module adhere to? How the
+ project behaves with respect to threading?
+ <hint>
+ Is your API threadsafe? Can it be accessed from any threads or
+ just from some dedicated ones? Any special relation to AWT and
+ its Event Dispatch thread? Also
+ if your module calls foreign APIs which have a specific threading model,
+ indicate how you comply with the requirements for multithreaded access
+ (synchronization, mutexes, etc.) applicable to those APIs.
+ If your module defines any APIs, or has complex internal structures
+ that might be used from multiple threads, declare how you protect
+ data against concurrent access, race conditions, deadlocks, etc.,
+ and whether such rules are enforced by runtime warnings, errors, assertions, etc.
+ Examples: a class might be non-thread-safe (like Java Collections); might
+ be fully thread-safe (internal locking); might require access through a mutex
+ (and may or may not automatically acquire that mutex on behalf of a client method);
+ might be able to run only in the event queue; etc.
+ Also describe when any events are fired: synchronously, asynchronously, etc.
+ Ideas: <a href="http://core.netbeans.org/proposals/threading/index.html#recommendations">Threading Recommendations</a> (in progress)
+ </hint>
+ </question>
+-->
+ <answer id="exec-threading">
+ <p>
+ XXX no answer for exec-threading
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="format-clipboard" when="impl">
+ Which data flavors (if any) does your code read from or insert to
+ the clipboard (by access to clipboard on means calling methods on <code>java.awt.datatransfer.Transferable</code>?
+
+ <hint>
+ Often Node's deal with clipboard by usage of <code>Node.clipboardCopy, Node.clipboardCut and Node.pasteTypes</code>.
+ Check your code for overriding these methods.
+ </hint>
+ </question>
+-->
+ <answer id="format-clipboard">
+ <p>
+ XXX no answer for format-clipboard
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="format-dnd" when="impl">
+ Which protocols (if any) does your code understand during Drag & Drop?
+ <hint>
+ Often Node's deal with clipboard by usage of <code>Node.drag, Node.getDropType</code>.
+ Check your code for overriding these methods. Btw. if they are not overridden, they
+ by default delegate to <code>Node.clipboardCopy, Node.clipboardCut and Node.pasteTypes</code>.
+ </hint>
+ </question>
+-->
+ <answer id="format-dnd">
+ <p>
+ XXX no answer for format-dnd
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="format-types" when="impl">
+ Which protocols and file formats (if any) does your module read or write on disk,
+ or transmit or receive over the network? Do you generate an ant build script?
+ Can it be edited and modified?
+
+ <hint>
+ <p>
+ Files can be read and written by other programs, modules and users. If they influence
+ your behaviour, make sure you either document the format or claim that it is a private
+ api (using the <api> tag).
+ </p>
+
+ <p>
+ If you generate an ant build file, this is very likely going to be seen by end users and
+ they will be attempted to edit it. You should be ready for that and provide here a link
+ to documentation that you have for such purposes and also describe how you are going to
+ understand such files during next release, when you (very likely) slightly change the
+ format.
+ </p>
+ </hint>
+ </question>
+-->
+ <answer id="format-types">
+ <p>
+ XXX no answer for format-types
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="lookup-lookup" when="init">
+ Does your module use <code>org.openide.util.Lookup</code>
+ or any similar technology to find any components to communicate with? Which ones?
+
+ <hint>
+ NetBeans is build around a generic registry of services called
+ lookup. It is preferable to use it for registration and discovery
+ if possible. See
+ <a href="http://www.netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/lookup/doc-files/index.html">
+ The Solution to Comunication Between Components
+ </a>. If you do not plan to use lookup and insist usage
+ of other solution, then please describe why it is not working for
+ you.
+ <br/>
+ When filling the final version of your arch document, please
+ describe the interfaces you are searching for, where
+ are defined, whether you are searching for just one or more of them,
+ if the order is important, etc. Also classify the stability of such
+ API contract. Use <api group=&lookup& /> tag, so
+ your information gets listed in the summary page of your javadoc.
+ </hint>
+ </question>
+-->
+ <answer id="lookup-lookup">
+ <p>
+ XXX no answer for lookup-lookup
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="lookup-register" when="final">
+ Do you register anything into lookup for other code to find?
+ <hint>
+ Do you register using layer file or using a declarative annotation such as <code>@ServiceProvider</code>?
+ Who is supposed to find your component?
+ </hint>
+ </question>
+-->
+ <answer id="lookup-register">
+ <p>
+ XXX no answer for lookup-register
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="lookup-remove" when="final">
+ Do you remove entries of other modules from lookup?
+ <hint>
+ Why? Of course, that is possible, but it can be dangerous. Is the module
+ your are masking resource from aware of what you are doing?
+ </hint>
+ </question>
+-->
+ <answer id="lookup-remove">
+ <p>
+ XXX no answer for lookup-remove
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-exit" when="final">
+ Does your module run any code on exit?
+ </question>
+-->
+ <answer id="perf-exit">
+ <p>
+ XXX no answer for perf-exit
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-huge_dialogs" when="final">
+ Does your module contain any dialogs or wizards with a large number of
+ GUI controls such as combo boxes, lists, trees, or text areas?
+ </question>
+-->
+ <answer id="perf-huge_dialogs">
+ <p>
+ XXX no answer for perf-huge_dialogs
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-limit" when="init">
+ Are there any hard-coded or practical limits in the number or size of
+ elements your code can handle?
+ <hint>
+ Most of algorithms have increasing memory and speed complexity
+ with respect to size of data they operate on. What is the critical
+ part of your project that can be seen as a bottleneck with
+ respect to speed or required memory? What are the practical
+ sizes of data you tested your project with? What is your estimate
+ of potential size of data that would cause visible performance
+ problems? Is there some kind of check to detect such situation
+ and prevent "hard" crashes - for example the CloneableEditorSupport
+ checks for size of a file to be opened in editor
+ and if it is larger than 1Mb it shows a dialog giving the
+ user the right to decide - e.g. to cancel or commit suicide.
+ </hint>
+ </question>
+-->
+ <answer id="perf-limit">
+ <p>
+ XXX no answer for perf-limit
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-mem" when="final">
+ How much memory does your component consume? Estimate
+ with a relation to the number of windows, etc.
+ </question>
+-->
+ <answer id="perf-mem">
+ <p>
+ XXX no answer for perf-mem
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-menus" when="final">
+ Does your module use dynamically updated context menus, or
+ context-sensitive actions with complicated and slow enablement logic?
+ <hint>
+ If you do a lot of tricks when adding actions to regular or context menus, you can significantly
+ slow down display of the menu, even when the user is not using your action. Pay attention to
+ actions you add to the main menu bar, and to context menus of foreign nodes or components. If
+ the action is conditionally enabled, or changes its display dynamically, you need to check the
+ impact on performance. In some cases it may be more appropriate to make a simple action that is
+ always enabled but does more detailed checks in a dialog if it is actually run.
+ </hint>
+ </question>
+-->
+ <answer id="perf-menus">
+ <p>
+ XXX no answer for perf-menus
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-progress" when="final">
+ Does your module execute any long-running tasks?
+
+ <hint>Long running tasks should never block
+ AWT thread as it badly hurts the UI
+ <a href="http://performance.netbeans.org/responsiveness/issues.html">
+ responsiveness</a>.
+ Tasks like connecting over
+ network, computing huge amount of data, compilation
+ be done asynchronously (for example
+ using <code>RequestProcessor</code>), definitively it should
+ not block AWT thread.
+ </hint>
+ </question>
+-->
+ <answer id="perf-progress">
+ <p>
+ XXX no answer for perf-progress
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-scale" when="init">
+ Which external criteria influence the performance of your
+ program (size of file in editor, number of files in menu,
+ in source directory, etc.) and how well your code scales?
+ <hint>
+ Please include some estimates, there are other more detailed
+ questions to answer in later phases of implementation.
+ </hint>
+ </question>
+-->
+ <answer id="perf-scale">
+ <p>
+ XXX no answer for perf-scale
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-spi" when="init">
+ How the performance of the plugged in code will be enforced?
+ <hint>
+ If you allow foreign code to be plugged into your own module, how
+ do you enforce that it will behave correctly and quickly and will not
+ negatively influence the performance of your own module?
+ </hint>
+ </question>
+-->
+ <answer id="perf-spi">
+ <p>
+ XXX no answer for perf-spi
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-startup" when="final">
+ Does your module run any code on startup?
+ </question>
+-->
+ <answer id="perf-startup">
+ <p>
+ XXX no answer for perf-startup
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="perf-wakeup" when="final">
+ Does any piece of your code wake up periodically and do something
+ even when the system is otherwise idle (no user interaction)?
+ </question>
+-->
+ <answer id="perf-wakeup">
+ <p>
+ XXX no answer for perf-wakeup
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="resources-file" when="final">
+ Does your module use <code>java.io.File</code> directly?
+
+ <hint>
+ NetBeans provide a logical wrapper over plain files called
+ <code>org.openide.filesystems.FileObject</code> that
+ provides uniform access to such resources and is the preferred
+ way that should be used. But of course there can be situations when
+ this is not suitable.
+ </hint>
+ </question>
+-->
+ <answer id="resources-file">
+ <p>
+ XXX no answer for resources-file
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="resources-layer" when="final">
+ Does your module provide own layer? Does it create any files or
+ folders in it? What it is trying to communicate by that and with which
+ components?
+
+ <hint>
+ NetBeans allows automatic and declarative installation of resources
+ by module layers. Module register files into appropriate places
+ and other components use that information to perform their task
+ (build menu, toolbar, window layout, list of templates, set of
+ options, etc.).
+ </hint>
+ </question>
+-->
+ <answer id="resources-layer">
+ <p>
+ XXX no answer for resources-layer
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="resources-mask" when="final">
+ Does your module mask/hide/override any resources provided by other modules in
+ their layers?
+
+ <hint>
+ If you mask a file provided by another module, you probably depend
+ on that and do not want the other module to (for example) change
+ the file's name. That module shall thus make that file available as an API
+ of some stability category.
+ </hint>
+ </question>
+-->
+ <answer id="resources-mask">
+ <p>
+ XXX no answer for resources-mask
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="resources-preferences" when="final">
+ Does your module uses preferences via Preferences API? Does your module use NbPreferences or
+ or regular JDK Preferences ? Does it read, write or both ?
+ Does it share preferences with other modules ? If so, then why ?
+ <hint>
+ You may use
+ <api type="export" group="preferences"
+ name="preference node name" category="private">
+ description of individual keys, where it is used, what it
+ influences, whether the module reads/write it, etc.
+ </api>
+ Due to XML ID restrictions, rather than /org/netbeans/modules/foo give the "name" as org.netbeans.modules.foo.
+ Note that if you use NbPreferences this name will then be the same as the code name base of the module.
+ </hint>
+ </question>
+-->
+ <answer id="resources-preferences">
+ <p>
+ XXX no answer for resources-preferences
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="resources-read" when="final">
+ Does your module read any resources from layers? For what purpose?
+
+ <hint>
+ As this is some kind of intermodule dependency, it is a kind of API.
+ Please describe it and classify according to
+ <a href="http://openide.netbeans.org/tutorial/api-design.html#categories">
+ common stability categories</a>.
+ </hint>
+ </question>
+-->
+ <answer id="resources-read">
+ <p>
+ XXX no answer for resources-read
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="security-grant" when="final">
+ Does your code grant additional rights to some other code?
+ <hint>Avoid using a class loader that adds extra
+ permissions to loaded code unless really necessary.
+ Also note that your API implementation
+ can also expose unneeded permissions to enemy code by
+ calling AccessController.doPrivileged().</hint>
+ </question>
+-->
+ <answer id="security-grant">
+ <p>
+ XXX no answer for security-grant
+ </p>
+ </answer>
+
+
+
+<!--
+ <question id="security-policy" when="final">
+ Does your functionality require modifications to the standard policy file?
+ <hint>Your code might pass control to third-party code not
+ coming from trusted domains. This could be code downloaded over the
+ network or code coming from libraries that are not bundled
+ with NetBeans. Which permissions need to be granted to which domains?</hint>
+ </question>
+-->
+ <answer id="security-policy">
+ <p>
+ XXX no answer for security-policy
+ </p>
+ </answer>
+
+</api-answers>
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..6148b95
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="net.phyloviz.core" default="netbeans" basedir=".">
+ <description>Builds, tests, and runs the project net.phyloviz.core.</description>
+ <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index afb4d66..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,5 +0,0 @@
-phyloviz-core (0.0.20111121-1) UNRELEASED; urgency=low
-
- * Initial release (Closes: #<bug>)
-
- -- Andreas Tille <tille at debian.org> Wed, 07 Nov 2012 12:07:35 +0100
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index f599e28..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-10
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 89bd0d8..0000000
--- a/debian/control
+++ /dev/null
@@ -1,38 +0,0 @@
-Source: phyloviz-core
-Maintainer: Debian Med Packaging Team <debian-med-packaging at lists.alioth.debian.org>
-Uploaders: Andreas Tille <tille at debian.org>
-Section: science
-Priority: optional
-Build-Depends: debhelper (>= 10),
- javahelper,
- default-jdk,
- ant,
- libnb-platform13-java
-Standards-Version: 3.9.8
-Vcs-Browser: http://anonscm.debian.org/viewvc/debian-med/trunk/packages/phyloviz/phyloviz-core/trunk/
-Vcs-Svn: svn://anonscm.debian.org/debian-med/trunk/packages/phyloviz/phyloviz-core/trunk/
-Homepage: http://www.phyloviz.net
-
-Package: phyloviz-core
-Architecture: all
-Depends: ${misc:Depends},
- ${java:Depends}
-Description: phylogenetic inference and data visualization for sequence based typing methods
- Phyloviz allows the analysis of sequence-based typing methods that
- generate allelic profiles and their associated epidemiological data.
- .
- For representing the possible evolutionary relationships between
- strains identified by allelic profiles it uses the goeBURST algorithm, a
- refinement of eBURST algorithm proposed by Feil et al., and its
- expansion to generate a complete minimum spanning tree (MST).
- .
- Phyloviz is being developed in a modular way to allow its expansion
- with novel data analysis algorithms and new visualization modules.
- .
- Capabilities
- * Modularity allows the creation of plugins to analyse different types of data
- * Allows the visualization of data overlaid onto goeBURST and MST results
- * Confidence assessment of each link in the graph
- * Query the data and see the query results directly onto the graphs
- * Search your data set using regular expressions to select what to display
- * Export the results as images in various formats: eps, png, gif, pdf, etc
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 51a4831..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,61 +0,0 @@
-Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: PHYLOViZ Core
-Upstream-Contact: PHYLOViZ Team <phyloviz at gmail.com>
-Source: https://bitbucket.org/phyloviz/phyloviz-main/src
-
-Files: *
-Copyright: © 2011, PHYLOViZ Team <phyloviz at gmail.com>
-License: GPL-3
-
-Files: *.java
-Copyright: © 2011, PHYLOViZ Team <phyloviz at gmail.com>
-License: GPL-3-classpath-exception
- 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.
- .
- On Debian systems you can find a copy of the GNU General Public License
- version 3 at /usr/share/common-licenses/GPL-3
- .
- The *.java source files distributed by the PHYLOViZ Team are under the
- terms of the GNU General Public License Version 3 with the following
- clarification and special exception:
- .
- Linking this library statically or dynamically with other modules is
- making a combined work based on this library. Thus, the terms and
- conditions of the GNU General Public License cover the whole combination.
- .
- As a special exception, the copyright holders of this library give you
- permission to link this library with independent modules to produce an
- executable, regardless of the license terms of these independent modules,
- and to copy and distribute the resulting executable under terms of your
- choice, provided that you also meet, for each linked independent module,
- the terms and conditions of the license of that module. An independent
- module is a module which is not derived from or based on this library.
- If you modify this library, you may extend this exception to your version
- of the library, but you are not obligated to do so. If you do not wish
- to do so, delete this exception statement from your version.
-
-Files: debian/*
-Copyright: © 2012 Andreas Tille <tille at debian.org>
-License: GPL-3
-
-License: GPL-3
- 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.
- .
- On Debian systems you can find a copy of the GNU General Public License
- version 3 at /usr/share/common-licenses/GPL-3
diff --git a/debian/patches/build_xml.patch b/debian/patches/build_xml.patch
deleted file mode 100644
index 0659f9c..0000000
--- a/debian/patches/build_xml.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-Author: Olivier Sallou <olivier.sallou at irisa.fr>
-Date: Wed, 21 Nov 2012 18:37:47 +0100
-Description: build.xml without depending from netbeans magic
-
---- net-phyloviz-core.orig/build.xml
-+++ net-phyloviz-core/build.xml
-@@ -2,7 +2,51 @@
- <!-- You may freely edit this file. See harness/README in the NetBeans platform -->
- <!-- for some information on what you could do (e.g. targets to override). -->
- <!-- If you delete this file and reopen the project it will be recreated. -->
--<project name="net.phyloviz.core" default="netbeans" basedir=".">
-+<project name="net.phyloviz.core" default="jar" basedir=".">
- <description>Builds, tests, and runs the project net.phyloviz.core.</description>
-- <import file="nbproject/build-impl.xml"/>
-+
-+ <property name="project.jarfile.name" value="phyloviz-core.jar"/>
-+ <property name="build.dir" location="build"/>
-+ <property name="class.dir" location="${build.dir}/classes"/>
-+ <property name="src.dir" location="src"/>
-+ <property name="dist.dir" location="dist"/>
-+ <property name="class.path" value="/usr/share/netbeans/platform13/modules/org-openide-dialogs.jar /usr/share/netbeans/platform13/core/org-openide-filesystems.jar /usr/share/netbeans/platform13/modules/org-openide-awt.jar /usr/share/netbeans/platform13/lib/org-openide-util.jar /usr/share/netbeans/platform13/lib/org-openide-util-lookup.jar /usr/share/netbeans/platform13/modules/org-openide-nodes.jar /usr/share/netbeans/platform13/modules/org-openide-windows.jar /usr/share/netbeans/pla [...]
-+
-+ <path id="compile.classpath">
-+ <pathelement location="/usr/share/netbeans/platform13/modules/org-openide-dialogs.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/core/org-openide-filesystems.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/modules/org-openide-awt.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/lib/org-openide-util.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/lib/org-openide-util-lookup.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/modules/org-openide-nodes.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/modules/org-openide-explorer.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/modules/org-openide-windows.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/modules/org-openide-actions.jar"/>
-+ <pathelement location="/usr/share/netbeans/platform13/modules/org-netbeans-modules-settings.jar"/>
-+ </path>
-+
-+ <target name="clean">
-+ <echo>Cleaning build directories</echo>
-+ <delete failonerror="false" verbose="true" includeEmptyDirs="true">
-+ <fileset dir="${build.dir}" includes="**"/>
-+ <fileset dir="${dist.dir}" includes="**"/>
-+ </delete>
-+ </target>
-+
-+ <target name="compile" depends="clean">
-+ <mkdir dir="${class.dir}"/>
-+ <mkdir dir="${dist.dir}"/>
-+ <javac classpathref="compile.classpath" srcdir="${src.dir}" destdir="${class.dir}" source="1.5">
-+ </javac>
-+ </target>
-+
-+ <target name="jar" depends="compile">
-+ <jar destfile="${dist.dir}/${project.jarfile.name}" basedir="${class.dir}" >
-+ <manifest>
-+ <attribute name="Built-By" value="${user.name}"/>
-+ <attribute name="Class-Path" value="${class.path}"/>
-+ </manifest>
-+ </jar>
-+ </target>
-+
- </project>
diff --git a/debian/patches/series b/debian/patches/series
deleted file mode 100644
index 46a7f4e..0000000
--- a/debian/patches/series
+++ /dev/null
@@ -1 +0,0 @@
-build_xml.patch
diff --git a/debian/phyloviz-core.jlibs b/debian/phyloviz-core.jlibs
deleted file mode 100644
index 0288912..0000000
--- a/debian/phyloviz-core.jlibs
+++ /dev/null
@@ -1 +0,0 @@
-dist/phyloviz-core.jar
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 59f50fc..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/make -f
-
-# DH_VERBOSE := 1
-
-%:
- dh $@ --with javahelper
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 163aaf8..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/debian/upstream/metadata b/debian/upstream/metadata
deleted file mode 100644
index 4862ece..0000000
--- a/debian/upstream/metadata
+++ /dev/null
@@ -1,12 +0,0 @@
-Reference:
- Author: Alexandre P Francisco and Cátia Vaz and Pedro T Monteiro and José Melo-Cristino and Mário Ramirez and João A Carriço
- Title: "PHYLOViZ: phylogenetic inference and data visualization for sequence based typing methods"
- Journal: BMC Bioinformatics
- Year: 2012
- Volume: 13
- Number: 1
- Pages: 87
- DOI: 10.1186/1471-2105-13-87
- PMID: 22568821
- URL: http://www.biomedcentral.com/1471-2105/13/87/abstract
- eprint: http://www.biomedcentral.com/content/pdf/1471-2105-13-87.pdf
diff --git a/debian/watch b/debian/watch
deleted file mode 100644
index 67e4f6e..0000000
--- a/debian/watch
+++ /dev/null
@@ -1,3 +0,0 @@
-version=4
-
-https://bitbucket.org/phyloviz/phyloviz-main/downloads?tab=tags .*/(\d\S*)\.tar\.gz
diff --git a/manifest.mf b/manifest.mf
new file mode 100644
index 0000000..9170c10
--- /dev/null
+++ b/manifest.mf
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+OpenIDE-Module: net.phyloviz.core/1
+OpenIDE-Module-Implementation-Version: 0
+OpenIDE-Module-Layer: net/phyloviz/core/layer.xml
+OpenIDE-Module-Localizing-Bundle: net/phyloviz/core/Bundle.properties
+OpenIDE-Module-Requires: org.openide.windows.WindowManager
+
diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml
new file mode 100644
index 0000000..b3657be
--- /dev/null
+++ b/nbproject/build-impl.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+-->
+<project name="net.phyloviz.core-impl" basedir="..">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <property file="nbproject/private/suite-private.properties"/>
+ <property file="nbproject/suite.properties"/>
+ <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+ <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+ <property file="${suite.dir}/nbproject/platform.properties"/>
+ <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
+ <attribute name="property"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{property}" value="@{value}"/>
+ </sequential>
+ </macrodef>
+ <property file="${user.properties.file}"/>
+ <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+ <fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
+ <condition>
+ <not>
+ <contains string="${cluster.path.evaluated}" substring="platform"/>
+ </not>
+ </condition>
+ </fail>
+ <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties
new file mode 100644
index 0000000..dc071a1
--- /dev/null
+++ b/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=fb01bea2
+build.xml.script.CRC32=52cce0f2
+build.xml.stylesheet.CRC32=a56c6a5b at 1.42.2
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=fb01bea2
+nbproject/build-impl.xml.script.CRC32=7615d751
+nbproject/build-impl.xml.stylesheet.CRC32=238281d1 at 1.42.2
diff --git a/nbproject/platform.properties b/nbproject/platform.properties
new file mode 100644
index 0000000..d3920a2
--- /dev/null
+++ b/nbproject/platform.properties
@@ -0,0 +1,21 @@
+cluster.path=\
+ ${nbplatform.active.dir}/platform
+disabled.modules=\
+ org.jdesktop.layout,\
+ org.netbeans.api.visual,\
+ org.netbeans.core.execution,\
+ org.netbeans.core.multiview,\
+ org.netbeans.libs.jsr223,\
+ org.netbeans.libs.junit4,\
+ org.netbeans.modules.autoupdate.services,\
+ org.netbeans.modules.autoupdate.ui,\
+ org.netbeans.modules.core.kit,\
+ org.netbeans.modules.editor.mimelookup.impl,\
+ org.netbeans.modules.favorites,\
+ org.netbeans.modules.masterfs,\
+ org.netbeans.modules.print,\
+ org.openide.compat,\
+ org.openide.execution,\
+ org.openide.options,\
+ org.openide.util.enumerations
+nbplatform.active=default
diff --git a/nbproject/private/platform-private.properties b/nbproject/private/platform-private.properties
new file mode 100644
index 0000000..efc2b62
--- /dev/null
+++ b/nbproject/private/platform-private.properties
@@ -0,0 +1 @@
+user.properties.file=/home/aplf/.netbeans/6.9/build.properties
diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml
new file mode 100644
index 0000000..c1f155a
--- /dev/null
+++ b/nbproject/private/private.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+ <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
+</project-private>
diff --git a/nbproject/project.properties b/nbproject/project.properties
new file mode 100644
index 0000000..2b8c9ef
--- /dev/null
+++ b/nbproject/project.properties
@@ -0,0 +1,6 @@
+javac.source=1.6
+javac.compilerargs=-Xlint -Xlint:-serial
+license.file=../../PHYLOViZ/COPYING.LIB
+nbm.homepage=http://www.phyloviz.net/
+nbm.module.author=PHYLOViZ Team
+spec.version.base=1.4
diff --git a/nbproject/project.xml b/nbproject/project.xml
new file mode 100644
index 0000000..715baf1
--- /dev/null
+++ b/nbproject/project.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.apisupport.project</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+ <code-name-base>net.phyloviz.core</code-name-base>
+ <suite-component/>
+ <module-dependencies>
+ <dependency>
+ <code-name-base>org.netbeans.modules.autoupdate.services</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>1.20.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.netbeans.modules.settings</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>1</release-version>
+ <specification-version>1.26.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.actions</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.16.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.awt</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.23.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.dialogs</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.15.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.explorer</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.28.2</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.filesystems</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.38.2</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.loaders</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.16.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.nodes</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>7.16.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>8.6.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.util.lookup</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>8.3.1</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
+ <code-name-base>org.openide.windows</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <specification-version>6.33.1</specification-version>
+ </run-dependency>
+ </dependency>
+ </module-dependencies>
+ <test-dependencies>
+ <test-type>
+ <name>unit</name>
+ <test-dependency>
+ <code-name-base>org.netbeans.libs.junit4</code-name-base>
+ <compile-dependency/>
+ </test-dependency>
+ </test-type>
+ </test-dependencies>
+ <public-packages>
+ <package>net.phyloviz.core.data</package>
+ <package>net.phyloviz.core.util</package>
+ </public-packages>
+ </data>
+ </configuration>
+</project>
diff --git a/nbproject/suite.properties b/nbproject/suite.properties
new file mode 100644
index 0000000..639623d
--- /dev/null
+++ b/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/../../PHYLOViZ
diff --git a/src/net/phyloviz/core/Bundle.properties b/src/net/phyloviz/core/Bundle.properties
new file mode 100644
index 0000000..544d0aa
--- /dev/null
+++ b/src/net/phyloviz/core/Bundle.properties
@@ -0,0 +1,9 @@
+net_phyloviz_core_update_center=http://www.phyloviz.net/updates/updates.xml.gz
+OpenIDE-Module-Display-Category=PHYLOViZ
+OpenIDE-Module-Long-Description=\
+ Core classes and PHYLOViZ API. \
+ It provides the logic and glue required by all other PHYLOViZ modules.
+OpenIDE-Module-Name=PHYLOViZ Core
+CTL_LoadDataSetAction=&Load Dataset
+OpenIDE-Module-Short-Description=Core classes and PHYLOViZ API
+Services/AutoupdateType/net_phyloviz_core_update_center.instance=PHYLOViZ Update Center
diff --git a/src/net/phyloviz/core/DataSetExplorerTopComponentSettings.xml b/src/net/phyloviz/core/DataSetExplorerTopComponentSettings.xml
new file mode 100644
index 0000000..5f8c217
--- /dev/null
+++ b/src/net/phyloviz/core/DataSetExplorerTopComponentSettings.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+To change this template, choose Tools | Templates
+and open the template in the editor.
+-->
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+ <module name="net.phyloviz.core" spec="1.0"/>
+ <instanceof class="org.openide.windows.TopComponent"/>
+ <instanceof class="net.phyloviz.core.explorer.DataSetExplorerTopComponent"/>
+ <instance class="net.phyloviz.core.explorer.DataSetExplorerTopComponent" method="getDefault"/>
+</settings>
diff --git a/src/net/phyloviz/core/DataSetExplorerTopComponentWstcref.xml b/src/net/phyloviz/core/DataSetExplorerTopComponentWstcref.xml
new file mode 100644
index 0000000..ea4fae1
--- /dev/null
+++ b/src/net/phyloviz/core/DataSetExplorerTopComponentWstcref.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+To change this template, choose Tools | Templates
+and open the template in the editor.
+-->
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+ <module name="net.phyloviz.core" spec="1.0"/>
+ <tc-id id="DataSetExplorerTopComponent"/>
+ <state opened="true"/>
+</tc-ref>
diff --git a/src/net/phyloviz/core/DataSetIcon.png b/src/net/phyloviz/core/DataSetIcon.png
new file mode 100644
index 0000000..d4efcf6
Binary files /dev/null and b/src/net/phyloviz/core/DataSetIcon.png differ
diff --git a/src/net/phyloviz/core/DataSetImage.png b/src/net/phyloviz/core/DataSetImage.png
new file mode 100644
index 0000000..1a1a0a6
Binary files /dev/null and b/src/net/phyloviz/core/DataSetImage.png differ
diff --git a/src/net/phyloviz/core/PopulationIcon.png b/src/net/phyloviz/core/PopulationIcon.png
new file mode 100644
index 0000000..6ef630d
Binary files /dev/null and b/src/net/phyloviz/core/PopulationIcon.png differ
diff --git a/src/net/phyloviz/core/PopulationImage.png b/src/net/phyloviz/core/PopulationImage.png
new file mode 100644
index 0000000..b6f6e92
Binary files /dev/null and b/src/net/phyloviz/core/PopulationImage.png differ
diff --git a/src/net/phyloviz/core/TypingIcon.png b/src/net/phyloviz/core/TypingIcon.png
new file mode 100644
index 0000000..00dcdde
Binary files /dev/null and b/src/net/phyloviz/core/TypingIcon.png differ
diff --git a/src/net/phyloviz/core/TypingImage.png b/src/net/phyloviz/core/TypingImage.png
new file mode 100644
index 0000000..6db7ce5
Binary files /dev/null and b/src/net/phyloviz/core/TypingImage.png differ
diff --git a/src/net/phyloviz/core/data/AbstractProfile.java b/src/net/phyloviz/core/data/AbstractProfile.java
new file mode 100644
index 0000000..89a04b0
--- /dev/null
+++ b/src/net/phyloviz/core/data/AbstractProfile.java
@@ -0,0 +1,133 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.data;
+
+/**
+ * This class provides a skeletal implementation of the <tt>Profile</tt>
+ * interface, to minimize the effort required to implement this interface.
+ *
+ * @since PHILOViZ 1.0
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+public abstract class AbstractProfile implements Profile {
+
+ /**
+ * The internal value of the identifier for this typing profile.
+ */
+ protected int uid;
+
+ /**
+ * The identifier of this typing profile.
+ */
+ protected String id;
+
+ /**
+ * Returns an <tt>int</tt> that represents the internal identifier of this typing
+ * profile.
+ *
+ * @return the internal value of the identifier for this typing profile.
+ *
+ */
+ @Override
+ public int getUID() {
+ return uid;
+ }
+
+ /**
+ * Returns a <tt>String</tt> that represents the identifier of this typing
+ * profile.
+ *
+ * @return the identifier of this typing profile.
+ */
+ @Override
+ public String getID() {
+ return id;
+ }
+
+ /**
+ * Returns the value of a feature of this
+ * profile as a string that is at the specified index. An index ranges from
+ * <code>0</code> to <code>profileLenght() - 1</code>.
+ * The first description corresponds to the feature that
+ * is at index <code>0</code>, the next at index <code>1</code>,
+ * and so on, as for array indexing.
+ *
+ *
+ * @param idx the index of the description of a feature.
+ * @return the <code>String</code> representation
+ * of a feature at the specified index of the list of features .
+ * The first <code>String</code> is at index <code>0</code>.
+ * It returns <code>null</code> if the <code>idx</code>
+ * argument is negative or not less than the <code>profileLenght()</code>
+ * of this profile.
+ */
+ @Override
+ public String get(int idx) {
+ if (idx < 0 || idx >= length()) {
+ return null;
+ }
+
+ if (idx == 0) {
+ return getID();
+ } else {
+ return getValue(idx - 1);
+ }
+ }
+
+ /**
+ * Returns the number of features of this profile (including its ID).
+ * If contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
+ * <tt>Integer.MAX_VALUE</tt>.
+ *
+ * @return the number of elements in this profile (including its ID).
+ */
+ @Override
+ public int length() {
+ return profileLength() + 1;
+ }
+
+ /**
+ * Returns the weight of this typing
+ * profile among all the isolates.
+ *
+ * @return the weight of this typing profile.
+ *
+ */
+ @Override
+ public int weight() {
+ return getFreq();
+ }
+}
diff --git a/src/net/phyloviz/core/data/DataItem.java b/src/net/phyloviz/core/data/DataItem.java
new file mode 100644
index 0000000..2f5e630
--- /dev/null
+++ b/src/net/phyloviz/core/data/DataItem.java
@@ -0,0 +1,89 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.data;
+
+/**
+ * This interface describes the minimal requirements for a data item, i.e., a
+ * data vector.
+ * @since PHILOViZ 1.0
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+public interface DataItem {
+
+ /**
+ * Returns a <tt>String</tt> that represents the identifier of this
+ * data item.
+ *
+ * @return the identifier of this typing profile.
+ */
+ public String getID();
+
+ /**
+ * Returns the value of a feature of this data item as a string that is
+ * at the specified index. An index ranges from <code>0</code> to
+ * <code>lenght() - 1</code>.
+ * The first description corresponds to the feature that
+ * is at index <code>0</code>, the next at index <code>1</code>,
+ * and so on, as for array indexing.
+ *
+ *
+ * @param idx the index of the description of a feature.
+ * @return the <code>String</code> representation
+ * of a feature at the specified index of the list of features.
+ * The first <code>String</code> is at index <code>0</code>.
+ * @exception IndexOutOfBoundsException if the <code>idx</code>
+ * argument is negative or not less than
+ * <code>length()</code>.
+ */
+ public String get(int idx);
+
+ /**
+ * Returns the number of features of this data item.
+ * If it contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
+ * <tt>Integer.MAX_VALUE</tt>.
+ *
+ * @return the number of elements in this collection.
+ */
+ public int length();
+
+ /**
+ * Returns the weight of this data item, for instance its relevance or
+ * frequency on a given dataset.
+ *
+ * @return the weight for this item.
+ */
+ public int weight();
+}
diff --git a/src/net/phyloviz/core/data/DataModel.java b/src/net/phyloviz/core/data/DataModel.java
new file mode 100644
index 0000000..6816710
--- /dev/null
+++ b/src/net/phyloviz/core/data/DataModel.java
@@ -0,0 +1,140 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.data;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import javax.swing.table.AbstractTableModel;
+
+/**
+ * The <code> DataModel </code> interface specifies the methods for a
+ * tabular representation of the data. Each row of the
+ * table is a <code>DataItem</code>, i.e., a vector of data values that caracterize the
+ * item.
+ *
+ *
+ * @since PHILOViZ 1.0
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ *
+ */
+public interface DataModel {
+
+ /**
+ * Returns a table model for the data model.
+ * @return a table model for the data model.
+ *
+ */
+ public AbstractTableModel tableModel();
+
+ /**
+ * Returns the label that describes the domain
+ * of the data values in the column <code>idx</code> of the table model.
+ * @param idx the <code>idx</code> column in the table model.
+ * @return the label that describes the domain of the data values that are
+ * on the column <code>idx</code> of the table model.
+ */
+ public String getDomainLabel(int idx);
+
+ /**
+ * Returns the set of all data values that appear in
+ * the column <code>idx</code> of the table model for some data item.
+ * @param idx the <code>idx</code> column in the table model.
+ * @return the set of data values that appear in the column <code>idx</code> in the
+ * table model.
+ */
+ public HashSet<String> getDomain(int idx);
+
+ /**
+ * Returns the key column of this data model.
+ *
+ * @return the index of the key column for this model.
+ */
+ public int getKey();
+
+ /**
+ * Returns a collection with all the data items of this data model.
+ *
+ *
+ * @return a <code>Collection</code> with all the data items of this data model.
+ */
+ public Collection<? extends DataItem> getItems();
+
+ /**
+ * Returns an iterator over the data items.
+ * @return an <code>Iterator</code> over the data items.
+ */
+ public Iterator<? extends DataItem> iterator();
+
+ /**
+ * Returns the number of data items in this data model. If this
+ * data model contains more than
+ * Integer.MAX_VALUE data items, returns Integer.MAX_VALUE.
+ * @return the number of data items in this data model.
+ */
+ public int size();
+
+ /**
+ *
+ * Returns the sum of the weights of all the data items of this model.
+ * @return the sum of the weights of all the data items of this model.
+ */
+ public int weight();
+
+ public DataSaver getSaver();
+
+ /**
+ * Adds a new column to this population model with name
+ * <code>header</code> and values obtained thought <code>cf</code>,
+ * if there is not already a column with the same name.
+ *
+ * @param header the name of the column to add.
+ * @param cf the filler for the column to add.
+ * @return <code>true</code> if this population model
+ * did not already contain a column with the specified name.
+ */
+ public boolean addColumn(String domainLabel, ColumnFiller cf);
+
+ /**
+ * This interface represents a column filler for this table model.
+ * Within a column, the
+ * <code>getValue</code> method obtains the value of this column for the
+ * corresponding isolate.
+ */
+ public interface ColumnFiller {
+ public String getValue(DataItem i);
+ }
+}
diff --git a/src/net/phyloviz/core/data/DataSaver.java b/src/net/phyloviz/core/data/DataSaver.java
new file mode 100644
index 0000000..e2137ad
--- /dev/null
+++ b/src/net/phyloviz/core/data/DataSaver.java
@@ -0,0 +1,110 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.data;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintWriter;
+import javax.swing.table.TableModel;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.cookies.SaveCookie;
+import org.openide.filesystems.FileChooserBuilder;
+
+public class DataSaver implements SaveCookie {
+
+ private DataModel dm;
+
+ public DataSaver(DataModel dm) {
+ this.dm = dm;
+ }
+
+ @Override
+ public void save() throws IOException {
+
+ String title = "Saving " + this.toString() + "...";
+ File f = new FileChooserBuilder(DataSaver.class).setTitle(title).showSaveDialog();
+ if (f != null) {
+ try {
+ if (!f.exists()) {
+ if (!f.createNewFile()) {
+ String failMsg = "Unable to create " + f.getName();
+ DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(failMsg));
+ return;
+ }
+ } else {
+ String overwriteMessage = "Overwriting " + f.getName();
+ Object userChose = DialogDisplayer.getDefault().notify(new NotifyDescriptor.Confirmation(overwriteMessage));
+ if (NotifyDescriptor.CANCEL_OPTION.equals(userChose)) {
+ return;
+ }
+ }
+
+ save(f.getAbsoluteFile());
+ } catch (IOException ioe) {
+ String failMsg = "Error: " + ioe.getMessage();
+ DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(failMsg));
+ }
+ } else
+ throw new FileNotFoundException("Unknown file!");
+ }
+
+ private void save(File f) throws FileNotFoundException {
+
+ PrintWriter pw = new PrintWriter(f);
+ TableModel tm = dm.tableModel();
+
+ pw.print(tm.getColumnName(0));
+ for (int i = 1; i < tm.getColumnCount(); i++)
+ pw.print("\t" + tm.getColumnName(i));
+ pw.println();
+
+ for (int k = 0; k < tm.getRowCount(); k++) {
+ pw.print(tm.getValueAt(k, 0));
+ for (int i = 1; i < tm.getColumnCount(); i++)
+ pw.print("\t" + tm.getValueAt(k, i));
+ pw.println();
+ }
+
+ pw.close();
+ }
+
+ @Override
+ public String toString() {
+ return dm.toString();
+ }
+}
diff --git a/src/net/phyloviz/core/data/DataSet.java b/src/net/phyloviz/core/data/DataSet.java
new file mode 100644
index 0000000..1fa57d3
--- /dev/null
+++ b/src/net/phyloviz/core/data/DataSet.java
@@ -0,0 +1,134 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+package net.phyloviz.core.data;
+
+import net.phyloviz.core.explorer.DataSetNode;
+import net.phyloviz.core.util.NodeFactory;
+import org.openide.nodes.AbstractNode;
+import org.openide.util.Lookup;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ * The DataSet class represents a set that contains population data and related
+ * typing data. An instance of this class can be explored in the context of
+ * an explorer viewer.
+ *
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+public class DataSet implements Lookup.Provider, NodeFactory {
+
+ private InstanceContent ic;
+ private AbstractLookup lookup;
+ private String name;
+ private int popKey;
+
+ /**
+ * Constructs a new data designed by <code>name</code>
+ * @param name the name of the data set.
+ */
+ public DataSet(String name) {
+ ic = new InstanceContent();
+ lookup = new AbstractLookup(ic);
+ this.name = name;
+ popKey = -1;
+ }
+
+ /**
+ * Returns the key column of the tabular model for the population of this data set.
+ *
+ * @return the index of the key column of the tabular model for the population of this data set.
+ */
+ public int getPopKey() {
+ return popKey;
+ }
+
+ /**
+ * Changes the key column of the tabular model for the population of this data set.
+ * @param key the new key column for the tabular model of the population of this data set.
+ */
+ public void setPopKey(int key) {
+ Population pop = lookup.lookup(Population.class);
+ if (pop != null) {
+ pop.setKey(key);
+ }
+ popKey = key;
+ }
+
+ /**
+ * Returns a string representation of this data set.
+ * @overrides <code>toString</code> in class <code>Object</code>
+ * @return a string representation of this data set.
+ */
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ /** Returns lookup associated with the object.
+ * @return fully initialized lookup instance provided by this object.
+ * @override <code>getLookUp</code> in class <code>AbstractLookUp</code>.
+ */
+ @Override
+ public Lookup getLookup() {
+ return lookup;
+ }
+
+ /**
+ * Registers the object with this lookup.
+ * @param o the object to register with this lookup.
+ */
+ public void add(Object o) {
+ ic.add(o);
+ }
+
+ /**
+ * Unregisters the object with this lookup.
+ * @param o the object to be unregistered.
+ */
+ public void remove(Object o) {
+ ic.remove(o);
+ }
+
+ /**
+ * Allows to explore the population in the context of an explorer viewer.
+ * @return returns the population as a node in the explorer view.
+ * @see AbstractNode
+ */
+ @Override
+ public AbstractNode getNode() {
+ return new DataSetNode(this);
+ }
+}
diff --git a/src/net/phyloviz/core/data/DataSetTracker.java b/src/net/phyloviz/core/data/DataSetTracker.java
new file mode 100644
index 0000000..e27f5b7
--- /dev/null
+++ b/src/net/phyloviz/core/data/DataSetTracker.java
@@ -0,0 +1,83 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+package net.phyloviz.core.data;
+
+import org.openide.util.Lookup;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+import org.openide.util.lookup.ServiceProvider;
+
+/**
+ * The instances of this class tracks all DataSet instances.
+ *
+ * @since PHILOViZ 1.0
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+ at ServiceProvider(service = DataSetTracker.class)
+public class DataSetTracker implements Lookup.Provider {
+
+ private InstanceContent ic;
+ private AbstractLookup lookup;
+
+ public DataSetTracker() {
+ ic = new InstanceContent();
+ lookup = new AbstractLookup(ic);
+ }
+
+ /** Returns a lookup associated with the object.
+ * @return fully initialized lookup instance provided by this object.
+ * @override <code>getLookUp</code> in class <code>AbstractLookUp</code>.
+ */
+ @Override
+ public Lookup getLookup() {
+ return lookup;
+ }
+
+ /**
+ * Registers the object within this lookup.
+ * @param o the object to register within this lookup.
+ */
+ public void add(DataSet ds) {
+ ic.add(ds);
+ }
+
+ /**
+ * Unregisters the object within this lookup.
+ * @param o the object to be unregistered.
+ */
+ public void remove(DataSet ds) {
+ ic.remove(ds);
+ }
+}
diff --git a/src/net/phyloviz/core/data/Isolate.java b/src/net/phyloviz/core/data/Isolate.java
new file mode 100644
index 0000000..e04a9d4
--- /dev/null
+++ b/src/net/phyloviz/core/data/Isolate.java
@@ -0,0 +1,164 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.data;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * The <code> Isolate </code> class represents the sampled microorganisms
+ * of bacterial populations. The name of isolate comes from the process of
+ * isolating each sampled microorganism from the population. Each isolate has
+ * ancillary data, such the epidemiological and demographic
+ * information, important information for its characterization.
+ *
+ * @since PHILOViZ 1.0
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+public class Isolate implements DataItem {
+
+ /**
+ * The data structure into which the ancillary data of the isolate is stored.
+ * The capacity of the ArrayList depends on the initialization of the isolate.
+ */
+ private ArrayList<String> values;
+
+ /**
+ * Constructs an isolate with no ancillary data.
+ */
+ protected Isolate() {
+ values = new ArrayList<String>();
+ }
+
+ /**
+ * Constructs an isolate with a list that contains the
+ * ancillary data specified
+ * in the array, by the same order.
+ *
+ * @param val the ancillary data of the isolate.
+ * @throws NullPointerException if the specified array is null.
+ */
+ protected Isolate(String[] val) {
+ values = new ArrayList<String>(Arrays.asList(val));
+ }
+
+ /**
+ * Returns the data at the specified position in the ancillary data list of
+ * this isolate.
+ *
+ * @param idx index of the data to return.
+ * @return the data at the specified position in the ancillary data list of
+ * this isolate.
+ * @throws IndexOutOfBoundsException if the argument <code>idx</code> is negative
+ * or not less than the size of the ancillary data list.
+ */
+ @Override
+ public String get(int idx) {
+ if (idx < 0 || idx >= length())
+ return null;
+
+ return values.get(idx);
+ }
+
+ /**
+ * Replaces the data at the specified position in the ancillary data list of
+ * this isolate.
+ *
+ * @param idx index of the data to replace
+ * @param value data to be stored at the specified position.
+ * @throws IndexOutOfBoundsException if the argument <code>idx</code> is negative
+ * or not less than the size of the ancillary data list.
+ */
+ protected void set(int idx, String value) {
+ if (idx >= 0 && idx < values.size()) {
+ values.set(idx, value);
+ }
+ }
+
+ /**
+ * Appends the specified data to the end of the ancillary data list of
+ * this isolate.
+ * @param value data to be appended to the ancillary data list of
+ * this isolate.
+ *
+ */
+ protected void add(String value) {
+ values.add(value);
+ }
+
+ /**
+ * Returns a string representation of this isolate. The string
+ * representation consists of the list of the ancillary data of this isolate
+ * in the added order, enclosed in square brackets
+ * (<tt>"[]"</tt>). Adjacent elements are separated by the characters
+ * <tt>", "</tt> (comma and space).
+ *
+ * @return a string representation of this isolate
+ */
+ @Override
+ public String toString() {
+ return Arrays.toString(values.toArray());
+ }
+
+ @Override
+ public String getID() {
+ // We do not know anything about it.
+ return null;
+ }
+
+ /**
+ * Returns the number of features (including the ID) of this isolate.
+ * If contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
+ * <tt>Integer.MAX_VALUE</tt>.
+ *
+ * @return the number of elements (including the ID) for this isolate.
+ */
+ @Override
+ public int length() {
+ return values.size();
+ }
+
+ /**
+ * Returns the frequency of this isolate, which is 1.
+ *
+ * @return the frequency the isolate, which is 1.
+ *
+ */
+ @Override
+ public int weight() {
+ return 1;
+ }
+}
diff --git a/src/net/phyloviz/core/data/Population.java b/src/net/phyloviz/core/data/Population.java
new file mode 100644
index 0000000..9ef016f
--- /dev/null
+++ b/src/net/phyloviz/core/data/Population.java
@@ -0,0 +1,451 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.data;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import javax.swing.table.AbstractTableModel;
+import net.phyloviz.core.explorer.PopulationNode;
+import net.phyloviz.core.util.NodeFactory;
+import org.openide.nodes.AbstractNode;
+import org.openide.util.Lookup;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ * The <code> Population </code> class represents the set of the
+ * isolates of a bacterial population.
+ * The isolates of a population can be displayed as a two dimensional table, where each
+ * row corresponds to a different isolate and each column to a specific feature of the isolate.
+ * A population instance can be explored in the context of an explorer viewer.
+ *
+ *
+ * @since PHILOViZ 1.0
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+public class Population implements DataModel, Lookup.Provider, NodeFactory {
+
+ private InstanceContent ic;
+ private AbstractLookup lookup;
+
+ /**
+ * The set of the ancillary data names.
+ */
+ private ArrayList<String> headers;
+
+ /**
+ * The list of sets of ancillary data values.
+ * Each position of this list contains the corresponding set of ancillary
+ * data values to a specific ancillary data name.
+ */
+ private ArrayList<HashSet<String>> domains;
+
+ /**
+ * The map that to each ancillary data name maps
+ * an internal index.
+ */
+ private HashMap<String, Integer> h2idx;
+
+ /**
+ * The list of the isolates that belong to this population.
+ */
+ private ArrayList<Isolate> collection;
+
+ /**
+ * A tabular model of this population.
+ * */
+ private TableModel model;
+
+ private DataSaver saver;
+ private int key;
+
+ /**
+ * Constructs an empty population.
+ */
+ public Population() {
+ ic = new InstanceContent();
+ lookup = new AbstractLookup(ic);
+ headers = new ArrayList<String>();
+ domains = new ArrayList<HashSet<String>>();
+ h2idx = new HashMap<String, Integer>();
+ collection = new ArrayList<Isolate>();
+ }
+
+ /**
+ * Adds an isolate to this population with <code>values</code> as its
+ * ancillary data.
+ *
+ * @param values the ancillary data values of an isolate.
+ * @return <code>true</code> if <code>values</code> has the expected
+ * length for this population.
+ */
+ public boolean addIsolate(String[] values) {
+
+ // Do we have values for all fields?
+ if (values.length != headers.size()) {
+ return false;
+ }
+
+ Isolate isolate = new Isolate();
+
+ for (int i = 0; i < values.length; i++) {
+ isolate.add(values[i]);
+ domains.get(i).add(values[i]);
+ }
+
+ collection.add(isolate);
+
+ return true;
+ }
+
+ /**
+ * Returns the number of isolates in this population.
+ *
+ * @return the number of isolates of this population
+ */
+ @Override
+ public int size() {
+ return collection.size();
+ }
+
+ /**
+ * Sorts the isolates from this population according to the order
+ * induced by the specified comparator. All isolates in the population
+ * must be mutually
+ * comparable using the specified comparator
+ * (that is, c.compare(e1, e2) must not throw a
+ * <code>ClassCastException</code> for any elements e1 and e2 in the
+ * population).
+ *
+ * @param c the comparator to determine the order of the list. A
+ * null value indicates that the elements' natural ordering should
+ * be used.
+ */
+ public void sort(Comparator<Isolate> c) {
+ Collections.sort(collection, c);
+ }
+
+ /**
+ * Returns an iterator over the elements in this population.
+ * There are no guarantees concerning the order in which the elements
+ * are returned
+ * @return an <code>Iterator</code>
+ * over the elements in this population.
+ */
+ @Override
+ public Iterator<Isolate> iterator() {
+ return new PopulationIterator();
+ }
+
+ /**
+ * Returns a string representation of this population.
+ * The string representation express de kind of elements of this
+ * population, i.e., isolates.
+ * @overrides <code>toString</code> in class <code>Object</code>
+ * @return a string representation of this population.
+ */
+ @Override
+ public String toString() {
+ return "Isolate Data";
+ }
+
+ // LookUp Methods
+
+ /** Returns the lookup associated with the object.
+ * @return fully initialized lookup instance provided by this object.
+ * @override <code>getLookUp</code> in class <code>AbstractLookUp</code>.
+ */
+ @Override
+ public Lookup getLookup() {
+ return lookup;
+ }
+
+ /**
+ * Registers the object o within this lookup.
+ * @see - org.openide.util.Lookup.Provider.
+ * @param o the object to be registered.
+ */
+ public void add(Object o) {
+ ic.add(o);
+ }
+
+ /**
+ * Unregisters the object <code>o</code> within this lookup.
+ * @param o the object to be registered..
+ */
+ public void remove(Object o) {
+ ic.remove(o);
+ }
+
+ /**
+ * Allows to explore this population in the context of an explorer viewer.
+ * @return - Returns this population as a node in the explorer view.
+ */
+ @Override
+ public AbstractNode getNode() {
+ return new PopulationNode(this);
+ }
+
+ private class PopulationIterator implements Iterator<Isolate> {
+
+ private Iterator<Isolate> i;
+ private Isolate last;
+ private int idx;
+
+ public PopulationIterator() {
+ i = collection.iterator();
+ last = null;
+ idx = 0;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return i.hasNext();
+ }
+
+ @Override
+ public Isolate next() {
+ last = i.next();
+ idx++;
+ return last;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("Not supported!");
+ }
+
+ public String get(int idx) {
+ if (last == null) {
+ return null;
+ }
+
+ return last.get(idx);
+ }
+
+ public void set(int idx, String value) {
+ if (last != null) {
+ domains.get(idx).add(value);
+ last.set(idx, value);
+ }
+ }
+
+ public String get(String column) {
+ return get(h2idx.get(column));
+ }
+
+ public void set(String column, String value) {
+ set(h2idx.get(column), value);
+ }
+
+ public int index() {
+ return idx;
+ }
+ }
+
+ //Data Model Methods
+
+ /**
+ * Returns the key column of this population model.
+ *
+ * @return the index of the key column for this population model.
+ */
+ @Override
+ public int getKey() {
+ return key;
+ }
+
+ /**
+ * Changes the key column of this population model.
+ * @param key the new key column for this population model.
+ */
+ public void setKey(int key) {
+ this.key = key;
+ }
+
+ /**
+ * Adds a new column to this population model with name
+ * <code>header</code> and values obtaineds thought <code>cf</code>,
+ * if there is not already a column with the same name.
+ *
+ * @param header the name of the column to add.
+ * @param cf the values filler for the column to add.
+ * @return <code>true</code> if this population model
+ * did not already contain a column with the specified name.
+ */
+ @Override
+ public boolean addColumn(String header, ColumnFiller cf) {
+ if (h2idx.containsKey(header)) {
+ return false;
+ }
+
+ h2idx.put(header, headers.size());
+ headers.add(header);
+ HashSet<String> dom = new HashSet<String>();
+ domains.add(dom);
+
+ Iterator<Isolate> i = collection.iterator();
+ if (cf != null) {
+ while (i.hasNext()) {
+ Isolate iso = i.next();
+ String val = cf.getValue(iso);
+ dom.add(val);
+ iso.add(val);
+ }
+ } else {
+ while (i.hasNext()) {
+ i.next().add(null);
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns the label that describes the domain
+ * of the data values that
+ * are in the column idx of the table model of this population.
+ * @param idx the idx column in the table model.
+ * @return the label that describes the domain of the data values that are
+ * on the column idx of the table model of this population. It returns null
+ * if <code>idx</code> is not a valid index.
+ */
+ @Override
+ public String getDomainLabel(int idx) {
+ if (idx < 0 || idx >= headers.size()) {
+ return null;
+ }
+
+ return headers.get(idx);
+ }
+
+ /**
+ * Returns a collection with all the isolates of this population.
+ * @return a <code> Collection</code> with all the isolates of this population.
+ */
+ @Override
+ public Collection<? extends DataItem> getItems() {
+ return new ArrayList<Isolate>(collection);
+ }
+
+ /**
+ * Returns the sum of the weights of all the isolates of this population.
+ * @return the sum of the weights of all the isolates of this population.
+ */
+ @Override
+ public int weight() {
+ return size();
+ }
+
+ /**
+ * Returns the set of data values that belong to the isolates and
+ * are in the column idx of the table model inherent to this population.
+ * @param idx the idx column in the table model inherent to this population.
+ * @return the set of data values that belong to the isolates that are
+ * on the column idx of the table model inherent to this population.
+ */
+ @Override
+ public HashSet<String> getDomain(int idx) {
+ if (idx < 0 || idx > domains.size()) {
+ return null;
+ }
+
+ return domains.get(idx);
+ }
+
+ /**
+ * Returns a table model for this population.
+ * @return a table model for this population.
+ */
+ @Override
+ public AbstractTableModel tableModel() {
+ if (model == null) {
+ model = new TableModel();
+ }
+
+ return model;
+ }
+
+ @Override
+ public DataSaver getSaver() {
+ if (saver == null) {
+ saver = new DataSaver(this);
+ }
+
+ return saver;
+ }
+
+ private class TableModel extends AbstractTableModel {
+
+ @Override
+ public int getRowCount() {
+ return size();
+ }
+
+ @Override
+ public int getColumnCount() {
+ return headers.size();
+ }
+
+ @Override
+ public String getColumnName(int idx) {
+ return getDomainLabel(idx);
+ }
+
+ @Override
+ public int findColumn(String name) {
+ if (h2idx.containsKey(name)) {
+ return h2idx.get(name);
+ }
+
+ return -1;
+ }
+
+ @Override
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ if (rowIndex < 0 || rowIndex >= collection.size()) {
+ return null;
+ }
+
+ return collection.get(rowIndex).get(columnIndex);
+ }
+ }
+}
diff --git a/src/net/phyloviz/core/data/Profile.java b/src/net/phyloviz/core/data/Profile.java
new file mode 100644
index 0000000..7eb1ede
--- /dev/null
+++ b/src/net/phyloviz/core/data/Profile.java
@@ -0,0 +1,116 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.data;
+
+/**
+ * This interface describes the minimal requirements for an isolate
+ * profile created by a microbial typing method. An isolate represents a sampled
+ * microorganism of a bacterial population. The application of a typing
+ * method to an isolate gives a characterization at the strain level of the isolate,
+ * i.e., an isolate profile.
+ * Thus, each profile consists of the list of features that characterizes an
+ * isolate with respect to a specific typing method.
+ * @since PHILOViZ 1.0
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ *
+ */
+public interface Profile extends DataItem {
+
+ /**
+ * Returns an <tt>int</tt> that represents the internal identifier of this typing
+ * profile.
+ *
+ * @return the internal value of the identifier of this typing profile.
+ *
+ */
+ public int getUID();
+
+ /**
+ * Returns a <tt>String</tt> that represents the identifier of this typing
+ * profile.
+ *
+ * @return the identifier of this typing profile.
+ */
+ @Override
+ public String getID();
+
+ /**
+ * Returns the number of features of this profile.
+ * If contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
+ * <tt>Integer.MAX_VALUE</tt>.
+ *
+ * @return the number of elements in this profile.
+ */
+ public int profileLength();
+
+ /**
+ * Returns the value of a feature of this
+ * profile as a string that is at the specified index. An index ranges from
+ * <code>0</code> to <code>profileLenght() - 1</code>.
+ * The first description corresponds to the feature that
+ * is at index <code>0</code>, the next at index <code>1</code>,
+ * and so on, as for array indexing.
+ *
+ *
+ * @param idx the index of the description of a feature.
+ * @return the <code>String</code> representation
+ * of the feature at the specified index of the list of features .
+ * The first <code>String</code> is at index <code>0</code>.
+ * @exception IndexOutOfBoundsException if the <code>idx</code>
+ * argument is negative or not less than the <code>profileLenght()</code>
+ * this profile.
+ */
+ public String getValue(int idx);
+
+ /**
+ * Returns the frequency of this typing
+ * profile among all the isolates.
+ *
+ * @return the frequency of this typing profile.
+ *
+ */
+ public int getFreq();
+
+ /**
+ * This method updates the frequency of this typing
+ * profile.
+ *
+ * @param freq the new frequency of this typing profile.
+ * @void updates the frequency of this typing profile.
+ *
+ */
+ public void setFreq(int freq);
+}
diff --git a/src/net/phyloviz/core/data/TypingData.java b/src/net/phyloviz/core/data/TypingData.java
new file mode 100644
index 0000000..2a2cf08
--- /dev/null
+++ b/src/net/phyloviz/core/data/TypingData.java
@@ -0,0 +1,509 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.data;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.TreeSet;
+import javax.swing.table.AbstractTableModel;
+import net.phyloviz.core.explorer.TypingDataNode;
+import net.phyloviz.core.util.NodeFactory;
+import org.openide.nodes.AbstractNode;
+import org.openide.util.Lookup;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ * The <code>TypingData</code> class represents the set of the
+ * isolates profiles created by a microbial typing method.
+ * Each typing data has a table view, i.e., in can be displayed as a two
+ * dimensional table.
+ *
+ * @since PHILOViZ 1.0
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ *
+ */
+public class TypingData<T extends AbstractProfile> implements DataModel, Lookup.Provider, NodeFactory {
+
+ private InstanceContent ic;
+ private AbstractLookup lookup;
+ private String description;
+
+ /**
+ * The list of the feature names corresponding to this kind of profiles.
+ * This names will be the headers of the columns in a table view of this
+ * typing data.
+ */
+ private String[] headers;
+
+ /**
+ * The array of sets of the feature data values.
+ * Each position of this array contains the corresponding set of the feature
+ * data values to a specific feature data name.
+ */
+ private HashSet<String>[] domains;
+
+ /**
+ * The map that to each feature data name maps
+ * an internal index.
+ */
+ private HashMap<String, Integer> h2idx;
+
+ /**
+ * The list of the profiles that belong to this population.
+ */
+ private ArrayList<T> collection;
+ private TreeSet<T> unique;
+ private HashSet<String> idset;
+
+ /**
+ * A tabular model of this population.
+ * */
+ private TableModel model;
+ private DataSaver saver;
+ private boolean weightOk;
+ private int weight;
+
+ /**
+ * Constructs an empty typing data model, with <code>nColumns</code> features.
+ */
+ @SuppressWarnings("unchecked")
+ public TypingData(int nColumns) {
+
+ ic = new InstanceContent();
+ lookup = new AbstractLookup(ic);
+
+ headers = new String[nColumns];
+ domains = new HashSet[nColumns];
+ for (int i = 0; i < nColumns; i++) {
+ domains[i] = new HashSet<String>();
+ }
+ h2idx = new HashMap<String, Integer>();
+
+ collection = new ArrayList<T>();
+ unique = new TreeSet<T>();
+ idset = new HashSet<String>();
+
+ weightOk = false;
+ }
+
+ /**
+ * Constructs an empty typing data model, with <code>ha.lenght</code>
+ * features, named by the array <code>ha</code>.
+ */
+ public TypingData(String[] ha) {
+ this(ha.length);
+ for (int i = 0; i < ha.length; i++)
+ setHeader(i, ha[i]);
+ }
+
+ /**
+ * Returns the number of profiles in this typing data.
+ *
+ * @return the number of profiles of this typing data.
+ */
+ @Override
+ public int size() {
+ return collection.size();
+ }
+
+ /**
+ * Sets the column <code> idx</code> of this typing data model with a new name
+ * <code>header</code>.
+ *
+ * @param header the new name of the column <code>idx</code>.
+ * @thows ArrayIndexOutOfBoundException if the <code>idx</code> does not
+ * corresponds to an existent column.
+ */
+ public final void setHeader(int idx, String header) {
+ if (idx >= 0 && idx < headers.length) {
+ headers[idx] = header;
+ h2idx.put(header, idx);
+ }
+ }
+
+ /**
+ * Obtains the list of the feature names headers or labels.
+ * This names are the headers of the columns in a table view of this
+ * typing data model.
+ *
+ */
+ public Collection<String> getHeaders() {
+ return Arrays.asList(headers);
+ }
+
+ /**
+ * Adds a new profile to this typing data, if there is not
+ * already an equal one. The new profile should have values for
+ * all the features considered in this typing data. Otherwise, it will not
+ * be added.
+ * @param profile the new profile to be added.
+ * @return the inserted profile.
+ * @throws Exception on unsuccess.
+ */
+ public T addData(T profile) throws Exception {
+
+ // Do we have values for all fields?
+ if (profile.profileLength() != headers.length - 1) {
+ throw new Exception("Incompatible length: "
+ + profile.getID() + " has length"
+ + profile.profileLength() + "(!="
+ + (headers.length - 1) + ")");
+ }
+
+ if (unique.contains(profile)) {
+ throw new Exception("Duplicated profile: "
+ + profile.getID() + " aka "
+ + this.getEqual(profile).getID());
+ }
+
+ if (idset.contains(profile.getID())) {
+ throw new Exception("Duplicated profile ID: "
+ + profile.getID());
+ }
+
+ domains[0].add(profile.getID());
+ for (int i = 0; i < profile.profileLength(); i++) {
+ domains[i + 1].add(profile.getValue(i));
+ }
+
+ collection.add(profile);
+ unique.add(profile);
+ idset.add(profile.getID());
+
+ weightOk = false;
+
+ return profile;
+ }
+
+ /**
+ * Returns the profile in this typing data equals to the given profile,
+ * or null if there is no such profile.
+ * @param profile the profile to match.
+ * @return the profile equals to the parameter, or null if there is no
+ * such element.
+ */
+ public T getEqual(T profile) {
+ T p = unique.ceiling(profile);
+
+ if (p != null && p.equals(profile)) {
+ return p;
+ }
+
+ return null;
+ }
+
+ /**
+ * Sorts the profiles of this typing data according
+ * to the order induced by the specified comparator.
+ * @param c the comparator to determine the order of the profiles.
+ * A <code>null</code> value indicates that the elements' natural
+ * ordering should be used.
+ */
+ public void sort(Comparator<T> c) {
+ Collections.sort(collection, c);
+ }
+
+ /**
+ * Returns an iterator over the profiles in this typing data.
+ * There are no guarantees concerning the order in which the profiles
+ * are returned
+ * @return an <code>Iterator</code>
+ * over the profiles in this typing data.
+ */
+ @Override
+ public Iterator<T> iterator() {
+ return new DataIterator();
+ }
+
+ /**
+ * Returns a description of this typing data.
+ * @return a description of this typing data.
+ *
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Changes the description of this typing data.
+ * @param desc the new description of this typing data.
+ */
+ public void setDescription(String desc) {
+ description = desc;
+ }
+
+ /**
+ * Returns a string representation of this typing data, which consists
+ * of its own description.
+ * @return a string representation of this typing data.
+ */
+ @Override
+ public String toString() {
+ return description;
+ }
+
+ /**
+ * Returns the label that describes the domain
+ * of the data values that belong to the profiles and
+ * are in the column idx of the table model of this typing data.
+ * @param idx the idx column in the table model.
+ * @return the label that describes the domain of the data values that are
+ * on the column idx of the table model of this typing data.
+ */
+ @Override
+ public String getDomainLabel(int idx) {
+ if (idx < 0 || idx >= headers.length) {
+ return null;
+ }
+
+ return headers[idx];
+ }
+
+ @Override
+ /**
+ * Returns the set of data values that belong to the profiles and
+ * are in the column idx of the table model inherent to this typing data.
+ * @param idx the idx column in the table model inherent to this typing data.
+ * @return the set of data values that belong to the profiles that are
+ * on the column idx of the table model inherent to this typing data.
+ */
+ public HashSet<String> getDomain(int idx) {
+ if (idx < 0 || idx > domains.length) {
+ return null;
+ }
+
+ return domains[idx];
+ }
+
+ /**
+ * Allows to explore the population in the context of an explorer viewer.
+ * @return Returns the population as a node in the explorer view.
+ * @see AbstractNode
+ */
+ @Override
+ public AbstractNode getNode() {
+ return new TypingDataNode(this);
+ }
+
+ /**
+ * Returns the lookup inherited to this typing data.
+ * @see Lookup
+ * @return the lookup inherited to this typing data.
+ */
+ @Override
+ public Lookup getLookup() {
+ return lookup;
+ }
+
+ /**
+ * Registers the object <code>o</code> with this lookup.
+ * @see org.openide.util.Lookup.Provider.
+ * @param o the object to be registered.
+ */
+ public void add(Object o) {
+ ic.add(o);
+ }
+
+ /**
+ * Unregisters the object <code>o</code> with this lookup.
+ * @see org.openide.util.Lookup.Provider.
+ * @param o the object to be registered.
+ */
+ public void remove(Object o) {
+ ic.remove(o);
+ }
+
+ /**
+ * Returns the key column of this typing data model.
+ *
+ * @return the index of the key column for this typing data model.
+ */
+ @Override
+ public int getKey() {
+ return 0;
+ }
+
+ /**
+ * Returns a collection with all the profiles of this data model.
+ * @return a collection with all the profiles of this data model.
+ */
+ @Override
+ public Collection<? extends DataItem> getItems() {
+ return new ArrayList<T>(collection);
+ }
+
+ /**
+ * Returns the sum of the weights of all the profiles of this typing data.
+ * @return the sum of the weights of all the profiles of this typing data.
+ */
+ @Override
+ public synchronized int weight() {
+
+ if (!weightOk) {
+ weight = 0;
+ Iterator<T> i = collection.iterator();
+ while (i.hasNext()) {
+ weight += i.next().weight();
+ }
+ }
+
+ return weight;
+ }
+
+ @Override
+ public boolean addColumn(String domainLabel, ColumnFiller cf) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ private class DataIterator implements Iterator<T> {
+
+ private Iterator<T> i;
+ private T last;
+ private int idx;
+
+ public DataIterator() {
+ i = collection.iterator();
+ last = null;
+ idx = 0;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return i.hasNext();
+ }
+
+ @Override
+ public T next() {
+ last = i.next();
+ idx++;
+ return last;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("Not supported!");
+ }
+
+ public String getID() {
+ if (last == null) {
+ return null;
+ }
+
+ return last.getID();
+ }
+
+ public String getValue(int idx) {
+ if (last == null) {
+ return null;
+ }
+
+ return last.getValue(idx);
+ }
+
+ public String getValue(String column) {
+ return getValue(h2idx.get(column) - 1);
+ }
+
+ public int index() {
+ return idx;
+ }
+ }
+
+ /**
+ * Returns a table model for this typing data model.
+ * @return a table model for this typing data model.
+ */
+ @Override
+ public AbstractTableModel tableModel() {
+ if (model == null) {
+ model = new TableModel();
+ }
+
+ return model;
+ }
+
+ @Override
+ public DataSaver getSaver() {
+ if (saver == null) {
+ saver = new DataSaver(this);
+ }
+
+ return saver;
+ }
+
+ private class TableModel extends AbstractTableModel {
+
+ @Override
+ public int getRowCount() {
+ return size();
+ }
+
+ @Override
+ public int getColumnCount() {
+ return headers.length;
+ }
+
+ @Override
+ public String getColumnName(int idx) {
+ return getDomainLabel(idx);
+ }
+
+ @Override
+ public int findColumn(String name) {
+ if (h2idx.containsKey(name)) {
+ return h2idx.get(name);
+ }
+
+ return -1;
+ }
+
+ @Override
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ if (rowIndex < 0 || rowIndex >= collection.size()) {
+ return null;
+ }
+
+ return collection.get(rowIndex).get(columnIndex);
+ }
+ }
+}
diff --git a/src/net/phyloviz/core/explorer/Bundle.properties b/src/net/phyloviz/core/explorer/Bundle.properties
new file mode 100644
index 0000000..93c732b
--- /dev/null
+++ b/src/net/phyloviz/core/explorer/Bundle.properties
@@ -0,0 +1,3 @@
+CTL_DataSetExplorerAction=Dataset Explorer
+CTL_DataSetExplorerTopComponent=Datasets
+HINT_DataSetExplorerTopComponent=Dataset Explorer
diff --git a/src/net/phyloviz/core/explorer/DataSetExplorerTopComponent.form b/src/net/phyloviz/core/explorer/DataSetExplorerTopComponent.form
new file mode 100644
index 0000000..0a9a519
--- /dev/null
+++ b/src/net/phyloviz/core/explorer/DataSetExplorerTopComponent.form
@@ -0,0 +1,18 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.4" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+</Form>
diff --git a/src/net/phyloviz/core/explorer/DataSetExplorerTopComponent.java b/src/net/phyloviz/core/explorer/DataSetExplorerTopComponent.java
new file mode 100644
index 0000000..479a655
--- /dev/null
+++ b/src/net/phyloviz/core/explorer/DataSetExplorerTopComponent.java
@@ -0,0 +1,195 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.explorer;
+
+import java.awt.BorderLayout;
+import java.util.logging.Logger;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.KeyStroke;
+import net.phyloviz.core.data.DataSetTracker;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+//import org.openide.util.ImageUtilities;
+import org.netbeans.api.settings.ConvertAsProperties;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.explorer.view.BeanTreeView;
+import org.openide.nodes.AbstractNode;
+import org.openide.util.Lookup;
+
+/**
+ * Top component which displays something.
+ */
+ at ConvertAsProperties(dtd = "-//net.phyloviz.core.explorer//DataSetExplorer//EN",
+autostore = false)
+public final class DataSetExplorerTopComponent extends TopComponent implements ExplorerManager.Provider {
+
+ private static DataSetExplorerTopComponent instance;
+ /** path to the icon used by the component and its open action */
+ // static final String ICON_PATH = "SET/PATH/TO/ICON/HERE";
+ private static final String PREFERRED_ID = "DataSetExplorerTopComponent";
+ private final ExplorerManager mgr = new ExplorerManager();
+
+ public DataSetExplorerTopComponent() {
+ initComponents();
+ BeanTreeView tv = new BeanTreeView();
+ tv.setRootVisible(false);
+ add(tv,BorderLayout.CENTER);
+
+ setName(NbBundle.getMessage(DataSetExplorerTopComponent.class, "CTL_DataSetExplorerTopComponent"));
+ setToolTipText(NbBundle.getMessage(DataSetExplorerTopComponent.class, "HINT_DataSetExplorerTopComponent"));
+ // setIcon(ImageUtilities.loadImage(ICON_PATH, true));
+
+ ActionMap map = getActionMap();
+ map.put("delete", ExplorerUtils.actionDelete(mgr, true));
+
+ InputMap keys = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+ keys.put(KeyStroke.getKeyStroke("DELETE"), "delete");
+
+ associateLookup(ExplorerUtils.createLookup(mgr, getActionMap()));
+ mgr.setRootContext(new AbstractNode(new ExplorerChildren(Lookup.getDefault().lookup(DataSetTracker.class).getLookup())) {
+ @Override
+ public Action[] getActions(boolean context) {
+ return new Action[0];
+ };
+ });
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ setLayout(new java.awt.BorderLayout());
+ }// </editor-fold>//GEN-END:initComponents
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ // End of variables declaration//GEN-END:variables
+ /**
+ * Gets default instance. Do not use directly: reserved for *.settings files only,
+ * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+ * To obtain the singleton instance, use {@link #findInstance}.
+ */
+ public static synchronized DataSetExplorerTopComponent getDefault() {
+ if (instance == null) {
+ instance = new DataSetExplorerTopComponent();
+ }
+ return instance;
+ }
+
+ /**
+ * Obtain the DataSetExplorerTopComponent instance. Never call {@link #getDefault} directly!
+ */
+ public static synchronized DataSetExplorerTopComponent findInstance() {
+ TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+ if (win == null) {
+ Logger.getLogger(DataSetExplorerTopComponent.class.getName()).warning(
+ "Cannot find " + PREFERRED_ID + " component. It will not be located properly in the window system.");
+ return getDefault();
+ }
+ if (win instanceof DataSetExplorerTopComponent) {
+ return (DataSetExplorerTopComponent) win;
+ }
+ Logger.getLogger(DataSetExplorerTopComponent.class.getName()).warning(
+ "There seem to be multiple components with the '" + PREFERRED_ID
+ + "' ID. That is a potential source of errors and unexpected behavior.");
+ return getDefault();
+ }
+
+ @Override
+ public int getPersistenceType() {
+ return TopComponent.PERSISTENCE_ALWAYS;
+ }
+
+ @Override
+ public void componentOpened() {
+ // TODO add custom code on component opening
+ }
+
+ @Override
+ public void componentClosed() {
+ // TODO add custom code on component closing
+ }
+
+ void writeProperties(java.util.Properties p) {
+ // better to version settings since initial version as advocated at
+ // http://wiki.apidesign.org/wiki/PropertyFiles
+ p.setProperty("version", "1.0");
+ // TODO store your settings
+ }
+
+ Object readProperties(java.util.Properties p) {
+ if (instance == null) {
+ instance = this;
+ }
+ instance.readPropertiesImpl(p);
+ return instance;
+ }
+
+ private void readPropertiesImpl(java.util.Properties p) {
+ String version = p.getProperty("version");
+ // TODO read your settings according to their version
+ }
+
+ @Override
+ protected String preferredID() {
+ return PREFERRED_ID;
+ }
+
+ @Override
+ public ExplorerManager getExplorerManager() {
+ return mgr;
+ }
+
+ @Override
+ public void addNotify() {
+ super.addNotify();
+ ExplorerUtils.activateActions(mgr, true);
+ }
+
+ @Override
+ public void removeNotify() {
+ super.addNotify();
+ ExplorerUtils.activateActions(mgr, false);
+ }
+}
diff --git a/src/net/phyloviz/core/explorer/DataSetNode.java b/src/net/phyloviz/core/explorer/DataSetNode.java
new file mode 100644
index 0000000..58cf106
--- /dev/null
+++ b/src/net/phyloviz/core/explorer/DataSetNode.java
@@ -0,0 +1,105 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.explorer;
+
+import java.awt.Image;
+import java.io.IOException;
+import java.util.Enumeration;
+import javax.swing.Action;
+import net.phyloviz.core.data.DataSet;
+import net.phyloviz.core.data.DataSetTracker;
+import org.openide.actions.DeleteAction;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Node;
+import org.openide.util.ImageUtilities;
+import org.openide.util.Lookup;
+import org.openide.util.actions.SystemAction;
+import org.openide.util.lookup.Lookups;
+
+public class DataSetNode extends AbstractNode {
+
+ public DataSetNode(DataSet ds) {
+ super(new ExplorerChildren(ds.getLookup()), Lookups.singleton(ds));
+ setDisplayName(ds.toString());
+ }
+
+ @Override
+ public Image getIcon(int type) {
+ return ImageUtilities.loadImage("net/phyloviz/core/DataSetIcon.png");
+ }
+
+ @Override
+ public Image getOpenedIcon(int type) {
+ return getIcon(type);
+ }
+
+ @Override
+ public boolean canDestroy() {
+ return true;
+ }
+
+ @Override
+ public void destroy() throws IOException {
+ Lookup.getDefault().lookup(DataSetTracker.class).remove(this.getLookup().lookup(DataSet.class));
+
+ Enumeration<Node> e = this.getChildren().nodes();
+ while (e.hasMoreElements())
+ e.nextElement().destroy();
+
+ super.destroy();
+ }
+
+ @Override
+ public Action[] getActions(boolean context) {
+
+ return new SystemAction[] {
+ SystemAction.get(DeleteAction.class),
+ //SystemAction.get(PropertiesAction.class)
+ };
+
+/* Action[] actions = null;
+ try {
+ actions = new Action[]{(Action) DataObject.find(
+ FileUtil.getConfigFile("Actions/Edit/org-openide-actions-DeleteAction.instance")).getLookup().lookup(InstanceCookie.class).instanceCreate()};
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ } catch (ClassNotFoundException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ return actions;
+*/
+ }
+}
diff --git a/src/net/phyloviz/core/explorer/ExplorerChildren.java b/src/net/phyloviz/core/explorer/ExplorerChildren.java
new file mode 100644
index 0000000..035ede3
--- /dev/null
+++ b/src/net/phyloviz/core/explorer/ExplorerChildren.java
@@ -0,0 +1,74 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.explorer;
+
+import net.phyloviz.core.util.NodeFactory;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+
+public class ExplorerChildren extends Children.Keys<NodeFactory> {
+
+ private Lookup.Result<NodeFactory> result;
+
+ public ExplorerChildren(Lookup lookup) {
+ super();
+ result = lookup.lookupResult(NodeFactory.class);
+ result.addLookupListener(new LookupListener() {
+
+ @Override
+ public void resultChanged(LookupEvent le) {
+ refreshKeys();
+ }
+ });
+ }
+
+ @Override
+ public void addNotify() {
+ refreshKeys();
+ }
+
+ @Override
+ protected Node[] createNodes(NodeFactory t) {
+ return new Node[] { t.getNode() };
+ }
+
+ private void refreshKeys() {
+ setKeys(result.allInstances());
+ }
+}
diff --git a/src/net/phyloviz/core/explorer/PopulationNode.java b/src/net/phyloviz/core/explorer/PopulationNode.java
new file mode 100644
index 0000000..b13cc56
--- /dev/null
+++ b/src/net/phyloviz/core/explorer/PopulationNode.java
@@ -0,0 +1,92 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.explorer;
+
+import java.awt.Image;
+import java.util.Collection;
+import javax.swing.Action;
+import net.phyloviz.core.data.Population;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.util.ImageUtilities;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+public class PopulationNode extends AbstractNode {
+
+ public PopulationNode(Population pop) {
+ this(pop, new InstanceContent());
+ setDisplayName(pop.toString());
+ }
+
+ private PopulationNode(Population pop, InstanceContent ic) {
+ super(Children.LEAF, new AbstractLookup(ic));
+ ic.add(pop);
+ ic.add(pop.getSaver());
+ }
+
+ @Override
+ public Image getIcon (int type) {
+ return ImageUtilities.loadImage("net/phyloviz/core/PopulationIcon.png");
+ }
+
+ @Override
+ public Image getOpenedIcon (int type) {
+ return getIcon(type);
+ }
+
+ @Override
+ public boolean canDestroy() {
+ return false;
+ }
+
+ @Override
+ public Action getPreferredAction() {
+ return getActions(true)[0];
+ }
+
+ @Override
+ public Action[] getActions(boolean context) {
+
+ Collection<? extends Action> a4p = Utilities.actionsForPath("/Actions/PHYLOViZ/DataModel");
+
+ Action[] actions = a4p.toArray(new Action[a4p.size()]);
+ //actions[a4p.size()] = SystemAction.get(PropertiesAction.class);
+
+ return actions;
+ }
+}
diff --git a/src/net/phyloviz/core/explorer/TypingDataNode.java b/src/net/phyloviz/core/explorer/TypingDataNode.java
new file mode 100644
index 0000000..c6d90af
--- /dev/null
+++ b/src/net/phyloviz/core/explorer/TypingDataNode.java
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.explorer;
+
+import java.awt.Image;
+import java.util.ArrayList;
+import java.util.Collection;
+import javax.swing.Action;
+import net.phyloviz.core.data.TypingData;
+import org.openide.nodes.AbstractNode;
+import org.openide.util.ImageUtilities;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+public class TypingDataNode extends AbstractNode {
+
+ public TypingDataNode(TypingData td) {
+ this(td, new InstanceContent());
+ setDisplayName(td.toString());
+ }
+
+ private TypingDataNode(TypingData td, InstanceContent ic) {
+ super(new ExplorerChildren(td.getLookup()), new AbstractLookup(ic));
+ ic.add(td);
+ ic.add(td.getSaver());
+ }
+
+
+ @Override
+ public Image getIcon (int type) {
+ return ImageUtilities.loadImage("net/phyloviz/core/TypingIcon.png");
+ }
+
+ @Override
+ public Image getOpenedIcon (int type) {
+ return getIcon(type);
+ }
+
+ @Override
+ public boolean canDestroy() {
+ return false;
+ }
+
+ @Override
+ public Action getPreferredAction() {
+ return getActions(true)[0];
+ }
+
+ @Override
+ public Action[] getActions(boolean context) {
+
+ Collection<Action> a4p = new ArrayList<Action>();
+ a4p.addAll(Utilities.actionsForPath("/Actions/PHYLOViZ/DataModel"));
+ a4p.addAll(Utilities.actionsForPath("/Actions/PHYLOViZ/Algorithm"));
+
+ Action[] actions = a4p.toArray(new Action[a4p.size()]);
+ //actions[a4p.size()] = SystemAction.get(PropertiesAction.class);
+
+ return actions;
+ }
+}
diff --git a/src/net/phyloviz/core/layer.xml b/src/net/phyloviz/core/layer.xml
new file mode 100644
index 0000000..6348e11
--- /dev/null
+++ b/src/net/phyloviz/core/layer.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
+<filesystem>
+ <folder name="Actions">
+ <folder name="File">
+ <file name="net-phyloviz-core-wizard-LoadDataSetWizardAction.instance">
+ <attr name="delegate" newvalue="net.phyloviz.core.wizard.LoadDataSetWizardAction"/>
+ <attr name="iconBase" stringvalue="net/phyloviz/core/DataSetIcon.png"/>
+ <attr name="instanceCreate" methodvalue="org.openide.awt.Actions.alwaysEnabled"/>
+ <attr name="noIconInMenu" stringvalue="false"/>
+ <attr name="displayName" bundlevalue="net.phyloviz.core.Bundle#CTL_LoadDataSetAction"/>
+ </file>
+ </folder>
+ <folder name="Window">
+ <file name="net-phyloviz-core-explorer-DataSetExplorerAction.instance">
+ <attr name="component" methodvalue="net.phyloviz.core.explorer.DataSetExplorerTopComponent.findInstance"/>
+ <attr name="displayName" bundlevalue="net.phyloviz.core.explorer.Bundle#CTL_DataSetExplorerAction"/>
+ <attr name="instanceCreate" methodvalue="org.openide.windows.TopComponent.openAction"/>
+ </file>
+ </folder>
+ <folder name="PHYLOViZ">
+ <folder name="DataModel">
+ <file name="org-openide-actions-SaveAction.instance">
+ <attr name="instanceCreate" methodvalue="org.openide.awt.Actions.context"/>
+ <attr name="delegate" newvalue="org.openide.actions.SaveAction"/>
+ <attr name="selectionType" stringvalue="EXACTLY_ONE"/>
+ <attr name="displayName" bundlevalue="org/openide/actions/Bundle#Save"/>
+ <attr name="noIconInMenu" boolvalue="true"/>
+ <attr name="type" stringvalue="org.openide.cookies.SaveCookie"/>
+ <attr name="position" intvalue="10"/>
+ </file>
+ </folder>
+ </folder>
+ </folder>
+ <folder name="Menu">
+ <folder name="File">
+ <file name="Separator3.instance_hidden"/>
+ <file name="net-phyloviz-core-wizard-LoadDataSetWizardAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/File/net-phyloviz-core-wizard-LoadDataSetWizardAction.instance"/>
+ <attr name="position" intvalue="0"/>
+ </file>
+ <file name="org-netbeans-modules-print-action-PageSetupAction.shadow_hidden"/>
+ <file name="org-netbeans-modules-print-action-PrintAction.shadow_hidden"/>
+ <file name="org-openide-actions-PageSetupAction.shadow_hidden"/>
+ <file name="org-openide-actions-PrintAction.shadow_hidden"/>
+ <file name="org-openide-actions-SaveAllAction.shadow_hidden"/>
+ <file name="org-openide-actions-SaveAsAction.shadow_hidden"/>
+ <file name="org-netbeans-modules-openfile-OpenFileAction.shadow_hidden"/>
+ <file name="org-netbeans-modules-openfile-RecentFileAction.shadow_hidden"/>
+ </folder>
+ <file name="Edit_hidden"/>
+ <file name="GoTo_hidden"/>
+ <folder name="Help">
+ <file name="netbeans-kb.url_hidden"/>
+ <file name="org-netbeans-modules-usersguide-master.xml_hidden"/>
+ <file name="shortcuts.xml_hidden"/>
+ </folder>
+ <folder name="View">
+ <file name="org-netbeans-core-actions-HTMLViewAction.shadow_hidden"/>
+ </folder>
+ <folder name="Window">
+ <file name="DataSetExplorerAction.shadow">
+ <attr name="originalFile" stringvalue="Actions/Window/net-phyloviz-core-explorer-DataSetExplorerAction.instance"/>
+ <attr name="position" intvalue="0"/>
+ </file>
+ <file name="SwitchToRecentDocumentAction.shadow_hidden"/>
+ <file name="org-netbeans-core-windows-actions-GlobalPropertiesAction.shadow_hidden"/>
+ </folder>
+ </folder>
+ <folder name="Services">
+ <folder name="AutoupdateType">
+ <file name="net_phyloviz_core_update_center.instance">
+ <attr name="displayName" bundlevalue="net.phyloviz.core.Bundle#Services/AutoupdateType/net_phyloviz_core_update_center.instance"/>
+ <attr name="enabled" boolvalue="true"/>
+ <attr name="instanceCreate" methodvalue="org.netbeans.modules.autoupdate.updateprovider.AutoupdateCatalogFactory.createUpdateProvider"/>
+ <attr name="instanceOf" stringvalue="org.netbeans.spi.autoupdate.UpdateProvider"/>
+ <attr name="url" bundlevalue="net.phyloviz.core.Bundle#net_phyloviz_core_update_center"/>
+ </file>
+ </folder>
+ </folder>
+ <file name="Toolbars_hidden"/>
+ <folder name="Windows2">
+ <folder name="Components">
+ <file name="DataSetExplorerTopComponent.settings" url="DataSetExplorerTopComponentSettings.xml"/>
+ </folder>
+ <folder name="Modes">
+ <folder name="explorer">
+ <file name="DataSetExplorerTopComponent.wstcref" url="DataSetExplorerTopComponentWstcref.xml"/>
+ </folder>
+ </folder>
+ </folder>
+</filesystem>
diff --git a/src/net/phyloviz/core/util/NodeFactory.java b/src/net/phyloviz/core/util/NodeFactory.java
new file mode 100644
index 0000000..0564ca4
--- /dev/null
+++ b/src/net/phyloviz/core/util/NodeFactory.java
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+package net.phyloviz.core.util;
+
+import org.openide.nodes.AbstractNode;
+
+/**
+ * This interface is defined for implementing the concept of a factory for nodes in an explorer viewer
+ * (factory pattern). The classes that implement this interface will be able to create
+ * a node (instance) for an explorer viewer.
+ *
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+public interface NodeFactory {
+
+ /**
+ * Allows to explore this instance in the context of an explorer viewer.
+ * @return Returns this instance as a node in the explorer view.
+ * @see AbstractNode
+ */
+ public AbstractNode getNode();
+}
diff --git a/src/net/phyloviz/core/util/PopulationFactory.java b/src/net/phyloviz/core/util/PopulationFactory.java
new file mode 100644
index 0000000..58fbf2c
--- /dev/null
+++ b/src/net/phyloviz/core/util/PopulationFactory.java
@@ -0,0 +1,85 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import net.phyloviz.core.data.Population;
+
+/**
+ * This class represents the concept of a factory for populations of isolates
+ * (factory pattern). An instance of this class can produce new populations of
+ * isolates, obtained from reading files with the description of the population
+ * of isolates.
+ *
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+public class PopulationFactory {
+
+ /**
+ * Returns a new population of isolates, obtained from reading files
+ * with the description of the population of isolates.
+ * @param r the reader of descriptions of isolates.
+ * @return a new population, obtained from <code>r</code>.
+ * @throws IOException if an I/O error occurs.
+ */
+ public Population loadPopulation(Reader r) throws IOException {
+
+ Population pop = new Population();
+ BufferedReader in = new BufferedReader(r);
+
+ String[] tokens = in.readLine().split("\t", -1);
+
+ // Store headers.
+ for (int i = 0; i < tokens.length; i++) {
+ pop.addColumn(tokens[i], null);
+ }
+
+ while (in.ready()) {
+ String s = in.readLine();
+ if (s == null)
+ break;
+
+ tokens = s.split("\t", -1);
+
+ pop.addIsolate(tokens);
+ }
+ in.close();
+
+ return pop;
+ }
+}
diff --git a/src/net/phyloviz/core/util/TypingFactory.java b/src/net/phyloviz/core/util/TypingFactory.java
new file mode 100644
index 0000000..b6eb12d
--- /dev/null
+++ b/src/net/phyloviz/core/util/TypingFactory.java
@@ -0,0 +1,92 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.util;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.net.URL;
+import net.phyloviz.core.data.AbstractProfile;
+import net.phyloviz.core.data.Population;
+import net.phyloviz.core.data.TypingData;
+
+/**
+ * This interface is defined for implementing the concept of a factory for
+ * typing data of profiles (factory pattern). The classes that implement this interface
+ * will be able to create typing data for a list of profiles.
+ *
+ * @author PHYLOViZ Team <phyloviz at gmail.com>
+ */
+public interface TypingFactory {
+
+ /**
+ * Returns a new typing data, obtained from reading files
+ * with the description of the profiles.
+ * @param r The reader of descriptions of the profiles.
+ * @return a new typing data, obtained from <code>r</code>.
+ * @throws IOException if an I/O error occurs.
+ */
+ public TypingData<? extends AbstractProfile> loadData(Reader r) throws IOException;
+
+ /**
+ * This method updates a typing data instance with the data given by a population.
+ * Each isolate from the considered population may be related to a
+ * profile of the considered typing data, if they match a specific identifier.
+ * Thus, the typing data is updated according to the isolates of the population.
+ * @param td the typing data to be updated.
+ * @param pop the population to be considered for update.
+ * @param key an index of a column in the table view of the population,
+ * where are the matching identifier.
+ * @return an updated version of the typing data.
+ * @throws IndexOutOfBoundsException if the index <code>key</code> is
+ * not valid in the table view of the population.
+ */
+ public TypingData<? extends AbstractProfile> integrateData(TypingData<? extends AbstractProfile> td, Population pop, int key);
+
+ /**
+ * This method provides a description (in HTML) for this kind of typing data.
+ *
+ * @return description (in HTML) for this kind of typing data.
+ */
+ public URL getDescription();
+
+ /**
+ * This method provides a file format description (in HTML) for this kind of typing data.
+ *
+ * @return file format description (in HTML) for this kind of typing data.
+ */
+ public URL getFormatDescription();
+
+}
diff --git a/src/net/phyloviz/core/wizard/Bundle.properties b/src/net/phyloviz/core/wizard/Bundle.properties
new file mode 100644
index 0000000..5a0d519
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/Bundle.properties
@@ -0,0 +1,13 @@
+LoadDataSetVisualPanel1.jTextField1.text=
+LoadDataSetVisualPanel1.jLabel1.text=Dataset Name:
+LoadDataSetVisualPanel1.jLabel2.text=Dataset Type:
+LoadDataSetVisualPanel2.jLabel1.text=File:
+LoadDataSetVisualPanel2.jTextField1.text=
+LoadDataSetVisualPanel2.jButton1.text=Browse...
+LoadDataSetVisualPanel3.jLabel1.text=File:
+LoadDataSetVisualPanel3.jButton1.text=Browse...
+LoadDataSetVisualPanel3.jTextField1.text=
+LoadDataSetVisualPanel3.jLabel2.text=Key:
+LoadDataSetVisualPanel3.jButton2.text=Update
+LoadDataSetVisualPanel1.jEditorPane1.contentType=text/html
+LoadDataSetVisualPanel2.jEditorPane1.contentType=text/html
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.form b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.form
new file mode 100644
index 0000000..4d02e0f
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.form
@@ -0,0 +1,144 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,56,0,0,2,0"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel2">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="First"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel3">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="West"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="0"/>
+ <Property name="rows" type="int" value="2"/>
+ <Property name="verticalGap" type="int" value="8"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel1.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="2" left="12" right="8" top="2"/>
+ </Border>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel2">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel1.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="2" left="12" right="8" top="2"/>
+ </Border>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel4">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="0"/>
+ <Property name="rows" type="int" value="2"/>
+ <Property name="verticalGap" type="int" value="8"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JTextField" name="jTextField1">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel1.jTextField1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JComboBox" name="jComboBox1">
+ <Properties>
+ <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection code="typeListModel" type="code"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel5">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="East"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="null"/>
+ </Property>
+ <Property name="horizontalScrollBarPolicy" type="int" value="31"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JEditorPane" name="jEditorPane1">
+ <Properties>
+ <Property name="background" type="java.awt.Color" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection component="jPanel5" name="background" type="property"/>
+ </Property>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="8" left="12" right="12" top="8"/>
+ </Border>
+ </Property>
+ <Property name="contentType" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel1.jEditorPane1.contentType" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ <Property name="editable" type="boolean" value="false"/>
+ <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[200, 200]"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.html b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.html
new file mode 100644
index 0000000..04a511e
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ </head>
+ <body>
+ To the developer: This Dataset type still lacks a description. Please create one
+ and add it in the appropriate place.
+ </body>
+</html>
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.java b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.java
new file mode 100644
index 0000000..4066447
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel1.java
@@ -0,0 +1,208 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.wizard;
+
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedList;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
+import javax.swing.text.html.HTMLDocument;
+import net.phyloviz.core.util.TypingFactory;
+import org.openide.util.Lookup;
+
+public final class LoadDataSetVisualPanel1 extends JPanel {
+
+ private DefaultComboBoxModel typeListModel;
+
+ /** Creates new form LoadDataSetVisualPanel1 */
+ public LoadDataSetVisualPanel1() {
+
+ typeListModel = new DefaultComboBoxModel();
+ LinkedList<TypingFactory> result = new LinkedList<TypingFactory>(Lookup.getDefault().lookupAll(TypingFactory.class));
+ Collections.sort(result, new Comparator<TypingFactory>() {
+
+ @Override
+ public int compare(TypingFactory o1, TypingFactory o2) {
+ String op1 = org.openide.util.NbBundle.getMessage(o1.getClass(), "TypingFactory.priority") ;
+ String op2 = org.openide.util.NbBundle.getMessage(o2.getClass(), "TypingFactory.priority") ;
+ int r = 0;
+ if (op1 != null && op2 != null)
+ r = op1.compareTo(op2);
+
+ return (r == 0) ? o1.toString().compareTo(o2.toString()) : r;
+ }
+
+ });
+ Iterator<? extends TypingFactory> ir = result.iterator();
+ while (ir.hasNext()) {
+ typeListModel.addElement(ir.next());
+ }
+
+ initComponents();
+
+ URL url = result.getFirst().getDescription();
+ if (url == null)
+ url = LoadDataSetVisualPanel1.class.getResource("LoadDataSetVisualPanel1.html");
+
+ try {
+ jEditorPane1.setPage(url);
+ } catch (IOException e) {
+ // Do nothing...
+ System.err.println(e.getMessage());
+ }
+
+ Font font = UIManager.getFont("Label.font");
+ String bodyRule = "body { font-family: " + font.getFamily() + "; "
+ + "font-size: " + font.getSize() + "pt; width: " + jPanel2.getParent().getSize().width + "px;}";
+ ((HTMLDocument) jEditorPane1.getDocument()).getStyleSheet().addRule(bodyRule);
+
+ jComboBox1.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent event) {
+ TypingFactory tf = (TypingFactory) jComboBox1.getSelectedItem();
+ URL url = tf.getDescription();
+ if (url == null)
+ url = LoadDataSetVisualPanel1.class.getResource("LoadDataSetVisualPanel1.html");
+
+ try {
+ jEditorPane1.setPage(url);
+ } catch (IOException e) {
+ // Do nothing...
+ System.err.println(e.getMessage());
+ }
+ Font font = UIManager.getFont("Label.font");
+ String bodyRule = "body { font-family: " + font.getFamily() + "; "
+ + "font-size: " + font.getSize() + "pt; width: " + jPanel2.getParent().getSize().width + "px;}";
+ ((HTMLDocument) jEditorPane1.getDocument()).getStyleSheet().addRule(bodyRule);
+ }
+ });
+ }
+
+ @Override
+ public String getName() {
+ return "Dataset";
+ }
+
+ public String getDatasetName() {
+ return jTextField1.getText();
+ }
+
+ public TypingFactory getTypingFactory() {
+ return (TypingFactory) jComboBox1.getSelectedItem();
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jPanel2 = new javax.swing.JPanel();
+ jPanel3 = new javax.swing.JPanel();
+ jLabel1 = new javax.swing.JLabel();
+ jLabel2 = new javax.swing.JLabel();
+ jPanel4 = new javax.swing.JPanel();
+ jTextField1 = new javax.swing.JTextField();
+ jComboBox1 = new javax.swing.JComboBox();
+ jPanel5 = new javax.swing.JPanel();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jEditorPane1 = new javax.swing.JEditorPane();
+
+ setLayout(new java.awt.BorderLayout());
+
+ jPanel2.setLayout(new java.awt.BorderLayout());
+
+ jPanel3.setLayout(new java.awt.GridLayout(2, 0, 0, 8));
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel1.class, "LoadDataSetVisualPanel1.jLabel1.text")); // NOI18N
+ jLabel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 12, 2, 8));
+ jPanel3.add(jLabel1);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel1.class, "LoadDataSetVisualPanel1.jLabel2.text")); // NOI18N
+ jLabel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 12, 2, 8));
+ jPanel3.add(jLabel2);
+
+ jPanel2.add(jPanel3, java.awt.BorderLayout.WEST);
+
+ jPanel4.setLayout(new java.awt.GridLayout(2, 0, 0, 8));
+
+ jTextField1.setText(org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel1.class, "LoadDataSetVisualPanel1.jTextField1.text")); // NOI18N
+ jPanel4.add(jTextField1);
+
+ jComboBox1.setModel(typeListModel);
+ jPanel4.add(jComboBox1);
+
+ jPanel2.add(jPanel4, java.awt.BorderLayout.CENTER);
+ jPanel2.add(jPanel5, java.awt.BorderLayout.EAST);
+
+ add(jPanel2, java.awt.BorderLayout.PAGE_START);
+
+ jScrollPane1.setBorder(null);
+ jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+
+ jEditorPane1.setBackground(jPanel5.getBackground());
+ jEditorPane1.setBorder(javax.swing.BorderFactory.createEmptyBorder(8, 12, 8, 12));
+ jEditorPane1.setContentType(org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel1.class, "LoadDataSetVisualPanel1.jEditorPane1.contentType")); // NOI18N
+ jEditorPane1.setEditable(false);
+ jEditorPane1.setMaximumSize(new java.awt.Dimension(200, 200));
+ jScrollPane1.setViewportView(jEditorPane1);
+
+ add(jScrollPane1, java.awt.BorderLayout.CENTER);
+ }// </editor-fold>//GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JComboBox jComboBox1;
+ private javax.swing.JEditorPane jEditorPane1;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JPanel jPanel3;
+ private javax.swing.JPanel jPanel4;
+ private javax.swing.JPanel jPanel5;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JTextField jTextField1;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.form b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.form
new file mode 100644
index 0000000..e7bfe6e
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.form
@@ -0,0 +1,148 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.4" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,94,0,0,2,18"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel2">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="First"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel3">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="West"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="0"/>
+ <Property name="rows" type="int" value="1"/>
+ <Property name="verticalGap" type="int" value="8"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel2.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="2" left="12" right="8" top="2"/>
+ </Border>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel4">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="0"/>
+ <Property name="rows" type="int" value="1"/>
+ <Property name="verticalGap" type="int" value="8"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JTextField" name="jTextField1">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel2.jTextField1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel5">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="8" right="0" top="0"/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="East"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="0"/>
+ <Property name="rows" type="int" value="1"/>
+ <Property name="verticalGap" type="int" value="8"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="jButton1">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel2.jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/>
+ </Events>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="null"/>
+ </Property>
+ <Property name="horizontalScrollBarPolicy" type="int" value="31"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JEditorPane" name="jEditorPane1">
+ <Properties>
+ <Property name="background" type="java.awt.Color" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection component="jPanel2" name="background" type="property"/>
+ </Property>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="8" left="12" right="12" top="8"/>
+ </Border>
+ </Property>
+ <Property name="contentType" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel2.jEditorPane1.contentType" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ <Property name="editable" type="boolean" value="false"/>
+ <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[200, 200]"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.html b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.html
new file mode 100644
index 0000000..9499596
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.html
@@ -0,0 +1,21 @@
+ Load a tab separated file with the first row containing column
+ headers (field names). The first column should be a Sequence Identifier,
+ such as the ST for MLST data. Other columns should be the different
+ loci used in the typing scheme.
+ Example of a MLST dataset for <i>Streptococcus dysgalactiae subspecies
+ equisimilis</i>.
+<br />
+<pre>
+ ST gki gtr murI mutS recP xpt yqiZ
+ 1 10 6 6 6 12 13 8
+ 2 5 4 4 1 2 15 2
+ 3 5 3 4 1 6 2 1
+ 4 2 2 4 1 8 7 2
+ 5 2 2 4 1 12 12 7
+ 6 1 3 1 1 1 1 4
+ 7 1 1 1 1 1 1 3
+ 8 1 1 1 1 1 1 4
+</pre>
+<br />
+ This files should not contain missing data. If any allele missing data
+ is found the entire line is discarded.
\ No newline at end of file
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.java b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.java
new file mode 100644
index 0000000..44e17bd
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel2.java
@@ -0,0 +1,175 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package net.phyloviz.core.wizard;
+
+import java.awt.Font;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
+import javax.swing.text.html.HTMLDocument;
+import org.openide.util.NbPreferences;
+
+public final class LoadDataSetVisualPanel2 extends JPanel {
+
+ /** Creates new form LoadDataSetVisualPanel2 */
+ public LoadDataSetVisualPanel2() {
+ initComponents();
+ }
+
+ protected void setDescription(URL url) {
+ if (url == null)
+ url = LoadDataSetVisualPanel2.class.getResource("LoadDataSetVisualPanel1.html");
+
+ try {
+ jEditorPane1.setPage(url);
+ } catch (IOException e) {
+ // Do nothing...
+ System.err.println(e.getMessage());
+ }
+ Font font = UIManager.getFont("Label.font");
+ String bodyRule = "body { font-family: " + font.getFamily() + "; "
+ + "font-size: " + font.getSize() + "pt; width: " + jPanel2.getSize().width + "px;}";
+ ((HTMLDocument) jEditorPane1.getDocument()).getStyleSheet().addRule(bodyRule);
+ }
+
+ @Override
+ public String getName() {
+ return "Typing Data";
+ }
+
+ public String getFilename() {
+ return jTextField1.getText();
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jPanel2 = new javax.swing.JPanel();
+ jPanel3 = new javax.swing.JPanel();
+ jLabel1 = new javax.swing.JLabel();
+ jPanel4 = new javax.swing.JPanel();
+ jTextField1 = new javax.swing.JTextField();
+ jPanel5 = new javax.swing.JPanel();
+ jButton1 = new javax.swing.JButton();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jEditorPane1 = new javax.swing.JEditorPane();
+
+ setLayout(new java.awt.BorderLayout());
+
+ jPanel2.setLayout(new java.awt.BorderLayout());
+
+ jPanel3.setLayout(new java.awt.GridLayout(1, 0, 0, 8));
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel2.class, "LoadDataSetVisualPanel2.jLabel1.text")); // NOI18N
+ jLabel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 12, 2, 8));
+ jPanel3.add(jLabel1);
+
+ jPanel2.add(jPanel3, java.awt.BorderLayout.WEST);
+
+ jPanel4.setLayout(new java.awt.GridLayout(1, 0, 0, 8));
+
+ jTextField1.setText(org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel2.class, "LoadDataSetVisualPanel2.jTextField1.text")); // NOI18N
+ jPanel4.add(jTextField1);
+
+ jPanel2.add(jPanel4, java.awt.BorderLayout.CENTER);
+
+ jPanel5.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 8, 0, 0));
+ jPanel5.setLayout(new java.awt.GridLayout(1, 0, 0, 8));
+
+ org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel2.class, "LoadDataSetVisualPanel2.jButton1.text")); // NOI18N
+ jButton1.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButton1ActionPerformed(evt);
+ }
+ });
+ jPanel5.add(jButton1);
+
+ jPanel2.add(jPanel5, java.awt.BorderLayout.EAST);
+
+ add(jPanel2, java.awt.BorderLayout.PAGE_START);
+
+ jScrollPane1.setBorder(null);
+ jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+
+ jEditorPane1.setBackground(jPanel2.getBackground());
+ jEditorPane1.setBorder(javax.swing.BorderFactory.createEmptyBorder(8, 12, 8, 12));
+ jEditorPane1.setContentType(org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel2.class, "LoadDataSetVisualPanel2.jEditorPane1.contentType")); // NOI18N
+ jEditorPane1.setEditable(false);
+ jEditorPane1.setMaximumSize(new java.awt.Dimension(200, 200));
+ jScrollPane1.setViewportView(jEditorPane1);
+
+ add(jScrollPane1, java.awt.BorderLayout.CENTER);
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
+ if (fc == null)
+ fc = new JFileChooser();
+ String dir = NbPreferences.forModule(LoadDataSetWizardAction.class).get("LAST_DIR", "");
+ if (dir != null)
+ fc.setCurrentDirectory(new File(dir));
+ int r = fc.showDialog(this, "Open");
+ if (r == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null) {
+ jTextField1.setText(fc.getSelectedFile().getAbsolutePath());
+ NbPreferences.forModule(LoadDataSetWizardAction.class).put("LAST_DIR", fc.getCurrentDirectory().getPath());
+ }
+ }//GEN-LAST:event_jButton1ActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton jButton1;
+ private javax.swing.JEditorPane jEditorPane1;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JPanel jPanel3;
+ private javax.swing.JPanel jPanel4;
+ private javax.swing.JPanel jPanel5;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JTextField jTextField1;
+ // End of variables declaration//GEN-END:variables
+
+ private JFileChooser fc;
+}
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.form b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.form
new file mode 100644
index 0000000..67e42dd
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.form
@@ -0,0 +1,173 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.4" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,94,0,0,2,18"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel3">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="First"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanel4">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="West"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="0"/>
+ <Property name="rows" type="int" value="2"/>
+ <Property name="verticalGap" type="int" value="8"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel3.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="2" left="12" right="8" top="2"/>
+ </Border>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel2">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel3.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="2" left="12" right="8" top="2"/>
+ </Border>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel5">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="0"/>
+ <Property name="rows" type="int" value="2"/>
+ <Property name="verticalGap" type="int" value="8"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JTextField" name="jTextField1">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel3.jTextField1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JComboBox" name="jComboBox1">
+ <Properties>
+ <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection code="keyListModel" type="code"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel6">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="8" right="0" top="0"/>
+ </Border>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="East"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="0"/>
+ <Property name="rows" type="int" value="2"/>
+ <Property name="verticalGap" type="int" value="8"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="jButton1">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel3.jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JButton" name="jButton2">
+ <Properties>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+ <ResourceString bundle="net/phyloviz/core/wizard/Bundle.properties" key="LoadDataSetVisualPanel3.jButton2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton2ActionPerformed"/>
+ </Events>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="null"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JEditorPane" name="jEditorPane1">
+ <Properties>
+ <Property name="background" type="java.awt.Color" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection component="jPanel3" name="background" type="property"/>
+ </Property>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="8" left="12" right="12" top="8"/>
+ </Border>
+ </Property>
+ <Property name="editable" type="boolean" value="false"/>
+ <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[200, 200]"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.html b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.html
new file mode 100644
index 0000000..0ff0c46
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.html
@@ -0,0 +1,10 @@
+If you have any type of ancillary data about the isolates (Demographic
+ information, Epidemiological information, Antibiotic Resistance, Gene
+ presence absence,etc) you can load a tab separated file to further
+ represent it on the algorithm. This file should be a tab separated file
+ with the first row with column headers (field names). One of the fields
+ should be the Sequence identifier. Choose this field in the Key drop
+ down menu to link the ancillary data to the allelic profile data. If the
+ field does not appear in the drop down menu press the Update button.
+ If you don't have any available data or don't wish do load any leave
+ this fields blank an press Finish.
\ No newline at end of file
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.java b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.java
new file mode 100644
index 0000000..05a9a05
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetVisualPanel3.java
@@ -0,0 +1,239 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.wizard;
+
+import java.awt.Font;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+import org.openide.util.NbPreferences;
+
+public final class LoadDataSetVisualPanel3 extends JPanel {
+
+ private DefaultComboBoxModel keyListModel;
+
+ /** Creates new form LoadDataSetVisualPanel2 */
+ public LoadDataSetVisualPanel3() {
+ keyListModel = new DefaultComboBoxModel();
+ initComponents();
+
+ try {
+ URL url = LoadDataSetVisualPanel1.class.getResource("LoadDataSetVisualPanel3.html");
+ jEditorPane1.setEditorKit(new HTMLEditorKit());
+ jEditorPane1.setPage(url);
+ Font font = UIManager.getFont("Label.font");
+ String bodyRule = "body { font-family: " + font.getFamily() + "; "
+ + "font-size: " + font.getSize() + "pt; width: " + jEditorPane1.getSize().width + "px;}";
+ ((HTMLDocument) jEditorPane1.getDocument()).getStyleSheet().addRule(bodyRule);
+ } catch (IOException e) {
+ // Do nothing...
+ System.err.println(e.getMessage());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Isolate Data";
+ }
+
+ public String getFilename() {
+ return jTextField1.getText();
+ }
+
+ public String getKey() {
+ return (String) jComboBox1.getSelectedItem();
+ }
+
+ public int getKeyIndex() {
+ return jComboBox1.getSelectedIndex();
+ }
+
+ private void updateKeyList(String[] result) {
+
+ keyListModel.removeAllElements();
+ if (result == null)
+ return;
+
+ for (int i = 0; i < result.length; i++)
+ keyListModel.addElement(result[i]);
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jPanel3 = new javax.swing.JPanel();
+ jPanel4 = new javax.swing.JPanel();
+ jLabel1 = new javax.swing.JLabel();
+ jLabel2 = new javax.swing.JLabel();
+ jPanel5 = new javax.swing.JPanel();
+ jTextField1 = new javax.swing.JTextField();
+ jComboBox1 = new javax.swing.JComboBox();
+ jPanel6 = new javax.swing.JPanel();
+ jButton1 = new javax.swing.JButton();
+ jButton2 = new javax.swing.JButton();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jEditorPane1 = new javax.swing.JEditorPane();
+
+ setLayout(new java.awt.BorderLayout());
+
+ jPanel3.setLayout(new java.awt.BorderLayout());
+
+ jPanel4.setLayout(new java.awt.GridLayout(2, 0, 0, 8));
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel3.class, "LoadDataSetVisualPanel3.jLabel1.text")); // NOI18N
+ jLabel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 12, 2, 8));
+ jPanel4.add(jLabel1);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel3.class, "LoadDataSetVisualPanel3.jLabel2.text")); // NOI18N
+ jLabel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 12, 2, 8));
+ jPanel4.add(jLabel2);
+
+ jPanel3.add(jPanel4, java.awt.BorderLayout.WEST);
+
+ jPanel5.setLayout(new java.awt.GridLayout(2, 0, 0, 8));
+
+ jTextField1.setText(org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel3.class, "LoadDataSetVisualPanel3.jTextField1.text")); // NOI18N
+ jPanel5.add(jTextField1);
+
+ jComboBox1.setModel(keyListModel);
+ jPanel5.add(jComboBox1);
+
+ jPanel3.add(jPanel5, java.awt.BorderLayout.CENTER);
+
+ jPanel6.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 8, 0, 0));
+ jPanel6.setLayout(new java.awt.GridLayout(2, 0, 0, 8));
+
+ org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel3.class, "LoadDataSetVisualPanel3.jButton1.text")); // NOI18N
+ jButton1.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButton1ActionPerformed(evt);
+ }
+ });
+ jPanel6.add(jButton1);
+
+ org.openide.awt.Mnemonics.setLocalizedText(jButton2, org.openide.util.NbBundle.getMessage(LoadDataSetVisualPanel3.class, "LoadDataSetVisualPanel3.jButton2.text")); // NOI18N
+ jButton2.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButton2ActionPerformed(evt);
+ }
+ });
+ jPanel6.add(jButton2);
+
+ jPanel3.add(jPanel6, java.awt.BorderLayout.EAST);
+
+ add(jPanel3, java.awt.BorderLayout.PAGE_START);
+
+ jScrollPane1.setBorder(null);
+
+ jEditorPane1.setBackground(jPanel3.getBackground());
+ jEditorPane1.setBorder(javax.swing.BorderFactory.createEmptyBorder(8, 12, 8, 12));
+ jEditorPane1.setEditable(false);
+ jEditorPane1.setMaximumSize(new java.awt.Dimension(200, 200));
+ jScrollPane1.setViewportView(jEditorPane1);
+
+ add(jScrollPane1, java.awt.BorderLayout.CENTER);
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
+ if (fc == null)
+ fc = new JFileChooser();
+ String dir = NbPreferences.forModule(LoadDataSetWizardAction.class).get("LAST_DIR", "");
+ if (dir != null)
+ fc.setCurrentDirectory(new File(dir));
+ int r = fc.showDialog(this, "Open");
+ if (r == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null) {
+ jTextField1.setText(fc.getSelectedFile().getAbsolutePath());
+ NbPreferences.forModule(LoadDataSetWizardAction.class).put("LAST_DIR", fc.getCurrentDirectory().getPath());
+
+ String[] result = null;
+ try {
+ // Get headers...
+ result = new BufferedReader(new FileReader(fc.getSelectedFile())).readLine().split("\t", -1);
+ } catch (FileNotFoundException ex) {
+ // If there is any problem with the file, we will check it later.
+ } catch (IOException ex) {
+ // If there is any problem with the file, we will check it later.
+ }
+ updateKeyList(result);
+ }
+}//GEN-LAST:event_jButton1ActionPerformed
+
+ private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
+
+ String[] result = null;
+ try {
+ // Get headers...
+ result = new BufferedReader(new FileReader(new File(jTextField1.getText()))).readLine().split("\t", -1);
+
+ } catch (FileNotFoundException ex) {
+ // If there is any problem with the file, we will check it later.
+ } catch (IOException ex) {
+ // If there is any problem with the file, we will check it later.
+ }
+ updateKeyList(result);
+ }//GEN-LAST:event_jButton2ActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton jButton1;
+ private javax.swing.JButton jButton2;
+ private javax.swing.JComboBox jComboBox1;
+ private javax.swing.JEditorPane jEditorPane1;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JPanel jPanel3;
+ private javax.swing.JPanel jPanel4;
+ private javax.swing.JPanel jPanel5;
+ private javax.swing.JPanel jPanel6;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JTextField jTextField1;
+ // End of variables declaration//GEN-END:variables
+
+ private JFileChooser fc;
+}
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetWizardAction.java b/src/net/phyloviz/core/wizard/LoadDataSetWizardAction.java
new file mode 100644
index 0000000..4ba0952
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetWizardAction.java
@@ -0,0 +1,125 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.wizard;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.event.ActionEvent;
+import java.text.MessageFormat;
+import javax.swing.AbstractAction;
+import javax.swing.JComponent;
+import org.openide.DialogDisplayer;
+import org.openide.WizardDescriptor;
+import org.openide.WizardDescriptor.Panel;
+import org.openide.util.HelpCtx;
+
+public final class LoadDataSetWizardAction extends AbstractAction {
+
+ private WizardDescriptor.Panel[] panels;
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ WizardDescriptor wizardDescriptor = new WizardDescriptor((Panel<WizardDescriptor>[]) getPanels());
+ // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
+ wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
+ wizardDescriptor.setTitle("Load a Dataset");
+ wizardDescriptor.putProperty("WizardPanel_contentBackgroundColor", Color.WHITE);
+ //wizardDescriptor.putProperty("WizardPanel_image", ImageUtilities.loadImage("net/phyloviz/core/wizard.gif", true));
+ wizardDescriptor.putProperty("WizardPanel_imageAligment", "center");
+ Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
+ dialog.setVisible(true);
+ dialog.toFront();
+ boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
+ if (!cancelled) {
+ // do something
+ }
+ }
+
+ /**
+ * Initialize panels representing individual wizard's steps and sets
+ * various properties for them influencing wizard appearance.
+ */
+ private WizardDescriptor.Panel[] getPanels() {
+ if (panels == null) {
+ panels = new WizardDescriptor.Panel[]{
+ new LoadDataSetWizardPanel1(),
+ new LoadDataSetWizardPanel2(),
+ new LoadDataSetWizardPanel3()
+ };
+ String[] steps = new String[panels.length];
+ for (int i = 0; i < panels.length; i++) {
+ Component c = panels[i].getComponent();
+ // Default step name to component name of panel. Mainly useful
+ // for getting the name of the target chooser to appear in the
+ // list of steps.
+ steps[i] = c.getName();
+ if (c instanceof JComponent) { // assume Swing components
+ JComponent jc = (JComponent) c;
+ // Sets step number of a component
+ // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
+ jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i));
+ // Sets steps names for a panel
+ jc.putClientProperty("WizardPanel_contentData", steps);
+ // Turn on subtitle creation on each step
+ jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE);
+ // Show steps on the left side with the image on the background
+ jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE);
+ // Turn on numbering of all steps
+ jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE);
+ }
+ }
+ }
+ return panels;
+ }
+
+ public String getName() {
+ return "Start Sample Wizard";
+ }
+
+ public String iconResource() {
+ return null;
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ protected boolean asynchronous() {
+ return false;
+ }
+}
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel1.java b/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel1.java
new file mode 100644
index 0000000..da11712
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel1.java
@@ -0,0 +1,134 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.wizard;
+
+import java.awt.Component;
+import javax.swing.event.ChangeListener;
+import net.phyloviz.core.util.TypingFactory;
+import org.openide.WizardDescriptor;
+import org.openide.WizardValidationException;
+import org.openide.util.HelpCtx;
+import org.openide.util.ImageUtilities;
+
+public class LoadDataSetWizardPanel1 implements WizardDescriptor.ValidatingPanel {
+
+ /**
+ * The visual component that displays this panel. If you need to access the
+ * component from this class, just use getComponent().
+ */
+ private LoadDataSetVisualPanel1 component;
+
+ // Get the visual component for the panel. In this template, the component
+ // is kept separate. This can be more efficient: if the wizard is created
+ // but never displayed, or not all panels are displayed, it is better to
+ // create only those which really need to be visible.
+ @Override
+ public Component getComponent() {
+ if (component == null) {
+ component = new LoadDataSetVisualPanel1();
+ }
+ return component;
+ }
+
+ @Override
+ public HelpCtx getHelp() {
+ // Show no Help button for this panel:
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ public final void addChangeListener(ChangeListener l) {
+ }
+
+ @Override
+ public final void removeChangeListener(ChangeListener l) {
+ }
+ /*
+ private final Set<ChangeListener> listeners = new HashSet<ChangeListener>(1); // or can use ChangeSupport in NB 6.0
+ public final void addChangeListener(ChangeListener l) {
+ synchronized (listeners) {
+ listeners.add(l);
+ }
+ }
+ public final void removeChangeListener(ChangeListener l) {
+ synchronized (listeners) {
+ listeners.remove(l);
+ }
+ }
+ protected final void fireChangeEvent() {
+ Iterator<ChangeListener> it;
+ synchronized (listeners) {
+ it = new HashSet<ChangeListener>(listeners).iterator();
+ }
+ ChangeEvent ev = new ChangeEvent(this);
+ while (it.hasNext()) {
+ it.next().stateChanged(ev);
+ }
+ }
+ */
+
+ // You can use a settings object to keep track of state. Normally the
+ // settings object will be the WizardDescriptor, so you can use
+ // WizardDescriptor.getProperty & putProperty to store information entered
+ // by the user.
+ @Override
+ public void readSettings(Object settings) {
+ ((WizardDescriptor) settings).putProperty("WizardPanel_image", ImageUtilities.loadImage("net/phyloviz/core/DataSetImage.png", true));
+ }
+
+ @Override
+ public void storeSettings(Object settings) {
+ ((WizardDescriptor) settings).putProperty("name", ((LoadDataSetVisualPanel1) getComponent()).getDatasetName());
+ ((WizardDescriptor) settings).putProperty("typing", ((LoadDataSetVisualPanel1) getComponent()).getTypingFactory());
+ }
+
+ @Override
+ public void validate() throws WizardValidationException {
+ String name = component.getDatasetName();
+ TypingFactory type = component.getTypingFactory();
+
+ if (name.equals(""))
+ throw new WizardValidationException(null, "Invalid name", null);
+
+ if (type == null)
+ throw new WizardValidationException(null, "Invalid type", null);
+ }
+}
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel2.java b/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel2.java
new file mode 100644
index 0000000..0b372e7
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel2.java
@@ -0,0 +1,128 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.wizard;
+
+import java.awt.Component;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import javax.swing.event.ChangeListener;
+import net.phyloviz.core.data.AbstractProfile;
+import net.phyloviz.core.data.TypingData;
+import net.phyloviz.core.util.TypingFactory;
+import org.openide.WizardDescriptor;
+import org.openide.WizardValidationException;
+import org.openide.awt.StatusDisplayer;
+import org.openide.util.HelpCtx;
+import org.openide.util.ImageUtilities;
+
+public class LoadDataSetWizardPanel2 implements WizardDescriptor.ValidatingPanel {
+
+ /**
+ * The visual component that displays this panel. If you need to access the
+ * component from this class, just use getComponent().
+ */
+ private Component component;
+ private TypingFactory tf;
+ private TypingData<? extends AbstractProfile> td;
+
+ // Get the visual component for the panel. In this template, the component
+ // is kept separate. This can be more efficient: if the wizard is created
+ // but never displayed, or not all panels are displayed, it is better to
+ // create only those which really need to be visible.
+ @Override
+ public Component getComponent() {
+ if (component == null) {
+ component = new LoadDataSetVisualPanel2();
+ }
+ return component;
+ }
+
+ @Override
+ public HelpCtx getHelp() {
+ // Show no Help button for this panel:
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ public final void addChangeListener(ChangeListener l) {
+ }
+
+ @Override
+ public final void removeChangeListener(ChangeListener l) {
+ }
+
+ // You can use a settings object to keep track of state. Normally the
+ // settings object will be the WizardDescriptor, so you can use
+ // WizardDescriptor.getProperty & putProperty to store information entered
+ // by the user.
+ @Override
+ public void readSettings(Object settings) {
+ ((WizardDescriptor) settings).putProperty("WizardPanel_image", ImageUtilities.loadImage("net/phyloviz/core/TypingImage.png", true));
+ tf = (TypingFactory) ((WizardDescriptor) settings).getProperty("typing");
+ ((LoadDataSetVisualPanel2) component).setDescription(tf.getFormatDescription());
+ }
+
+ @Override
+ public void storeSettings(Object settings) {
+ ((WizardDescriptor) settings).putProperty("td_filename", ((LoadDataSetVisualPanel2) getComponent()).getFilename());
+ ((WizardDescriptor) settings).putProperty("typing_factory", tf);
+ ((WizardDescriptor) settings).putProperty("typing_data", td);
+ }
+
+ @Override
+ public void validate() throws WizardValidationException {
+ try {
+ StatusDisplayer.getDefault().setStatusText("Loading typing data...");
+ td = tf.loadData(new FileReader(((LoadDataSetVisualPanel2) getComponent()).getFilename()));
+ td.setDescription(tf.toString());
+
+ } catch (FileNotFoundException ex) {
+ throw new WizardValidationException(null, "File not found: " + ex.getMessage(), null);
+ } catch (IOException ex) {
+ throw new WizardValidationException(null, "Error loading file: " + ex.getMessage(), null);
+ } catch (Exception ex) {
+ throw new WizardValidationException(null, "Fatal error: " + ex.getMessage(), null);
+ }
+ }
+}
diff --git a/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel3.java b/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel3.java
new file mode 100644
index 0000000..3a15d21
--- /dev/null
+++ b/src/net/phyloviz/core/wizard/LoadDataSetWizardPanel3.java
@@ -0,0 +1,152 @@
+/*-
+ * Copyright (c) 2011, PHYLOViZ Team <phyloviz at gmail.com>
+ * All rights reserved.
+ *
+ * This file is part of PHYLOViZ <http://www.phyloviz.net>.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Linking this library statically or dynamically with other modules is
+ * making a combined work based on this library. Thus, the terms and
+ * conditions of the GNU General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this library give you
+ * permission to link this library with independent modules to produce an
+ * executable, regardless of the license terms of these independent modules,
+ * and to copy and distribute the resulting executable under terms of your
+ * choice, provided that you also meet, for each linked independent module,
+ * the terms and conditions of the license of that module. An independent
+ * module is a module which is not derived from or based on this library.
+ * If you modify this library, you may extend this exception to your version
+ * of the library, but you are not obligated to do so. If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package net.phyloviz.core.wizard;
+
+import java.awt.Component;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import javax.swing.event.ChangeListener;
+import net.phyloviz.core.data.AbstractProfile;
+import net.phyloviz.core.data.DataSet;
+import net.phyloviz.core.data.DataSetTracker;
+import net.phyloviz.core.data.Population;
+import net.phyloviz.core.data.TypingData;
+import net.phyloviz.core.util.PopulationFactory;
+import net.phyloviz.core.util.TypingFactory;
+import org.openide.WizardDescriptor;
+import org.openide.WizardValidationException;
+import org.openide.awt.StatusDisplayer;
+import org.openide.util.HelpCtx;
+import org.openide.util.ImageUtilities;
+import org.openide.util.Lookup;
+
+public class LoadDataSetWizardPanel3 implements WizardDescriptor.ValidatingPanel {
+
+ /**
+ * The visual component that displays this panel. If you need to access the
+ * component from this class, just use getComponent().
+ */
+ private Component component;
+ private String dataSetName;
+
+ private TypingData<? extends AbstractProfile> td;
+ private TypingFactory tf;
+ private Population pop;
+ private DataSet ds;
+
+ // Get the visual component for the panel. In this template, the component
+ // is kept separate. This can be more efficient: if the wizard is created
+ // but never displayed, or not all panels are displayed, it is better to
+ // create only those which really need to be visible.
+ @Override
+ public Component getComponent() {
+ if (component == null) {
+ component = new LoadDataSetVisualPanel3();
+ }
+ return component;
+ }
+
+ @Override
+ public HelpCtx getHelp() {
+ // Show no Help button for this panel:
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ public final void addChangeListener(ChangeListener l) {
+ }
+
+ @Override
+ public final void removeChangeListener(ChangeListener l) {
+ }
+
+ // You can use a settings object to keep track of state. Normally the
+ // settings object will be the WizardDescriptor, so you can use
+ // WizardDescriptor.getProperty & putProperty to store information entered
+ // by the user.
+ @SuppressWarnings("unchecked")
+ @Override
+ public void readSettings(Object settings) {
+ ((WizardDescriptor) settings).putProperty("WizardPanel_image", ImageUtilities.loadImage("net/phyloviz/core/PopulationImage.png", true));
+ td = (TypingData<AbstractProfile>) ((WizardDescriptor) settings).getProperty("typing_data");
+ tf = (TypingFactory) ((WizardDescriptor) settings).getProperty("typing_factory");
+ dataSetName = (String) ((WizardDescriptor) settings).getProperty("name");
+ }
+
+ @Override
+ public void storeSettings(Object settings) {
+ }
+
+ @Override
+ public void validate() throws WizardValidationException {
+
+ ds = new DataSet(dataSetName);
+
+ String fileName = ((LoadDataSetVisualPanel3) getComponent()).getFilename();
+
+ if (fileName != null && (! fileName.equals(""))) {
+ try {
+ StatusDisplayer.getDefault().setStatusText("Loading isolate data...");
+ pop = new PopulationFactory().loadPopulation(new FileReader(fileName));
+ } catch (FileNotFoundException ex) {
+ throw new WizardValidationException(null, "File not found: " + ex.getMessage(), null);
+ } catch (IOException ex) {
+ throw new WizardValidationException(null, "Error loading file: " + ex.getMessage(), null);
+ } catch (Exception ex) {
+ throw new WizardValidationException(null, "Fatal error: " + ex.getMessage(), null);
+ }
+
+ int key = ((LoadDataSetVisualPanel3) getComponent()).getKeyIndex();
+
+ ds.add(pop);
+ StatusDisplayer.getDefault().setStatusText("Integrating data...");
+ td = tf.integrateData(td, pop, key);
+ ds.setPopKey(key);
+
+ }
+
+ ds.add(td);
+
+ Lookup.getDefault().lookup(DataSetTracker.class).add(ds);
+ StatusDisplayer.getDefault().setStatusText("Dataset loaded.");
+ }
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/phyloviz-core.git
More information about the debian-med-commit
mailing list