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