View Javadoc

1   /**
2    * Copyright 2009 Timothy Johnston Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
3    * file except in compliance with the License. You may obtain a copy of the License at
4    * 
5    * http://www.apache.org/licenses/LICENSE-2.0
6    * 
7    * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
8    * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
9    * specific language governing permissions and limitations under the License.
10   */
11  package com.timjohnstondev.unitconverter.view.listener;
12  
13  import java.awt.event.MouseAdapter;
14  import java.awt.event.MouseEvent;
15  import javax.swing.DefaultListModel;
16  import javax.swing.JList;
17  import com.timjohnstondev.unitconverter.controller.ModelController;
18  
19  /**
20   * This listener allows reordering of a {@link JList} that is backed by a {@link DefaultListModel}.
21   */
22  public class ReorderAdapter extends MouseAdapter
23  {
24    private ModelController modelController;
25    private JList list;
26    private int pressIndex;
27    private int releaseIndex;
28  
29    /**
30     * @param newController controller
31     * @param listToReorder list
32     */
33    public ReorderAdapter(final ModelController newController, final JList listToReorder)
34    {
35      if (!(listToReorder.getModel() instanceof DefaultListModel)) { throw new IllegalArgumentException(
36          "List must have a DefaultListModel"); }
37      modelController = newController;
38      list = listToReorder;
39    }
40  
41    @Override
42    public final void mousePressed(final MouseEvent e)
43    {
44      pressIndex = list.locationToIndex(e.getPoint());
45    }
46  
47    @Override
48    public final void mouseReleased(final MouseEvent e)
49    {
50      releaseIndex = list.locationToIndex(e.getPoint());
51      if (releaseIndex != pressIndex && releaseIndex != -1)
52      {
53        reorder();
54        setPropertyOrderPreferences();
55      }
56    }
57  
58    @Override
59    public final void mouseDragged(final MouseEvent e)
60    {
61      mouseReleased(e);
62      pressIndex = releaseIndex;
63    }
64  
65    private void reorder()
66    {
67      final DefaultListModel model = (DefaultListModel) list.getModel();
68      final Object dragee = model.elementAt(pressIndex);
69      model.removeElementAt(pressIndex);
70      model.insertElementAt(dragee, releaseIndex);
71    }
72  
73    private void setPropertyOrderPreferences()
74    {
75      modelController.setPropertyOrderPreferences(list);
76    }
77  }