blob: a8c0f24a253a8b5f6009c07bf277b4eed0504946 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Alexander Kuppe, Versant GmbH - bug 215797
* Sascha Zak - bug 282874
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 440810, 440136, 472654
* Andrey Loskutov <loskutov@gmx.de> - Bug 404348, 421178, 456727
*******************************************************************************/
package org.eclipse.ui.internal;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.internal.e4.compatibility.ModeledPageLayout;
import org.eclipse.ui.internal.registry.ActionSetRegistry;
import org.eclipse.ui.internal.registry.IActionSetDescriptor;
import org.eclipse.ui.internal.registry.PerspectiveDescriptor;
/**
*
*/
public class Perspective {
private final PerspectiveDescriptor descriptor;
private final WorkbenchPage page;
private final List<IActionSetDescriptor> alwaysOnActionSets;
private final List<IActionSetDescriptor> alwaysOffActionSets;
private final MPerspective layout;
public Perspective(PerspectiveDescriptor desc, MPerspective layout, WorkbenchPage page) {
Assert.isNotNull(page);
this.page = page;
this.layout = layout;
descriptor = desc;
alwaysOnActionSets = new ArrayList<>(2);
alwaysOffActionSets = new ArrayList<>(2);
}
public void initActionSets() {
if (descriptor != null) {
List<String> alwaysOn = ModeledPageLayout.getIds(layout, ModeledPageLayout.ACTION_SET_TAG);
// read explicitly disabled sets.
String hiddenIDs = page.getHiddenItems();
List<String> alwaysOff = new ArrayList<>();
String[] hiddenIds = hiddenIDs.split(","); //$NON-NLS-1$
for (String id : hiddenIds) {
if (!id.startsWith(ModeledPageLayout.HIDDEN_ACTIONSET_PREFIX)) {
continue;
}
id = id.substring(ModeledPageLayout.HIDDEN_ACTIONSET_PREFIX.length());
if (!alwaysOff.contains(id)) {
alwaysOff.add(id);
}
}
alwaysOn.removeAll(alwaysOff);
for (IActionSetDescriptor descriptor : createInitialActionSets(alwaysOn)) {
if (!alwaysOnActionSets.contains(descriptor)) {
alwaysOnActionSets.add(descriptor);
}
}
for (IActionSetDescriptor descriptor : createInitialActionSets(alwaysOff)) {
if (!alwaysOffActionSets.contains(descriptor)) {
alwaysOffActionSets.add(descriptor);
}
}
}
}
/**
* Create the initial list of action sets.
*
* @return action set descriptors created from given descriptor id's, can be
* empty but never null.
*/
private List<IActionSetDescriptor> createInitialActionSets(List<String> ids) {
List<IActionSetDescriptor> result = new ArrayList<>();
ActionSetRegistry reg = WorkbenchPlugin.getDefault().getActionSetRegistry();
for (String id : ids) {
IActionSetDescriptor desc = reg.findActionSet(id);
if (desc != null) {
result.add(desc);
} else {
// plugin with actionSet was removed
// we remember then so it's available when added back
}
}
return result;
}
/**
* Returns the perspective.
*
* @return can return null!
*/
public IPerspectiveDescriptor getDesc() {
return descriptor;
}
/**
* Returns the new wizard shortcuts associated with this perspective.
*
* @return an array of new wizard identifiers
*/
public String[] getNewWizardShortcuts() {
return page.getNewWizardShortcuts();
}
/**
* Returns the perspective shortcuts associated with this perspective.
*
* @return an array of perspective identifiers
*/
public String[] getPerspectiveShortcuts() {
return page.getPerspectiveShortcuts();
}
/**
* Returns the show view shortcuts associated with this perspective.
*
* @return an array of view identifiers
*/
public String[] getShowViewShortcuts() {
return page.getShowViewShortcuts();
}
private void removeAlwaysOn(IActionSetDescriptor descriptor) {
if (alwaysOnActionSets.contains(descriptor)) {
alwaysOnActionSets.remove(descriptor);
page.perspectiveActionSetChanged(this, descriptor, ActionSetManager.CHANGE_HIDE);
}
}
private void addAlwaysOff(IActionSetDescriptor descriptor) {
if (!alwaysOffActionSets.contains(descriptor)) {
alwaysOffActionSets.add(descriptor);
page.perspectiveActionSetChanged(this, descriptor, ActionSetManager.CHANGE_MASK);
removeAlwaysOn(descriptor);
}
}
private void addAlwaysOn(IActionSetDescriptor descriptor) {
if (!alwaysOnActionSets.contains(descriptor)) {
alwaysOnActionSets.add(descriptor);
page.perspectiveActionSetChanged(this, descriptor, ActionSetManager.CHANGE_SHOW);
removeAlwaysOff(descriptor);
}
}
private void removeAlwaysOff(IActionSetDescriptor descriptor) {
if (alwaysOffActionSets.contains(descriptor)) {
alwaysOffActionSets.remove(descriptor);
page.perspectiveActionSetChanged(this, descriptor, ActionSetManager.CHANGE_UNMASK);
}
}
public void turnOnActionSets(IActionSetDescriptor[] newArray) {
for (IActionSetDescriptor descriptor : newArray) {
addActionSet(descriptor);
}
}
public void turnOffActionSets(IActionSetDescriptor[] toDisable) {
for (IActionSetDescriptor descriptor : toDisable) {
turnOffActionSet(descriptor);
}
}
public void turnOffActionSet(IActionSetDescriptor toDisable) {
removeActionSet(toDisable);
}
// for dynamic UI
protected void addActionSet(IActionSetDescriptor newDesc) {
IContextService service = page.getWorkbenchWindow().getService(IContextService.class);
try {
service.deferUpdates(true);
for (IActionSetDescriptor desc : alwaysOnActionSets) {
if (desc.getId().equals(newDesc.getId())) {
removeAlwaysOn(desc);
removeAlwaysOff(desc);
break;
}
}
addAlwaysOn(newDesc);
final String actionSetID = newDesc.getId();
// Add Tags
String tag = ModeledPageLayout.ACTION_SET_TAG + actionSetID;
if (!layout.getTags().contains(tag)) {
layout.getTags().add(tag);
}
} finally {
service.deferUpdates(false);
}
}
// for dynamic UI
protected void removeActionSet(IActionSetDescriptor toRemove) {
String id = toRemove.getId();
IContextService service = page.getWorkbenchWindow().getService(IContextService.class);
try {
service.deferUpdates(true);
// this advance for loop only works because it breaks out of it
// right after the removal
for (IActionSetDescriptor desc : alwaysOnActionSets) {
if (desc.getId().equals(id)) {
removeAlwaysOn(desc);
break;
}
}
// this advance for loop only works because it breaks out of it
// right after the removal
for (IActionSetDescriptor desc : alwaysOffActionSets) {
if (desc.getId().equals(id)) {
removeAlwaysOff(desc);
break;
}
}
addAlwaysOff(toRemove);
// not necessary to remove the ModeledPageLayout.ACTION_SET_TAG + id
// tag as the entry is only disabled.
} finally {
service.deferUpdates(false);
}
}
public List<IActionSetDescriptor> getAlwaysOnActionSets() {
return alwaysOnActionSets;
}
public List<IActionSetDescriptor> getAlwaysOffActionSets() {
return alwaysOffActionSets;
}
public void updateActionBars() {
page.getActionBars().getMenuManager().updateAll(true);
page.resetToolBarLayout();
}
}