Ignore:
Timestamp:
Jan 10, 2013, 12:12:01 AM (12 years ago)
Author:
alloc
Message:
 
Location:
AE/installer2/src/net/oni2/aeinstaller/gui
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • AE/installer2/src/net/oni2/aeinstaller/gui/HTMLLinkLabel.java

    r593 r600  
    5555                                                Desktop.getDesktop().browse(e.getURL().toURI());
    5656                                        } catch (IOException e1) {
    57                                                 // TODO Auto-generated catch block
    5857                                                e1.printStackTrace();
    5958                                        } catch (URISyntaxException e1) {
    60                                                 // TODO Auto-generated catch block
    6159                                                e1.printStackTrace();
    6260                                        }
  • AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java

    r596 r600  
    11package net.oni2.aeinstaller.gui;
    22
    3 import java.awt.Frame;
    43import java.util.ArrayList;
    5 import java.util.Comparator;
    64import java.util.List;
    75import java.util.ResourceBundle;
    86import java.util.TreeMap;
    9 
     7import java.util.TreeSet;
     8
     9import javax.swing.JButton;
    1010import javax.swing.JComboBox;
    1111import javax.swing.JComponent;
     
    2626import net.oni2.aeinstaller.backend.Settings;
    2727import net.oni2.aeinstaller.backend.Settings.Platform;
     28import net.oni2.aeinstaller.backend.SizeFormatter;
    2829import net.oni2.aeinstaller.backend.depot.DepotCacheUpdateProgressListener;
    29 import net.oni2.aeinstaller.backend.depot.DepotConfig;
    3030import net.oni2.aeinstaller.backend.depot.DepotManager;
    31 import net.oni2.aeinstaller.backend.depot.model.NodeMod;
    32 import net.oni2.aeinstaller.backend.depot.model.TaxonomyTerm;
    33 import net.oni2.aeinstaller.backend.depot.model.TaxonomyVocabulary;
     31import net.oni2.aeinstaller.backend.mods.Mod;
     32import net.oni2.aeinstaller.backend.mods.ModManager;
     33import net.oni2.aeinstaller.backend.mods.Type;
     34import net.oni2.aeinstaller.backend.oni.InstallProgressListener;
     35import net.oni2.aeinstaller.backend.oni.Installer;
    3436import net.oni2.aeinstaller.gui.about.AboutDialog;
     37import net.oni2.aeinstaller.gui.modtable.DownloadSizeListener;
    3538import net.oni2.aeinstaller.gui.modtable.ModTableFilter;
    3639import net.oni2.aeinstaller.gui.modtable.ModTableModel;
     
    4750 * @author Christian Illy
    4851 */
    49 public class MainWin extends JFrame implements ApplicationListener {
     52public class MainWin extends JFrame implements ApplicationListener,
     53                DownloadSizeListener {
    5054        private static final long serialVersionUID = -4027395051382659650L;
    5155
     
    6367        private ModTableModel model;
    6468        private TableRowSorter<ModTableModel> sorter;
     69        private JLabel lblDownloadSizeVal;
    6570
    6671        private JLabel lblSubmitterVal;
    6772        private JLabel lblCreatorVal;
    6873        private JLabel lblFilesVal;
    69         private JLabel lblIdVal;
    7074        private HTMLLinkLabel lblDescriptionVal;
     75
     76        private JButton btnInstall;
    7177
    7278        /**
     
    7985
    8086                contents.setDividerLocation(400);
    81                 initTable();
    82                 initModTypeBox();
    8387
    8488                if (Settings.getPlatform() == Platform.MACOS) {
    8589                        mainMenu.setVisible(false);
    8690                }
     91
     92                getRootPane().setDefaultButton(btnInstall);
    8793        }
    8894
     
    9096                cmbModTypes.removeAllItems();
    9197
    92                 TaxonomyVocabulary tv = DepotManager.getInstance().getVocabulary(
    93                                 DepotConfig.getVocabularyName_ModType());
    94                 if (tv == null)
    95                         return;
    96 
    97                 int vid = tv.getVid();
    98                 TreeMap<String, TaxonomyTerm> terms = new TreeMap<String, TaxonomyTerm>();
    99                 terms.put(" ", new TaxonomyTerm(-1, vid, "-All-"));
    100                 for (TaxonomyTerm t : DepotManager.getInstance()
    101                                 .getTaxonomyTermsByVocabulary(vid)) {
    102                         terms.put(t.getName(), t);
    103                 }
    104                 for (TaxonomyTerm t : terms.values()) {
     98                TreeMap<String, Type> types = new TreeMap<String, Type>();
     99                for (Type t : ModManager.getInstance().getTypesWithContent()) {
     100                        types.put(t.getName(), t);
     101                }
     102                for (Type t : types.values()) {
    105103                        cmbModTypes.addItem(t);
    106104                }
     
    121119                                                        int modelRow = tblMods
    122120                                                                        .convertRowIndexToModel(viewRow);
    123                                                         NodeMod mod = (NodeMod) model.getValueAt(modelRow,
    124                                                                         -1);
     121                                                        Mod mod = (Mod) model.getValueAt(modelRow, -1);
    125122                                                        modSelection(mod);
    126123                                                }
     
    133130
    134131                model = new ModTableModel();
     132                model.addDownloadSizeListener(this);
    135133
    136134                tblMods.setModel(model);
     
    139137                tblMods.setRowSorter(sorter);
    140138
    141                 sorter.setRowFilter(new ModTableFilter(-1));
     139                sorter.setRowFilter(new ModTableFilter(null));
    142140
    143141                sorter.setSortable(2, false);
    144                 sorter.setComparator(1, new Comparator<String>() {
    145 
    146                         @Override
    147                         public int compare(String o1, String o2) {
    148                                 int i1 = Integer.parseInt(o1);
    149                                 int i2 = Integer.parseInt(o2);
    150                                 return i1 - i2;
    151                         }
    152                 });
    153142
    154143                List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
     
    171160                                JOptionPane.QUESTION_MESSAGE);
    172161                return res == JOptionPane.YES_OPTION;
    173         }
    174 
    175         private boolean closeFrames() {
    176                 System.gc();
    177                 for (Frame f : Frame.getFrames()) {
    178                         if (f != this)
    179                                 f.dispose();
    180                 }
    181                 return true;
    182162        }
    183163
     
    206186                                                }
    207187                                        });
    208                         model.reloadData();
     188                        ModManager.getInstance().init();
     189                        initTable();
    209190                        initModTypeBox();
     191
    210192                        tblMods.setVisible(true);
    211193                        DepotManager.getInstance().printStats();
     
    244226        @SuppressWarnings("unused")
    245227        private void loadConfig() {
    246                 // TODO Auto-generated method stub
     228                // TODO method stub
    247229                JOptionPane.showMessageDialog(this, "loadConfig", "todo",
    248230                                JOptionPane.INFORMATION_MESSAGE);
     
    251233        @SuppressWarnings("unused")
    252234        private void saveConfig() {
    253                 // TODO Auto-generated method stub
     235                // TODO method stub
    254236                JOptionPane.showMessageDialog(this, "saveConfig", "todo",
    255237                                JOptionPane.INFORMATION_MESSAGE);
    256238        }
    257239
    258         @SuppressWarnings("unused")
    259         private void reglobalize() {
    260                 // TODO Auto-generated method stub
    261                 JOptionPane.showMessageDialog(this, "reglobalize", "todo",
     240        @DoInBackground(progressMessage = "initializingEdition.title", cancelable = false, indeterminateProgress = false)
     241        private void reglobalize(final BackgroundEvent evt) {
     242                Installer.initializeEdition(new InstallProgressListener() {
     243                        @Override
     244                        public void installProgressUpdate(int done, int total, String step) {
     245                                evt.setProgressEnd(total);
     246                                evt.setProgressValue(done);
     247                                evt.setProgressMessage(step);
     248                        }
     249                });
     250        }
     251
     252        @SuppressWarnings("unused")
     253        private void tools() {
     254                // TODO method stub
     255                JOptionPane.showMessageDialog(this, "tools", "todo",
    262256                                JOptionPane.INFORMATION_MESSAGE);
    263257        }
     
    265259        @SuppressWarnings("unused")
    266260        private void revertSelection() {
    267                 // TODO Auto-generated method stub
     261                // TODO method stub
    268262                JOptionPane.showMessageDialog(this, "revertSelection", "todo",
    269263                                JOptionPane.INFORMATION_MESSAGE);
    270264        }
    271265
    272         private void modSelection(NodeMod n) {
     266        @DoInBackground(progressMessage = "installing.title", cancelable = false, indeterminateProgress = false)
     267        private void install(final BackgroundEvent evt) {
     268                TreeSet<Mod> mods = new TreeSet<Mod>();
     269                mods.addAll(ModManager.getInstance().getDefaultMods());
     270                mods.addAll(model.getSelectedMods());
     271
     272                System.out.println("Install mods:");
     273                for (Mod m : mods) {
     274                        System.out
     275                                        .println("  " + m.getPackageNumber() + ": " + m.getName());
     276                }
     277
     278                Installer.install(mods, new InstallProgressListener() {
     279                        @Override
     280                        public void installProgressUpdate(int done, int total, String step) {
     281                                evt.setProgressEnd(total);
     282                                evt.setProgressValue(done);
     283                                evt.setProgressMessage(step);
     284                        }
     285                });
     286
     287                // TODO method stub
     288                JOptionPane.showMessageDialog(this, "install", "todo",
     289                                JOptionPane.INFORMATION_MESSAGE);
     290        }
     291
     292        private void modSelection(Mod m) {
    273293                lblSubmitterVal.setText("");
    274294                lblCreatorVal.setText("");
    275                 lblIdVal.setText("");
    276295                lblFilesVal.setText("");
    277296                lblDescriptionVal.setText("");
    278                 if (n != null) {
    279                         lblSubmitterVal.setText(n.getName());
    280                         lblCreatorVal.setText(n.getFields().get("creator"));
    281                         lblIdVal.setText(Integer.toString(n.getNid()));
    282                         lblFilesVal.setText(Integer.toString(n.getUploads().size()));
    283                         if (n.getBody() != null)
    284                                 lblDescriptionVal.setText(n.getBody().getSafe_value());
     297                if (m != null) {
     298                        lblSubmitterVal.setText(m.getName());
     299                        lblCreatorVal.setText(m.getCreator());
     300                        if (m.getNode() != null) {
     301                                lblFilesVal.setText(Integer.toString(m.getNode().getUploads()
     302                                                .size()));
     303                        }
     304                        lblDescriptionVal.setText(m.getDescription());
    285305                }
    286306                // TODO
     
    289309        @SuppressWarnings("unused")
    290310        private void modTypeSelection() {
    291                 TaxonomyTerm t = (TaxonomyTerm) cmbModTypes.getSelectedItem();
     311                Type t = (Type) cmbModTypes.getSelectedItem();
    292312                if (t != null)
    293                         sorter.setRowFilter(new ModTableFilter(t.getTid()));
     313                        sorter.setRowFilter(new ModTableFilter(t));
    294314                else
    295                         sorter.setRowFilter(new ModTableFilter(-1));
     315                        sorter.setRowFilter(new ModTableFilter(null));
     316        }
     317
     318        @Override
     319        public void downloadSizeChanged(int newSize) {
     320                lblDownloadSizeVal.setText(SizeFormatter.format(newSize, 2));
     321        }
     322
     323        @DoInBackground(progressMessage = "initializingEdition.title", cancelable = false, indeterminateProgress = false)
     324        private void initialize(final BackgroundEvent evt) {
     325                if (!Installer.isEditionInitialized()) {
     326                        int res = JOptionPane.showConfirmDialog(this,
     327                                        bundle.getString("askInitialize.text"),
     328                                        bundle.getString("askInitialize.title"),
     329                                        JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
     330                        if (res == JOptionPane.NO_OPTION) {
     331                                exit();
     332                        } else {
     333                                Installer.initializeEdition(new InstallProgressListener() {
     334                                        @Override
     335                                        public void installProgressUpdate(int done, int total,
     336                                                        String step) {
     337                                                evt.setProgressEnd(total);
     338                                                evt.setProgressValue(done);
     339                                                evt.setProgressMessage(step);
     340                                        }
     341                                });
     342                        }
     343                }
    296344        }
    297345
     
    323371                if (askClose()) {
    324372                        event.setHandled(true);
    325                         closeFrames();
    326373                        saveLocalData();
    327374                        exit();
     
    334381        public void handleReOpenApplication(ApplicationEvent event) {
    335382        }
     383
    336384}
  • AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.properties

    r594 r600  
    1818menu.reglobalize=&Rebuild Core Data
    1919menu.reglobalizeTooltip=Rebuild Core Data
     20menu.tools=&Manage Tools
     21menu.toolsTooltip=Install/Remove Tools
    2022
    2123btnRevertSelection.text=Revert selection
    2224btnRevertSelection.tooltip=Select mods which are currently installed
     25btnInstall.text=&Install
     26btnInstall.tooltip=Install selected mods
    2327lblModTypes.text=Mod type:
     28lblDownloadSize.text=Size of files to download:
    2429
    2530lblSubmitter.text=Submitter:
    2631lblCreator.text=Creator:
    27 lblId.text=NodeID:
    2832lblFiles.text=Number of files:
    2933lblDescription.text=Description:
     
    3640askClose.title=Confirm close request
    3741askClose.text=Are you sure you want to close the program?
     42
     43askInitialize.title=Initialize Edition
     44askInitialize.text=The Edition is not yet initialized.\nIf you do not initialize now the installer will exit.\nInitialize Edition core now?
     45
     46initializingEdition.title=Initializing Edition core
     47installing.title=Installing mods
  • AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml

    r594 r600  
    66  locationRelativeTo: null
    77  defaultCloseOperation: doNothingOnClose
    8   onWindowOpened: [execDepotUpdate,checkUpdates,focus]
    9   onWindowClosing: [askClose,closeFrames,saveLocalData,exit]
     8  onWindowOpened: [execDepotUpdate,checkUpdates,initialize,focus]
     9  onWindowClosing: [askClose,saveLocalData,exit]
    1010  iconImage: img.ae
    1111  content:
    12     - Action(name=exitAction, text=menu.exit, toolTipText=menu.exitTooltip, icon=img.exit, onAction=[askClose,closeFrames,saveLocalData,exit])
     12    - Action(name=exitAction, text=menu.exit, toolTipText=menu.exitTooltip, icon=img.exit, onAction=[askClose,saveLocalData,exit])
    1313    - Action(name=settings, text=menu.settings, toolTipText=menu.settingsTooltip, icon=img.settings, onAction=[showSettings])
    1414    - Action(name=about, text=menu.about, toolTipText=menu.aboutTooltip, icon=img.about, onAction=[showAbout])
     
    1616    - Action(name=saveConfig, text=menu.saveConfig, toolTipText=menu.saveConfigTooltip, icon=img.saveFile, onAction=[saveConfig])
    1717    - Action(name=reglobalize, text=menu.reglobalize, toolTipText=menu.reglobalizeTooltip, icon=img.refresh, onAction=[reglobalize])
     18    - Action(name=tools, text=menu.tools, toolTipText=menu.toolsTooltip, icon=img.tools, onAction=[tools])
    1819    - JMenuBar:
    1920        - JMenu(name=mainMenu, text=menu.main):
     
    2627            - JSeparator()
    2728            - JMenuItem(action=reglobalize)
    28     - JToolBar(name=tools, floatable=false, orientation=0):
     29            - JSeparator()
     30            - JMenuItem(action=tools)
     31    - JToolBar(name=toolbar, floatable=false, orientation=0):
    2932        - JButton(action=exitAction, hideActionText=true)
    3033        - JToolBarSeparator()
     
    3336    - JSplitPane(name=contents, orientation=horizontalSplit, continuousLayout=true):
    3437        - JPanel(name=panMods):
    35             - JButton(name=btnRevertSelection, icon=img.undo16, text=btnRevertSelection.text, toolTipText=btnRevertSelection.tooltip, onAction=[revertSelection])
    3638            - JLabel(name=lblModTypes, text=lblModTypes.text)
    3739            - JComboBox(name=cmbModTypes, onAction=modTypeSelection)
    3840            - JScrollPane(name=scrollMods, vScrollBar=always, hScrollBar=never):
    3941                JTable(name=tblMods, visible=false)
     42            - JButton(name=btnRevertSelection, icon=img.undo16, text=btnRevertSelection.text, toolTipText=btnRevertSelection.tooltip, onAction=[revertSelection])
     43            - JButton(name=btnInstall, icon=img.install, text=btnInstall.text, toolTipText=btnInstall.tooltip, onAction=[install])
     44            - JLabel(name=lblDownloadSize, text=lblDownloadSize.text)
     45            - JLabel(name=lblDownloadSizeVal)
    4046            - MigLayout: |
    4147                 [grow]
    42                  btnRevertSelection                 [min]
    4348                 lblModTypes<,cmbModTypes           [min]
    4449                 scrollMods                         [grow]
     50                 >btnRevertSelection,btnInstall     [min]
     51                 lblDownloadSize,lblDownloadSizeVal [min]
    4552        - JPanel(name=panInfo):
    4653            - JLabel(name=lblSubmitter, text=lblSubmitter.text)
     
    4855            - JLabel(name=lblCreator, text=lblCreator.text)
    4956            - JLabel(name=lblCreatorVal)
    50             - JLabel(name=lblId, text=lblId.text)
    51             - JLabel(name=lblIdVal)
    5257            - JLabel(name=lblFiles, text=lblFiles.text)
    5358            - JLabel(name=lblFilesVal)
     
    5964                 >lblSubmitter     lblSubmitterVal    [min]
    6065                 >lblCreator       lblCreatorVal      [min]
    61                  >lblId            lblIdVal           [min]
    6266                 >lblFiles         lblFilesVal        [min]
    6367                 >^lblDescription  scrollDescription  [grow]
  • AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java

    r591 r600  
    11package net.oni2.aeinstaller.gui.modtable;
    2 
    3 import java.util.HashSet;
    42
    53import javax.swing.RowFilter;
    64
    7 import net.oni2.aeinstaller.backend.Settings;
    8 import net.oni2.aeinstaller.backend.depot.DepotManager;
    9 import net.oni2.aeinstaller.backend.depot.model.NodeMod;
     5import net.oni2.aeinstaller.backend.mods.Mod;
     6import net.oni2.aeinstaller.backend.mods.Type;
    107
    118/**
     
    1310 */
    1411public class ModTableFilter extends RowFilter<ModTableModel, Integer> {
    15         int type = -1;
     12        Type type = null;
    1613
    1714        /**
    1815         * @param type
    19          *            Type of mods to show (-1 for all)
     16         *            Type of mods to show (null for all)
    2017         */
    21         public ModTableFilter(int type) {
     18        public ModTableFilter(Type type) {
    2219                super();
    2320                this.type = type;
     
    2623        @Override
    2724        public boolean include(
    28                         javax.swing.RowFilter.Entry<? extends ModTableModel, ? extends Integer> entry) {
    29                 NodeMod mod = (NodeMod) entry.getModel().getValueAt(
    30                                 entry.getIdentifier(), -1);
     25                        RowFilter.Entry<? extends ModTableModel, ? extends Integer> entry) {
     26                Mod mod = (Mod) entry.getModel().getValueAt(entry.getIdentifier(), -1);
    3127
    32                 if (!DepotManager.getInstance().isModValidOnPlatform(mod,
    33                                 Settings.getPlatform()))
     28                if (mod.isDefaultMod())
    3429                        return false;
    3530
    36                 if (type < 0)
     31                if (!mod.validOnPlatform())
     32                        return false;
     33
     34                if (type == null)
    3735                        return true;
    3836
    39                 HashSet<Integer> types = new HashSet<Integer>();
    40                 types.add(type);
    41                 return DepotManager.getInstance().isModOfType(mod, types, false);
     37                return mod.getTypes().contains(type);
    4238        }
    4339}
  • AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableModel.java

    r593 r600  
    11package net.oni2.aeinstaller.gui.modtable;
    22
     3import java.util.HashSet;
    34import java.util.ResourceBundle;
     5import java.util.TreeSet;
    46import java.util.Vector;
    57
     
    79import javax.swing.table.TableColumn;
    810
    9 import net.oni2.aeinstaller.backend.depot.DepotConfig;
    10 import net.oni2.aeinstaller.backend.depot.DepotManager;
    11 import net.oni2.aeinstaller.backend.depot.model.NodeMod;
     11import net.oni2.aeinstaller.backend.mods.Mod;
     12import net.oni2.aeinstaller.backend.mods.ModManager;
     13import net.oni2.aeinstaller.backend.mods.Type;
    1214
    1315/**
     
    2123                        .getName());
    2224
    23         private Vector<NodeMod> items;
    24         private Vector<Boolean> install;
    25         private int vocabModTypeID = -1;
    26         private int vocabPlatformID = -1;
     25        private Vector<Mod> items = new Vector<Mod>();
     26        private Vector<Boolean> install = new Vector<Boolean>();
     27
     28        private HashSet<DownloadSizeListener> listeners = new HashSet<DownloadSizeListener>();
    2729
    2830        /**
     
    3537        @Override
    3638        public Object getValueAt(int row, int col) {
    37                 NodeMod node = items.get(row);
     39                Mod mod = items.get(row);
    3840                switch (col) {
    3941                        case -1:
    40                                 return node;
    41                         case 0:
    42                                 return node.getTitle();
    43                         case 1:
    44                                 return node.getFields().get("package_number");
     42                                return mod;
     43                        case 0:
     44                                return mod.getName();
     45                        case 1:
     46                                return mod.getPackageNumber();
    4547                        case 2:
    4648                                String type = "";
    47                                 if (vocabModTypeID < 0) {
    48                                         vocabModTypeID = DepotManager
    49                                                         .getInstance()
    50                                                         .getVocabulary(
    51                                                                         DepotConfig.getVocabularyName_ModType())
    52                                                         .getVid();
    53                                 }
    54                                 for (int tid : node.getTaxonomyTerms().get(vocabModTypeID)) {
     49                                for (Type t : mod.getTypes()) {
    5550                                        if (type.length() > 0)
    5651                                                type += ", ";
    57                                         type += DepotManager.getInstance().getTaxonomyTerm(tid)
    58                                                         .getName();
     52                                        type += t.getName();
    5953                                }
    6054                                return type;
    6155                        case 3:
    62                                 if (vocabPlatformID < 0) {
    63                                         vocabPlatformID = DepotManager
    64                                                         .getInstance()
    65                                                         .getVocabulary(
    66                                                                         DepotConfig.getVocabularyName_Platform())
    67                                                         .getVid();
    68                                 }
    69                                 int tid = node.getTaxonomyTerms().get(vocabPlatformID)
    70                                                 .iterator().next();
    71                                 return DepotManager.getInstance().getTaxonomyTerm(tid)
    72                                                 .getName();
     56                                return mod.getPlatform().toString();
    7357                        case 4:
    7458                                return install.get(row);
     
    163147         */
    164148        public void reloadData() {
    165                 items = DepotManager.getInstance().getModPackageNodes();
    166                 install = new Vector<Boolean>();
     149                items.clear();
     150                items.addAll(ModManager.getInstance().getMods());
     151                install.clear();
    167152                // TODO check installed
    168153                for (int i = 0; i < items.size(); i++) {
     
    176161         * @return Items
    177162         */
    178         public Vector<NodeMod> getItems() {
     163        public Vector<Mod> getItems() {
    179164                return items;
     165        }
     166
     167        /**
     168         * @return Mods selected for installation
     169         */
     170        public TreeSet<Mod> getSelectedMods() {
     171                TreeSet<Mod> res = new TreeSet<Mod>();
     172                for (int i = 0; i < items.size(); i++) {
     173                        if (install.get(i))
     174                                res.add(items.get(i));
     175                }
     176                return res;
    180177        }
    181178
     
    190187                if (columnIndex == 4) {
    191188                        install.set(rowIndex, (Boolean) aValue);
    192                 }
     189
     190                        int size = 0;
     191                        for (int i = 0; i < items.size(); i++) {
     192                                if (install.get(i)) {
     193                                        Mod m = items.get(i);
     194                                        if (!m.isLocalAvailable() || m.isNewerAvailable())
     195                                                size += m.getZipSize();
     196                                }
     197                        }
     198                        for (DownloadSizeListener dsl : listeners)
     199                                dsl.downloadSizeChanged(size);
     200                }
     201        }
     202
     203        /**
     204         * @param lis
     205         *            Listener to receive download size changed events
     206         */
     207        public void addDownloadSizeListener(DownloadSizeListener lis) {
     208                listeners.add(lis);
     209        }
     210
     211        /**
     212         * @param lis
     213         *            Listener to no longer receive download size changed events
     214         */
     215        public void removeDownloadSizeListener(DownloadSizeListener lis) {
     216                listeners.remove(lis);
    193217        }
    194218
Note: See TracChangeset for help on using the changeset viewer.