View Javadoc
1   /*
2    * Copyright 2013-2023 Medical Information Systems Research Group (https://medical.zcu.cz),
3    * Department of Computer Science and Engineering, University of West Bohemia.
4    * Address: Univerzitni 8, 306 14 Plzen, Czech Republic.
5    *
6    * This file is part of Sparkle project.
7    *
8    * Sparkle is free software: you can redistribute it and/or modify
9    * it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License.
11   *
12   * Sparkle is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15   * GNU General Public License for more details.
16   *
17   * You should have received a copy of the GNU General Public License
18   * along with Sparkle. If not, see <http://www.gnu.org/licenses/>.
19   */
20  package cz.zcu.mre.sparkle.gui.tools;
21  
22  import cz.zcu.mre.sparkle.data.AbstractTermsStorage.StorageChangeListener;
23  import cz.zcu.mre.sparkle.data.AbstractTermsStorage.WeakStorageChangeListener;
24  import javafx.beans.InvalidationListener;
25  import javafx.beans.WeakInvalidationListener;
26  import javafx.beans.value.ChangeListener;
27  import javafx.beans.value.WeakChangeListener;
28  import javafx.collections.*;
29  import javafx.event.Event;
30  import javafx.event.EventHandler;
31  import javafx.event.WeakEventHandler;
32  import java.io.Serializable;
33  import java.util.LinkedList;
34  
35  /**
36   * Třída definující objekt uchovávající reference na objekty posluchačů tak
37   * dlouho, dokud existuje reference na něj samotný. Snaží se zabránit paměťovým
38   * únikům vzniklým situací, kdy objekt zodpovědný za vytvoření posluchače
39   * zapomene posluchače odebrat.
40   *
41   * @author Jan Smucr
42   * @author Klara Hlavacova
43   * @author Petr Vcelak (vcelak@kiv.zcu.cz)
44   */
45  public final class ReferenceKeeper {
46  
47      private final LinkedList<Object> objects = new LinkedList<>();
48  
49      private <X> X add(final X o) {
50          objects.add(o);
51          return o;
52      }
53  
54      public final <X> WeakChangeListener<X> toWeak(final ChangeListener<X> listener) {
55          return new WeakChangeListener<>(add(listener));
56      }
57  
58      public final WeakInvalidationListener toWeak(final InvalidationListener listener) {
59          return new WeakInvalidationListener(add(listener));
60      }
61  
62      public final <X> WeakListChangeListener<X> toWeak(final ListChangeListener<X> listener) {
63          return new WeakListChangeListener<>(add(listener));
64      }
65  
66      public final <K, V> WeakMapChangeListener<K, V> toWeak(final MapChangeListener<K, V> listener) {
67          return new WeakMapChangeListener<>(add(listener));
68      }
69  
70      public final <X> WeakSetChangeListener<X> toWeak(final SetChangeListener<X> listener) {
71          return new WeakSetChangeListener<>(add(listener));
72      }
73  
74      public final <X extends Event> WeakEventHandler<X> toWeak(final EventHandler<X> handler) {
75          return new WeakEventHandler<>(add(handler));
76      }
77  
78      public final <X extends Serializable> WeakStorageChangeListener<X> toWeak(final StorageChangeListener<X> listener) {
79          return new WeakStorageChangeListener<>(add(listener));
80      }
81  
82  }