001/*
002 * $Id: McIdasChooserManager.java,v 1.13 2011/03/24 16:06:31 davep Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2011
007 * Space Science and Engineering Center (SSEC)
008 * University of Wisconsin - Madison
009 * 1225 W. Dayton Street, Madison, WI 53706, USA
010 * https://www.ssec.wisc.edu/mcidas
011 * 
012 * All Rights Reserved
013 * 
014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
015 * some McIDAS-V source code is based on IDV and VisAD source code.  
016 * 
017 * McIDAS-V is free software; you can redistribute it and/or modify
018 * it under the terms of the GNU Lesser Public License as published by
019 * the Free Software Foundation; either version 3 of the License, or
020 * (at your option) any later version.
021 * 
022 * McIDAS-V is distributed in the hope that it will be useful,
023 * but WITHOUT ANY WARRANTY; without even the implied warranty of
024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
025 * GNU Lesser Public License for more details.
026 * 
027 * You should have received a copy of the GNU Lesser Public License
028 * along with this program.  If not, see http://www.gnu.org/licenses.
029 */
030
031package edu.wisc.ssec.mcidasv.chooser;
032
033import java.util.ArrayList;
034import java.util.List;
035
036import javax.swing.JComponent;
037
038import org.w3c.dom.Element;
039
040import edu.wisc.ssec.mcidasv.ui.McIDASVXmlUi;
041
042import ucar.unidata.idv.IdvResourceManager;
043import ucar.unidata.idv.IntegratedDataViewer;
044import ucar.unidata.idv.chooser.IdvChooser;
045import ucar.unidata.idv.chooser.IdvChooserManager;
046import ucar.unidata.idv.chooser.adde.AddeServer;
047import ucar.unidata.ui.TreePanel;
048import ucar.unidata.ui.XmlUi;
049import ucar.unidata.util.LogUtil;
050import ucar.unidata.xml.XmlResourceCollection;
051
052/**
053 * This creates and manages the set of choosers.
054 * It makes the chooser GUI from an xml specification
055 * e.g.: /ucar/unidata/idv/resources/choosers.xml
056 * It uses the {@link ucar.unidata.ui.XmlUi} to process
057 * the xml.
058 * <p>
059 * This class also processes the end-user created choosers.
060 * This piece has always been a bit flaky
061 *
062 * @author IDV development team
063 * @version $Revision: 1.13 $Date: 2011/03/24 16:06:31 $
064 */
065
066public class McIdasChooserManager extends IdvChooserManager {
067
068
069
070    /** All of the adde servers */
071    private List addeServers = new ArrayList();
072
073    private static boolean myServers = true;
074
075    
076    /**
077     *  Create a new IdvChooserManager.
078     *
079     *  @param idv The singleton IDV
080     */
081    public McIdasChooserManager(IntegratedDataViewer idv) {
082        super(idv);
083        addeServers = initializeAddeServers(idv);       
084    }
085
086    /**
087     * Create the Choosers component from the choosers.xml resources
088     *
089     * @param inTabs  Do we use the buttontabbedpane or the treepanel
090     *
091     * @return choosers gui
092     */
093    @Override
094    public JComponent createChoosers(boolean inTabs) {
095        return createChoosers(inTabs, new ArrayList(), null);
096    }
097
098    /**
099     * Initialize addeServers list
100     */
101    public List initializeAddeServers(IntegratedDataViewer idv) {
102        List servers = initializeAddeServers(idv, true);
103        return servers;
104    }
105
106    /**
107     * Creates a new {@link McIDASVXmlUi} that can create the UI described in
108     * {@code root}.
109     * 
110     * @param root XML description of a GUI component.
111     * 
112     * @return A new {@code McIDASVXmlUi} to use for creating {@code root}.
113     */
114    @Override protected XmlUi createXmlUi(final Element root) {
115        return new McIDASVXmlUi(getIdv(), root);
116    }
117
118    /**
119     * Initialize addeServers list
120     *
121     */
122    public List initializeAddeServers(IntegratedDataViewer idv, boolean allServers) {
123        addeServers = new ArrayList();
124
125        XmlResourceCollection addeServerResources =
126            idv.getResourceManager().getXmlResources(
127                IdvResourceManager.RSC_ADDESERVER);
128        try {
129            for (int resourceIdx = 0;
130                    resourceIdx < addeServerResources.size(); resourceIdx++) {
131                if (!allServers)
132                   if (!addeServerResources.isWritableResource(resourceIdx)) continue;
133                Element root = addeServerResources.getRoot(resourceIdx);
134                if (root == null) {
135                    continue;
136                }
137                List servers = AddeServer.processXml(root);
138                for (int serverIdx = 0; serverIdx < servers.size();
139                        serverIdx++) {
140                    AddeServer addeServer =
141                        (AddeServer) servers.get(serverIdx);
142                    addeServer.setIsLocal(true);
143                    List groups = addeServer.getGroups();
144                    for (int groupIdx = 0; groupIdx < groups.size();
145                            groupIdx++) {
146                        AddeServer.Group group =
147                            (AddeServer.Group) groups.get(groupIdx);
148                        group.setIsLocal(true);
149                    }
150                }
151                addeServers.addAll(servers);
152//                if (!allServers) break;
153            }
154        } catch (Exception exc) {
155            LogUtil.logException("Error processing adde server descriptions",
156                                 exc);
157        }
158        addeServers = AddeServer.coalesce(addeServers);
159
160        Object oldServers =
161            getIdv().getStore().get(IdvChooser.PREF_ADDESERVERS);
162        if ((oldServers != null) && (oldServers instanceof List)) {
163            List prefs = (List) oldServers;
164            for (int i = 0; i < prefs.size(); i++) {
165                String server = (String) prefs.get(i);
166                addAddeServer(server);
167            }
168            getIdv().getStore().remove(IdvChooser.PREF_ADDESERVERS);
169            getIdv().getStore().saveIfNeeded();
170            writeAddeServers();
171        }
172        return addeServers;
173    }
174
175    /**
176     * Get AddeServers to use
177     *
178     * @param groupType If null return all, else return the servers that have groups of the given type
179     *
180     * @return List of AddeServers
181     */
182    public List getAddeServers(String groupType) {
183        return getAddeServers(groupType, true);
184    }
185
186
187    /**
188     * Get AddeServers to use
189     *
190     * @param groupType If null return all, else return the servers that have groups of the given type
191     * @param onlyActive If true then only fetch the active servers
192     *
193     * @return List of AddeServers
194     */
195    public List getAddeServers(String groupType, boolean onlyActive) {
196        List servers;
197        if (groupType == null) {
198            servers = new ArrayList(addeServers);
199        } else {
200            servers = AddeServer.getServersWithType(groupType, addeServers);
201        }
202        if ( !onlyActive) {
203            return servers;
204        }
205
206        List       activeServers = new ArrayList();
207        AddeServer addeServer;
208        for (int i = 0; i < addeServers.size(); i++) {
209            addeServer = (AddeServer) addeServers.get(i);
210            if (addeServer.getActive()) {
211                activeServers.add(addeServer);
212            }
213        }
214        return activeServers;
215    }
216}