Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.timesupport.app / org.gvsig.timesupport.app.animation / src / main / java / org / gvsig / timesupport / app / animation / extension / AnimationSupportExtension.java @ 43667

History | View | Annotate | Download (7.83 KB)

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

    
24
import java.awt.event.ActionEvent;
25
import java.awt.event.ActionListener;
26
import java.util.Iterator;
27
import javax.swing.SwingUtilities;
28
import org.gvsig.andami.plugins.Extension;
29
import org.gvsig.app.ApplicationLocator;
30
import org.gvsig.app.ApplicationManager;
31
import org.gvsig.app.project.ProjectManager;
32
import org.gvsig.app.project.documents.view.ViewDocument;
33
import org.gvsig.app.project.documents.view.ViewManager;
34
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
35
import org.gvsig.app.project.documents.view.gui.IView;
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.mapcontext.layers.FLayer;
38
import org.gvsig.fmap.mapcontext.layers.FLayers;
39
import org.gvsig.fmap.mapcontext.layers.operations.SingleLayer;
40
import org.gvsig.fmap.mapcontrol.MapControl;
41
import org.gvsig.timesupport.Interval;
42
import org.gvsig.timesupport.RelativeInterval;
43
import org.gvsig.timesupport.Time;
44
import org.gvsig.timesupport.TimeSupportLocator;
45
import org.gvsig.timesupport.animation.TimeAnimation;
46
import org.gvsig.timesupport.animation.TimeAnimation.TimeAnimationRenderer;
47
import org.gvsig.timesupport.swing.api.TimeSupportSwingLocator;
48
import org.gvsig.timesupport.swing.api.TimeSupportSwingManager;
49
import org.gvsig.timesupport.swing.api.panel.AnimationBarPanel;
50
import org.gvsig.timesupport.swing.api.panel.AnimationPreferencesPanel;
51
import org.gvsig.tools.ToolsLocator;
52
import org.gvsig.tools.i18n.I18nManager;
53
import org.gvsig.tools.swing.api.ToolsSwingLocator;
54
import org.gvsig.tools.swing.api.windowmanager.Dialog;
55
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
56
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
57

    
58
public class AnimationSupportExtension extends Extension {
59

    
60
    private TimeSupportSwingManager swingManager = null;
61

    
62
    @Override
63
    public void initialize() {
64
        // Do nothing
65
    }
66

    
67
    @Override
68
    public void postInitialize() {
69
        super.postInitialize();
70
        swingManager = TimeSupportSwingLocator.getSwingManager();
71
    }
72

    
73
    @Override
74
    public void execute(String actionCommand) {
75
        if( actionCommand.equalsIgnoreCase("AnimationSupport") ) {
76
            final ViewDocument viewDocument = getView();
77
            if( viewDocument == null ) {
78
                return;
79
            }
80
            ProjectManager projectManager = ApplicationLocator.getProjectManager();
81
            ViewManager viewManager = (ViewManager) projectManager.getDocumentManager(ViewManager.TYPENAME);
82
            final IView viewPanel = (IView) viewManager.getMainWindow(viewDocument);
83
            final MapControl mapControl = viewPanel.getMapControl();
84
            RelativeInterval interval = (RelativeInterval) viewDocument.getMapContext().getTimeContext().getInterval();
85
            if( interval != null ) {
86
                final int savedPaintMode = mapControl.getPaintMode();
87
                final Time savedTimeFilter = mapControl.getMapContext().getViewPort().getTime();
88
                I18nManager i18n = ToolsLocator.getI18nManager();
89
                final TimeAnimation animation = TimeSupportLocator.getManager().
90
                    createTimeAnimation(new TimeAnimationRenderer() {
91
                        @Override
92
                        public void begin() {
93
                            mapControl.setPaintMode(MapControl.PAINT_WHEN_DRAW_LAYERS_IS_COMPLETED);
94
                        }
95

    
96
                        @Override
97
                        public void render(final Interval time) {
98
                            if( !SwingUtilities.isEventDispatchThread() ) {
99
                                SwingUtilities.invokeLater(new Runnable() {
100
                                    @Override
101
                                    public void run() {
102
                                        render(time);
103
                                    }
104
                                });
105
                            }
106
                            viewDocument.getMapContext().getViewPort().setTime(time);
107
                            viewDocument.getMapContext().invalidate();
108
                        }
109

    
110
                        @Override
111
                        public void end() {
112
                            mapControl.setPaintMode(savedPaintMode);
113
                            mapControl.getMapContext().getViewPort().setTime(savedTimeFilter);
114
                        }
115
                    }
116
                    );
117
                animation.setInterval(interval);
118

    
119
                final AnimationPreferencesPanel prefs = swingManager.createAnimationPreferencesPanel(animation);
120

    
121
                WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
122
                final Dialog dialog = winManager.createDialog(
123
                    prefs.asJComponent(),
124
                    i18n.getTranslation("animation_preferences"),
125
                    null,
126
                    WindowManager_v2.BUTTONS_OK_CANCEL
127
                );
128
                dialog.addActionListener(new ActionListener() {
129
                    @Override
130
                    public void actionPerformed(ActionEvent e) {
131
                        if( dialog.getAction() == WindowManager_v2.BUTTON_OK ) {
132
                            doAnimation(viewDocument, prefs.getAnimation());
133
                        }
134
                        prefs.asJComponent().setVisible(false);
135
                    }
136
                });
137
                dialog.show(WindowManager.MODE.TOOL);
138
            }
139
        }
140
    }
141

    
142
    private void doAnimation(ViewDocument viewDocument, TimeAnimation animation) {
143
        I18nManager i18n = ToolsLocator.getI18nManager();
144
        WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
145
        AnimationBarPanel panel = swingManager.createAnimationBarPanel(animation);
146
        winManager.showWindow(
147
            panel.asJComponent(),
148
            i18n.getTranslation("animation_bar") + " - " + viewDocument.getName(),
149
            WindowManager.MODE.TOOL
150
        );
151
    }
152

    
153
    @Override
154
    public boolean isEnabled() {
155
        ViewDocument viewDocument = getView();
156
        if( viewDocument == null ) {
157
            return false;
158
        }
159
        FLayers layers = viewDocument.getMapContext().getLayers();
160
        for( Iterator<FLayer> iterator = layers.deepiterator(); iterator.hasNext(); ) {
161
            FLayer layer = iterator.next();
162
            if( layer instanceof SingleLayer ) {
163
                DataStore dataStore = ((SingleLayer) layer).getDataStore();
164
                if( dataStore.getInterval() != null ) {
165
                    return true;
166
                }
167
            }
168
        }
169
        return false;
170
    }
171

    
172
    /**
173
     * Gets the active view
174
     *
175
     * @return {@link AbstractViewPanel}
176
     */
177
    private ViewDocument getView() {
178
        ApplicationManager application = ApplicationLocator.getManager();
179
        ViewDocument viewDocument = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
180
        return viewDocument;
181
    }
182

    
183
    @Override
184
    public boolean isVisible() {
185
        return getView()!=null;
186
    }
187

    
188
}