Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: e904d70ad4694fa3704829044f6cfd6f184ca173 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*******************************************************************************
 * Copyright (c) 2006, 2009 Wind River Systems and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Wind River Systems - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.examples.dsf.timers;

import java.util.concurrent.RejectedExecutionException;

import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.dsf.ui.viewmodel.AbstractVMAdapter;
import org.eclipse.cdt.dsf.ui.viewmodel.IRootVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.IVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider;
import org.eclipse.cdt.examples.dsf.timers.AlarmService.TriggersChangedEvent;
import org.eclipse.cdt.examples.dsf.timers.TimerService.TimersChangedEvent;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;

/**
 * The View Model provider for the Timers view.  This provider allows for 
 * switching between two different view layouts:
 * <ol>
 *  <li>Timers -> Triggers -> Alarms</li>
 *  <li>Triggers -> Timers -> Alarms</li>
 * </ol>  
 * A special event is sent when the layout is changed in order to generate
 * a proper delta to refresh the view. 
 */
@SuppressWarnings("restriction")
public class TimersVMProvider extends AbstractDMVMProvider {

    /** Event indicating that the timers view layout has changed */
    public static class TimersViewLayoutChanged {}
    
    /** Enumeration of possible layouts for the timers view model */
    public enum ViewLayout { TRIGGERS_AT_TOP, TIMERS_AT_TOP }
    
    /** Have we registered ourselves as a listener for DM events? */  
    private boolean fRegisteredEventListener;
    
    public TimersVMProvider(AbstractVMAdapter adapter, IPresentationContext presentationContext, DsfSession session) {
        super(adapter, presentationContext, session);
        
        // Add ourselves as listener for DM events events.
        try {
            session.getExecutor().execute(new Runnable() {
                @Override
		public void run() {
                    if (DsfSession.isSessionActive(getSession().getId())) {
                        getSession().addServiceEventListener(TimersVMProvider.this, null);
                        fRegisteredEventListener = true;
                    }
                }
            });
        } catch (RejectedExecutionException e) {
            // Session shut down, not much we can do but wait to be disposed.
        }
        
        // Set the initial view layout.
        setViewLayout(ViewLayout.TIMERS_AT_TOP);   
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.cdt.dsf.ui.viewmodel.AbstractVMProvider#dispose()
     */
    @Override
	public void dispose() {
		// Remove ourselves as listener for DM events events. In practice, we
		// get called after the session has shut down, so we'll end up with a
		// RejectedExecutionException. We put this here all the same for
		// completeness sake.
        try {
            getSession().getExecutor().execute(new Runnable() {
                @Override
		public void run() {
                    if (fRegisteredEventListener && DsfSession.isSessionActive(getSession().getId())) {
                        getSession().removeServiceEventListener(TimersVMProvider.this);
                        fRegisteredEventListener = false;
                    }
                }
            });
        } catch (RejectedExecutionException e) {
            // Session shut down, not much we can do but wait to be disposed.
        }
        
        super.dispose();
    }
    
    /** 
     * Configures a new layout for the timers view model.
     * @param layout New layout to use.
     */
    public void setViewLayout(ViewLayout layout) {
        clearNodes();
        if (layout == ViewLayout.TRIGGERS_AT_TOP) {
            IRootVMNode root = new TimersRootVMNode(this); 
            IVMNode triggersNode = new TriggersVMNode(this, getSession());
            addChildNodes(root, new IVMNode[] { triggersNode });
            IVMNode timersNode = new TimersVMNode(this, getSession());
            addChildNodes(triggersNode, new IVMNode[] { timersNode });
            IVMNode alarmNode = new AlarmsVMNode(this, getSession());
            addChildNodes(timersNode, new IVMNode[] { alarmNode });
            setRootNode(root);
        } else if (layout == ViewLayout.TIMERS_AT_TOP) {
            IRootVMNode root = new TimersRootVMNode(this); 
            IVMNode timersNode = new TimersVMNode(this, getSession());
            addChildNodes(root, new IVMNode[] { timersNode });
            IVMNode triggersNode = new TriggersVMNode(this, getSession());
            addChildNodes(timersNode, new IVMNode[] { triggersNode });
            IVMNode alarmNode = new AlarmsVMNode(this, getSession());
            addChildNodes(triggersNode, new IVMNode[] { alarmNode });
            setRootNode(root);
        }
        
        handleEvent(new TimersViewLayoutChanged());
    }
    
    @Override
    public IColumnPresentation createColumnPresentation(IPresentationContext context, Object element) {
        return new TimersViewColumnPresentation();
    }

    @Override
    public String getColumnPresentationId(IPresentationContext context, Object element) {
        return TimersViewColumnPresentation.ID;
    }

    // Add a handler for the triggers and timers changed events.  The 
    // AbstractDMVMProvider superclass automatically registers this provider
    // for all IDMEvent events, however these two events do not implement
    // IDMEvent
    @DsfServiceEventHandler
    public void eventDispatched(final TriggersChangedEvent event) {
        if (isDisposed()) return;

        try {
            getExecutor().execute(new Runnable() {
                @Override
		public void run() {
                    if (isDisposed()) return;
                    handleEvent(event);
                }
            });
        } catch (RejectedExecutionException e) {}
    }

    @DsfServiceEventHandler
    public void eventDispatched(final TimersChangedEvent event) {
        if (isDisposed()) return;

        try {
            getExecutor().execute(new Runnable() {
                @Override
		public void run() {
                    if (isDisposed()) return;
                    handleEvent(event);
                }
            });
        } catch (RejectedExecutionException e) {}
    }
}

Back to the top