Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 9430edf27871c2a49d84f1529a413a7b2b1d526d (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
/*****************************************************************************
 * Copyright (c) 2013, 2014 Cedric Dumoulin, CEA, 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:
 *  Cedric Dumoulin  Cedric.dumoulin@lifl.fr - Initial API and implementation
 *  Christian W. Damus (CEA) - bug 433371
 *  Céline Janssens (ALL4TEC) celine.janssens@all4tec.net - Bug 415638
 *  Gabriel Pascual (ALL4TEC) gabriel.pascual@all4tec.net - Bug 440754
 *****************************************************************************/

package org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.internal;

import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.IOpenable;
import org.eclipse.papyrus.infra.core.sashwindows.di.SashWindowsMngr;
import org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder;
import org.eclipse.papyrus.infra.core.sashwindows.di.service.BasicPageManagerImpl;
import org.eclipse.swt.widgets.Display;


/**
 * This class provide high level method to manage the Sash pages through its DI
 * implementation.
 *
 * @author cedric dumoulin
 *
 */
public class PageManagerImpl extends BasicPageManagerImpl {

	/**
	 * An object used to get the current folder, or to ask to set the
	 * active page.
	 * This is usually backuped by the SashWindowContainer. <br>
	 */
	private ICurrentFolderAndPageMngr folderAndPageMngr;

	private ContentChangedEventProvider contentChangedEventProvider;

	/**
	 * Constructor.
	 * Use a default {@link ICurrentFolderAndPageMngr} that alwayrs use the first
	 * folder as the current folder. Futhermore, the default implementation doesn't
	 * allow to set the active folder. <br>
	 * Suitable for tests
	 *
	 * @param diSashModel
	 *            The model onto which operation of this class act.
	 * @param contentChangedEventProvider
	 *            A class listening on changes on the internal model and delivering events to registered listeners. This implementation
	 *            need the class in order to deactivate event triggering during the operations.
	 *
	 */
	protected PageManagerImpl(SashWindowsMngr diSashModel, ContentChangedEventProvider contentChangedEventProvider) {
		super(diSashModel);

		this.contentChangedEventProvider = contentChangedEventProvider;
		this.folderAndPageMngr = new DefaultCurrentFolderAndPageMngr(diSashModel);
	}

	/**
	 * Constructor.
	 *
	 * @param diSashModel
	 *            the di sash model
	 * @param contentChangedEventProvider
	 *            the content changed event provider
	 * @param folderAndPageMngr
	 *            the folder and page mngr
	 */
	protected PageManagerImpl(SashWindowsMngr diSashModel, ContentChangedEventProvider contentChangedEventProvider, ICurrentFolderAndPageMngr folderAndPageMngr) {
		super(diSashModel);

		this.contentChangedEventProvider = contentChangedEventProvider;
		this.folderAndPageMngr = folderAndPageMngr;
	}

	@Override
	protected TabFolder getCurrentFolder() {
		return folderAndPageMngr.getCurrentFolder();
	}

	@Override
	protected boolean isLegacyMode() {
		// We are never in legacy mode even if there is a page list
		return false;
	}

	@Override
	protected boolean isPage(EObject content) {
		return Platform.getAdapterManager().getAdapter(content, IOpenable.class) != null;
	}

	@Override
	public void closePage(Object pageIdentifier) {
		// Suppress event notifications
		doExecute(() -> super.closePage(pageIdentifier));
	}

	@Override
	public void closeAllOpenedPages() {
		// Suppress event notifications
		doExecute(() -> super.closeAllOpenedPages());
	}

	@Override
	public void closeOtherPages(Object pageIdentifier) {
		// Suppress event notifications
		doExecute(() -> super.closeOtherPages(pageIdentifier));
	}

	@Override
	public void selectPage(final Object pageIdentifier) {
		Display.getDefault().syncExec(new Runnable() {

			@Override
			public void run() {
				folderAndPageMngr.setActivePage(pageIdentifier);
			}
		});
	}

	/**
	 * Sets the current folder and page mngr.
	 *
	 * @param currentFolderAndPageMngr
	 *            the new current folder and page mngr
	 */
	public void setCurrentFolderAndPageMngr(ICurrentFolderAndPageMngr currentFolderAndPageMngr) {
		this.folderAndPageMngr = currentFolderAndPageMngr;

	}

	@Override
	protected <T> T doExecute(SashModelOperation<T> sashModelOperation) {
		T result;

		final boolean deliver = contentChangedEventProvider.isDeliver();

		contentChangedEventProvider.setDeliver(false);
		try {
			result = super.doExecute(sashModelOperation);
		} finally {
			contentChangedEventProvider.setDeliver(deliver);
		}

		return result;
	}

	private void doExecute(Runnable sashModelOperation) {
		doExecute(ignored -> {
			sashModelOperation.run();
			return ignored;
		});
	}

}

Back to the top