Statistics
| Revision:

gvsig-projects-pool / org.gvsig.winmgr / trunk / org.gvsig.winmgr.app / org.gvsig.winmgr.app.mainplugin / src / main / java / org / gvsig / coreplugin / PreferencesExtension.java @ 682

History | View | Annotate | Download (11.2 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.coreplugin;
24

    
25
import java.io.File;
26
import java.util.ArrayList;
27
import java.util.HashMap;
28
import java.util.Iterator;
29
import java.util.prefs.Preferences;
30
import org.apache.commons.io.FileUtils;
31
import org.apache.commons.lang3.StringUtils;
32

    
33
import org.slf4j.Logger;
34
import org.slf4j.LoggerFactory;
35

    
36
import org.gvsig.andami.IconThemeHelper;
37
import org.gvsig.andami.Launcher;
38
import org.gvsig.andami.PluginServices;
39
import org.gvsig.andami.PluginsLocator;
40
import org.gvsig.andami.PluginsManager;
41
import org.gvsig.andami.plugins.Extension;
42
import org.gvsig.andami.plugins.config.generate.Extensions;
43
import org.gvsig.andami.plugins.config.generate.PluginConfig;
44
import org.gvsig.andami.preferences.DlgPreferences;
45
import org.gvsig.andami.preferences.IPreference;
46
import org.gvsig.andami.preferences.IPreferenceExtension;
47
import org.gvsig.coreplugin.preferences.general.BrowserControlPage;
48
import org.gvsig.coreplugin.preferences.general.ExtensionPage;
49
import org.gvsig.coreplugin.preferences.general.ExtensionsPage;
50
import org.gvsig.coreplugin.preferences.general.FolderingPage;
51
import org.gvsig.coreplugin.preferences.general.GeneralPage;
52
import org.gvsig.coreplugin.preferences.general.IconThemePage;
53
import org.gvsig.coreplugin.preferences.general.NotificationsPage;
54
import org.gvsig.coreplugin.preferences.general.ScreenSettingsPage;
55
import org.gvsig.coreplugin.preferences.general.SkinPreferences;
56
import org.gvsig.coreplugin.preferences.general.appearance.AppearancePage;
57
import org.gvsig.coreplugin.preferences.network.FirewallPage;
58
import org.gvsig.coreplugin.preferences.network.NetworkPage;
59
import org.gvsig.tools.ToolsLocator;
60
import org.gvsig.tools.dynobject.DynObject;
61
import org.gvsig.tools.extensionpoint.ExtensionPoint;
62
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
63
import org.gvsig.tools.folders.FoldersManager;
64
import org.gvsig.tools.i18n.I18nManager;
65
import org.gvsig.tools.util.ToolsUtilLocator;
66
import org.gvsig.utils.XMLEntity;
67

    
68
/**
69
 *
70
 * <p>
71
 * Extension that provides support for visual application configuration through
72
 * a Preferences dialog where the user can specify its own settings for general
73
 * purpose aspects.
74
 * </p>
75
 * <p>
76
 * Adding new preference pages is made through ExtensionPoints by invoking
77
 * <b>
78
 * this.extensionPoints.add("AplicationPreferences","YourIPreferencesClassName",
79
 * yourIPreferencesPage);
80
 * </b>
81
 * and then call <b>DlgPreferences.refreshExtensionPoints();</b>
82
 * </p>
83
 *
84
 *
85
 */
86
public class PreferencesExtension extends Extension {
87

    
88
        public static final String PROJECTS_FOLDER_PROPERTY_NAME = "ProjectsFolder";
89
        public static final String DATA_FOLDER_PROPERTY_NAME = "DataFolder";
90
        public static final String TEMPLATES_FOLDER_PROPERTY_NAME = "TemplatesFolder";
91
        public static final String SYMBOL_LIBRARY_FOLDER_PROPERTY_NAME = "SymbolLibraryFolder";
92
    
93
    private static final Logger logger = LoggerFactory.getLogger(PreferencesExtension.class);
94
    private final ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
95

    
96
    private boolean initilizedExtensions = false;
97

    
98
    @Override
99
    public void initialize() {
100
        initializeUseNativeFileChooser();
101
        initializeFoldersManager();
102
        registerIcons();
103
        initializeCoreExtensions();
104
    }
105

    
106
    private void initializeUseNativeFileChooser() {
107
        PluginsManager pluginsManager = PluginsLocator.getManager();
108
        PluginServices plugin = pluginsManager.getPlugin(PreferencesExtension.class);
109

    
110
        DynObject pluginProperties = plugin.getPluginProperties();
111

    
112
        boolean useNativeFileChooser = (Boolean) pluginProperties.getDynValue("useNativeFileChooser");
113
        ToolsUtilLocator.getFileDialogChooserManager().setUseNativeFileChooser(useNativeFileChooser);
114
    }
115

    
116
    private void initializeFoldersManager() {
117
        try {
118
            Preferences prefs = Preferences.userRoot().node( "gvsig.foldering" );
119
            FoldersManager foldersManager = ToolsLocator.getFoldersManager();
120
            for( String name : new String[] {
121
                    PROJECTS_FOLDER_PROPERTY_NAME,
122
                    DATA_FOLDER_PROPERTY_NAME,
123
                    TEMPLATES_FOLDER_PROPERTY_NAME,
124
                    SYMBOL_LIBRARY_FOLDER_PROPERTY_NAME
125
                }) {
126
                String fname = prefs.get(name, null);
127
                if( !StringUtils.isEmpty(fname) ) {
128
                    foldersManager.set(name, new File(fname).getAbsoluteFile());
129
                }
130
            }
131
        } catch(Exception ex) {
132
            logger.warn("Can't initialize default folders in FolderManager.",ex);
133
        }
134
    }
135
    
136
    private void registerIcons() {
137
        IconThemeHelper.registerIcon("action", "edit-setup", this);
138
        IconThemeHelper.registerIcon("action", "application-exit", this);
139

    
140
        // AppearancePage.java
141
        IconThemeHelper.registerIcon("preferences", "edit-setup-appearance", this);
142
        // BrowserControlPage.java
143
        IconThemeHelper.registerIcon("preferences", "edit-setup-browsercontrol", this);
144
        // DirExtensionPage.java
145
        IconThemeHelper.registerIcon("preferences", "edit-setup-dirextension", this);
146
        // ExtensionPage.java
147
        IconThemeHelper.registerIcon("preferences", "edit-setup-extension", this);
148
        // ExtensionsPage.java
149
        IconThemeHelper.registerIcon("preferences", "edit-setup-extensions", this);
150
        // GeneralPage.java
151
        IconThemeHelper.registerIcon("preferences", "edit-setup-general", this);
152
        // FolderingPage.java
153
        IconThemeHelper.registerIcon("preferences", "edit-setup-foldering", this);
154
        // LanguagePage.java
155
        IconThemeHelper.registerIcon("preferences", "edit-setup-language", this);
156
        // ScreenSettingsPage.java
157
        IconThemeHelper.registerIcon("preferences", "edit-setup-screensetting", this);
158
        // FirewallPage.java
159
        IconThemeHelper.registerIcon("preferences", "edit-setup-firewall", this);
160
        // NetworkPage.java
161
        IconThemeHelper.registerIcon("preferences", "edit-setup-network", this);
162
        // SkinPreferences.java
163
        IconThemeHelper.registerIcon("preferences", "edit-setup-skin", this);
164
        IconThemeHelper.registerIcon("preferences", "edit-setup-icontheme", this);
165
    }
166

    
167
    @Override
168
    public void execute(String actionCommand) {
169
        if (!this.initilizedExtensions) {
170
            initializeExtensions();
171
            initializeExtensionsConfig();
172
            this.initilizedExtensions = true;
173
        }
174
        if ("edit-setup".equalsIgnoreCase(actionCommand)) {
175
            DlgPreferences dlgPreferences = PluginServices.getDlgPreferences();
176
            dlgPreferences.refreshExtensionPoints();
177
            PluginServices.getMDIManager().addWindow(dlgPreferences);
178
        } else if ("application-exit".equalsIgnoreCase(actionCommand)) {
179
            Launcher.closeApplication();
180
        }
181
    }
182

    
183
    @Override
184
    public boolean isEnabled() {
185
        return true;
186
    }
187

    
188
    @Override
189
    public boolean isVisible() {
190
        return true;
191
    }
192

    
193
    private void initializeCoreExtensions() {
194
        addPreferencesPage(new GeneralPage());
195
        addPreferencesPage(new NetworkPage());
196
        addPreferencesPage(new FirewallPage());
197
        addPreferencesPage(new ExtensionsPage());
198
        addPreferencesPage(new AppearancePage());
199
        addPreferencesPage(new FolderingPage());
200
        addPreferencesPage(new ScreenSettingsPage());
201
        addPreferencesPage(new SkinPreferences());
202
        addPreferencesPage(new IconThemePage());
203
        addPreferencesPage(new NotificationsPage());
204
        String os = System.getProperty("os.name").toLowerCase();
205
        if (os.contains("linux") || os.contains("unix")) {
206
            addPreferencesPage(new BrowserControlPage());
207
        }
208
    }
209

    
210
    private void initializeExtensionsConfig() {
211
        HashMap pc = Launcher.getPluginConfig();
212
        ArrayList array = new ArrayList();
213
        Iterator iter = pc.values().iterator();
214

    
215
        while (iter.hasNext()) {
216
            array.add(((PluginConfig) iter.next()).getExtensions());
217
        }
218
        Extensions[] exts = (Extensions[]) array.toArray(new Extensions[0]);
219
        for (Extensions ext1 : exts) {
220
            for (int j = 0; j < ext1.getExtensionCount(); j++) {
221
                org.gvsig.andami.plugins.config.generate.Extension ext = ext1.getExtension(j);
222
                addPreferencesPage(new ExtensionPage(ext));
223
            }
224
        }
225
    }
226

    
227
    private void initializeExtensions() {
228
        Iterator i = Launcher.getExtensionIterator();
229
        I18nManager i18nManager = ToolsLocator.getI18nManager();
230

    
231
        while (i.hasNext()) {
232
            Object extension = i.next();
233

    
234
            if (extension instanceof IPreferenceExtension) {
235
                IPreferenceExtension pe = (IPreferenceExtension) extension;
236
                IPreference[] pp;
237
                try {
238
                    pp = pe.getPreferencesPages();
239
                } catch (Throwable th) {
240
                    logger.warn("Can't get preference pages from '"+extension.getClass().getName()+"'.",th);
241
                    continue;
242
                }
243
                if (pp == null) {
244
                    String msg = "Preferences page is NULL. Extension "
245
                            + extension.getClass().getName()
246
                            + " implements IPreferenceExtension but does not provide pref. pages. ";
247
                    logger.info(msg);
248
                } else {
249
                    for (IPreference pp1 : pp) {
250
                        try {
251
                            addPreferencesPage(pp1);
252
                        } catch (Throwable th) {
253
                            String msg = "cant_initialize_values_for_{0}_page_in_{1}";
254
                            String[] params = {pp1.getTitle(), extension.getClass().getName()};
255
                            logger.warn(i18nManager.getTranslation(msg, params), th);
256
                        }
257
                    }
258
                }
259
            }
260
        }
261
    }
262

    
263
    public void addPreferencesPage(IPreference pp) {
264
        ExtensionPoint ep = this.extensionPoints.add("AplicationPreferences", "");
265
        pp.initializeValues();
266
        ep.append(pp.getID(), "", pp);
267
    }
268

    
269
    @Override
270
    public void postInitialize() {
271
        super.postInitialize();
272
        DlgPreferences dlgPreferences = PluginServices.getDlgPreferences();
273
        dlgPreferences.refreshExtensionPoints();
274
        dlgPreferences.storeValues();
275
    }
276
}