<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

<?xml-stylesheet href="../nbbuild/javadoctools/apichanges.xsl" type="text/xsl"?>
<!DOCTYPE apichanges PUBLIC "-//NetBeans//DTD API changes list 1.0//EN" "../nbbuild/javadoctools/apichanges.dtd">

<!-- INFO FOR PEOPLE ADDING CHANGES:
[most of contents snipped - see openide's apichanges for how-to instructions]
<change>
    <api name="compiler"/>
    <summary>Some brief description here, can use <b>XHTML</b></summary>
    <version major="1" minor="99"/>
    <date day="13" month="6" year="2001"/>
    <author login="jrhacker"/>
    <compatibility addition="yes"/>
    <description>
        The main description of the change here.
        Again can use full <b>XHTML</b> as needed.
    </description>
    <class package="org.openide.compiler" name="DoWhatIWantCompiler"/>
    <issue number="14309"/>
</change>
-->

<apichanges>

<!-- First, a list of API names you may use: -->
<apidefs>
        <apidef name="ViewModelAPI">View Model API</apidef>
</apidefs>

<!-- ACTUAL CHANGES BEGIN HERE: -->

<changes>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Support for pop-up menu actions fixed.</summary>
        <date day="29" month="4" year="2004"/>
        <author login="jjancura"/>
        <compatibility>
            <p>
                Incompatile changes (additions / removals).
            </p>
        </compatibility>
        <description>
            Support for different models in multiselection has been added. 
        </description>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>TreeModel.getChildrenCount (Object node) method added.</summary>
        <date day="23" month="7" year="2004"/>
        <author login="jjancura"/>
        <compatibility addition="yes"/>
        <description>
                TreeModel uses indexed approach (getChildren (Object node, int from, int to). But 
                the children count has not been accesible through the API. This was important problem.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="TreeModel" />
        <issue number="46368"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Support for synchronous and asynchronous ViewModels implementation fixed.</summary>
        <date day="7" month="1" year="2005"/>
        <author login="jjancura"/>
        <compatibility binary="incompatible" source="incompatible" deletion="yes" modification="yes"/>
        <description>
                Support for synchronous and asynchronous ViewModels implementations is one of the major 
                ViewModel API requirements. During fixing of #46614 (toString update should not run 
                in AWT thread) I have realized, that current support for asynchronous ViewModels 
                implementations is not usable. This change fixes the problem:
                    1) ComputingException, and NoInformationException removed - as completely useless.
                    2) All methods throwing these exceptions changed.
                    3) New ViewModel implementation supports asynchronous model only. Its fast and safe.
                How to update your code using these exceptions:
                    Old code:
                    public Object getValueAt (Object row, String columnId) throws ComputingException {
                        if (....)
                            throw new ComputingException ();
                        ...
                    }
                    
                    Fixed code:
                    public Object getValueAt (Object row, String columnId) {
                        if (....)
                            return "Computing";
                        ...
                    }
        </description>
        <issue number="53073"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Access to tree node expansion added.</summary>
        <date day="13" month="1" year="2005"/>
        <author login="jjancura"/>
        <compatibility binary="incompatible" source="incompatible" deletion="yes" addition="yes" modification="yes"/>
        <description>
                This change has been done to cover user requirement #46167.
                List of changes:
                    1) new TreeExpansionModel introduced
                    2) new class Models.TreeFeatures contains tree expansion methods.
                During implementation of this user requirement I have discovered important problem in ViewModel API. 
                There is no possibility to add a new model to it. List of changes fixing this problem:
                    1) Models.createView (...) and Models.setModelsToView (...) methods do not use fixed set of models as parameters,
                       but they use Models.CompoundModel.
                    2) Models.CompoundModel is final class implementing all currently supported models. The only way how to create
                       a new instance of it is Models.createCompoundModel (List listOfModels). It allows future additions of new
                       models.
                    3) Methods Models.createCompoundTreeModel (...), Models.createCompoundNodeModel (...), 
                       Models.createCompoundTableModel (...), Models.createCompoundNodeActionsProvider (...), and field
                       Models.EMPTY_TREE_MODEL has been removed as useless.
                How to update your code using these exceptions:
                    No changes required for most of clients. You should change your code only if you are providing some 
                    new view based on ViewModel. In this case you should put all your model instances to one list, 
                    and call Models.createCompountModel (list), in place of calling create*Model* methods.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="Models" />
        <class package="org.netbeans.spi.viewmodel" name="TreeExpansionModel" />
        <issue number="46167"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>I need to add TreeModelEvent to ViewModelAPI.</summary>
        <date day="31" month="3" year="2005"/>
        <author login="jjancura"/>
        <compatibility binary="incompatible" source="incompatible" deletion="yes" addition="yes" modification="yes"/>
        <description>
            NB4.0 version of ViewModelAPI had several event firing related issues:

            1) It supported two types of changes only:
                i) whole tree has been changed notification
                ii) node and all subnodes change notification
                There where no support for small grained changes (one table cell change).

            2) The same listener type (TreeModelListener) has been used for all model types (TreeModel, NodeModel, ...)
            3) There was no TreeModelEvent, so evolving of this api was problematic.

            I have done folowing incompatible api change, to fix this problem:

            1) TreeModelListener has been renamed to ModelListener (Because its used for other models too).
            2) ModelEvent class has been added.
            3) Two methods removed from TreeModelListener:
                public void treeNodeChanged (Object node);
                public void treeNodeChanged (TreeModelEvent event);
            and replaced by folowing method:
                public void modelChanged (ModelEvent event);
            4) three innerclasses added to ModelEvent
                TreeChanged
                TableValueChanged
                NodeChanged
            These three innerclasses are designed to support firing of all kinds of model changes.
            TreeChanged - Designed to notify about chages of whole tree content / structure. This event has no parameters.
            TableValueChanged - Designed to notify about chages of one cell in table. Two parameters: Object row, String columnID
            NodeChanged - Designed to notify about chages of one node - icon and display name. One parameter: Object node.
        </description>
        <issue number="57273"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>ModelEvent enhanced with more fine-grained changes</summary>
        <version major="1" minor="6"/>
        <date day="21" month="7" year="2005"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            NodeChanged events need to distinguish what node property has changed. Mask constant were added for
            display name, icon, short description and children properties. By default, mask that aggregates all
            these properties is used - to assure compatibility.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="ModelEvent" />
        <issue number="60499"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>CompoundModel enhanced with a possibility to set help ID.</summary>
        <version major="1" minor="7"/>
        <date day="25" month="8" year="2005"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            In order to have a help ID defined for the GUI component that is
            created from the compound model, it's necessary to be able to set
            that help ID on the compound model instance.
            Two methods are added for that purpose:
            <code>CompoundModel Models.createCompoundModel (List, String)</code>
            and <code>String CompoundModel.getHelpId()</code>.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="Models" />
        <issue number="62617"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>getDisplayedMnemonic() method added to ColumnModel.</summary>
        <version major="1" minor="11"/>
        <date day="30" month="1" year="2006"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            In order to be able to provide mnemonics for columns in tree table views,
            <code>Character ColumnModel.getDisplayedMnemonic()</code> method was
            added to ColumnModel class.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="ColumnModel" />
        <issue number="71858"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Extension to NodeModel.</summary>
        <version major="1" minor="12"/>
        <date day="6" month="6" year="2007"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            Add ability to in-place rename and copy/paste functionality to nodes
            in debugger views. Also, the models needs to have a way to provide
            an icon with arbitrary extension. Therefore following methods are
            provided with new <code>ExtendedNodeModel</code> and <code>ExtendedNodeModelFilter</code> interfaces
            and are also added into <code>CompoundModel</code>:
            <code>canRename()</code>, <code>canCopy()</code>, <code>canCut()</code>,
            <code>clipboardCopy()</code>, <code>clipboardCut()</code>, <code>getPasteTypes()</code>,
            <code>setName()</code>, <code>getIconBaseWithExtension()</code>.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="ExtendedNodeModel" />
        <class package="org.netbeans.spi.viewmodel" name="ExtendedNodeModelFilter" />
        <class package="org.netbeans.spi.viewmodel" name="Models" />
        <issue number="104281"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Extension to NodeModel.</summary>
        <version major="1" minor="15"/>
        <date day="2" month="6" year="2008"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            This API change is necessary for the redesign of the debugger UI and
            to be able to better control node expansions.
            <p>
                Added classes:<br/>
                <code>org.netbeans.spi.viewmodel.TreeExpansionModelFilter</code>
            </p>
            <p>
                Changed classes:<br/>
                <code>Models.TreeFeatures</code> - final class with a private
                constructor changed to an abstract class.
            </p>
            <p>
                Added methods:<br/>
                <code>Models.createNodes()</code>,
            </p>
            <p>
                Added fields:<br/>
                <code>ModelEvent.EXPANSION_MASK</code>
            </p>
        </description>
        <class package="org.netbeans.spi.viewmodel" name="TreeExpansionModelFilter" />
        <class package="org.netbeans.spi.viewmodel" name="Models" />
        <issue number="136099"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Check extension to NodeModel.</summary>
        <version major="1" minor="17"/>
        <date day="8" month="3" year="2009"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            This API change allows to display check-boxes next to the node icons
            in the tree column.
            <p>
                Added classes:<br/>
                <code>org.netbeans.spi.viewmodel.CheckNodeModel</code>,
                <code>org.netbeans.spi.viewmodel.CheckNodeModelFilter</code>
            </p>
        </description>
        <class package="org.netbeans.spi.viewmodel" name="CheckNodeModel" />
        <class package="org.netbeans.spi.viewmodel" name="CheckNodeModelFilter" />
        <issue number="159545"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Check extension to NodeModel.</summary>
        <version major="1" minor="19"/>
        <date day="1" month="9" year="2009"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            This API change allows to change a node selection in the tree table view.
            SelectionChanged event is used to select a set of nodes (rows).
            <p>
                Added classes:<br/>
                <code>org.netbeans.spi.viewmodel.ModelEvent.SelectionChanged</code>,
            </p>
        </description>
        <class package="org.netbeans.spi.viewmodel" name="ModelEvent" />
        <issue number="171194"/>
    </change>
        <change>
        <api name="ViewModelAPI"/>
        <summary>Introduction of AsynchronousModelFilter.</summary>
        <version major="1" minor="20"/>
        <date day="25" month="9" year="2009"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            This API introduced AsynchronousModelFilter that
            can be used by clients to override the default threading of their model implementations.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="AsynchronousModelFilter" />
        <issue number="172694"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Drag and Drop support.</summary>
        <version major="1" minor="24"/>
        <date day="4" month="12" year="2009"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            This API introduce DnDNodeModel and DnDNodeModelFilter that
            can be used by clients to implement Drag and Drop.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="DnDNodeModel" />
        <class package="org.netbeans.spi.viewmodel" name="DnDNodeModelFilter" />
        <issue number="177506"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Drag and Drop support.</summary>
        <version major="1" minor="25"/>
        <date day="15" month="12" year="2009"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            This API introduce ReorderableTreeModel and ReorderableTreeModelFilter
            that can be used to alter the order of children nodes.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="ReorderableTreeModel" />
        <class package="org.netbeans.spi.viewmodel" name="ReorderableTreeModelFilter" />
        <issue number="178301"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Custom table cell renderers and editors.</summary>
        <version major="1" minor="28"/>
        <date day="7" month="6" year="2010"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            This API introduce TableRendererModel and TableRendererModelFilter
            that can be used to provide custom table cell renderers and cell editors.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="TableRendererModel" />
        <class package="org.netbeans.spi.viewmodel" name="TableRendererModelFilter" />
        <issue number="186672"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Separate the value and HTML value and allow custom property editors.</summary>
        <version major="1" minor="42"/>
        <date day="30" month="4" year="2013"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            So far the HTML value is automatically retrieved from the value provided
            by the <code>TableModel</code> when the value is a <code>String</code>
            and contains HTML code. This is not flexible enough and therefore
            we separate the value and HTML value by introduction of <code>TableHTMLModel</code>
            and <code>TableHTMLModelFilter</code>.<br/>
            In addition to that, this API change also brings a prossibility
            to provide custom property editor, separately for every value.
            Two interfaces are introduced for this purpose: <code>TablePropertyEditorsModel</code>
            and <code>TablePropertyEditorsModelFilter</code>.<br/>
            This also implies, that <code>Models.CompoundModel</code> now implements
            <code>TableHTMLModel</code> and <code>TablePropertyEditorsModel</code>.<br/>
            In order to be able to fire changes in HTML value and also in r/w state,
            an additional constructor of <code>ModelEvent.TableValueChanged</code>
            is added, which takes the change mask. Three change masks are defined:
            <code>VALUE_MASK</code>, <code>HTML_VALUE_MASK</code> and <code>IS_READ_ONLY_MASK</code>.
            To get the change mask, <code>ModelEvent.TableValueChanged.getChange()</code>
            method is added.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="TableHTMLModel" />
        <class package="org.netbeans.spi.viewmodel" name="TableHTMLModelFilter" />
        <class package="org.netbeans.spi.viewmodel" name="TablePropertyEditorsModel" />
        <class package="org.netbeans.spi.viewmodel" name="TablePropertyEditorsModelFilter" />
        <class package="org.netbeans.spi.viewmodel" name="ModelEvent" />
        <issue number="228909"/>
    </change>
    <change>
        <api name="ViewModelAPI"/>
        <summary>Add an abstract children caching model.</summary>
        <version major="1" minor="49"/>
        <date day="28" month="11" year="2014"/>
        <author login="mentlicher"/>
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
        <description>
            Views that show asynchronously loaded children nodes, have problems
            with visible refreshes of the children tree.
            <code>CachedChildrenTreeModel</code> is introduced to allow seamless
            refresh of children tree.
        </description>
        <class package="org.netbeans.spi.viewmodel" name="CachedChildrenTreeModel" />
        <issue number="248775"/>
    </change>


</changes>

  <!-- Now the surrounding HTML text and document structure: -->

  <htmlcontents>
<!--

                            NO NO NO NO NO!

         ==============>    DO NOT EDIT ME!  <======================

          AUTOMATICALLY GENERATED FROM APICHANGES.XML, DO NOT EDIT

                SEE xml/api/doc/changes/apichanges.xml

-->
    <head>
      <title>View Model API changes by date</title>
      <link rel="stylesheet" href="prose.css" type="text/css"/>
    </head>
    <body>

<p class="overviewlink"><a href="overview-summary.html">Overview</a></p>

<h1>Introduction</h1>

<p>This document lists changes made to the View Model APIs. Please ask on the 
    <code>nbdev@netbeans.org</code>
    mailing list if you have any questions about the details of a
    change, or are wondering how to convert existing code to be compatible.
</p>

      <hr/><standard-changelists module-code-name="org.netbeans.spi.viewmodel/2"/>

      <hr/><p>@FOOTER@</p>

    </body>
  </htmlcontents>
</apichanges>
