blob: 6712ab3f3c516e2a32051c27fd49232bd7308ebc [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
* Benjamin Cabe <benjamin.cabe@anyware-tech.com> - bug 262977
*******************************************************************************/
package org.eclipse.pde.internal.ui.editor.site;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Locale;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.*;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.pde.core.IModel;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.exports.SiteBuildOperation;
import org.eclipse.pde.internal.core.ifeature.IFeatureModel;
import org.eclipse.pde.internal.core.isite.*;
import org.eclipse.pde.internal.core.site.WorkspaceSiteModel;
import org.eclipse.pde.internal.ui.*;
import org.eclipse.pde.internal.ui.editor.*;
import org.eclipse.pde.internal.ui.editor.context.InputContext;
import org.eclipse.pde.internal.ui.editor.context.InputContextManager;
import org.eclipse.ui.*;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.part.FileEditorInput;
public class SiteEditor extends MultiSourceEditor {
private Action fBuildAllAction;
@Override
protected String getEditorID() {
return IPDEUIConstants.SITE_EDITOR_ID;
}
@Override
protected void createResourceContexts(InputContextManager manager, IFileEditorInput input) {
IFile file = input.getFile();
IFile siteFile = null;
String name = file.getName().toLowerCase(Locale.ENGLISH);
if (name.equals("site.xml")) { //$NON-NLS-1$
siteFile = file;
if (siteFile.exists()) {
IEditorInput in = new FileEditorInput(siteFile);
manager.putContext(in, new SiteInputContext(this, in, file == siteFile));
}
manager.monitorFile(siteFile);
}
}
@Override
protected InputContextManager createInputContextManager() {
SiteInputContextManager contextManager = new SiteInputContextManager(this);
contextManager.setUndoManager(new SiteUndoManager(this));
return contextManager;
}
@Override
public void monitoredFileAdded(IFile file) {
}
@Override
public boolean monitoredFileRemoved(IFile file) {
//TODO may need to check with the user if there
//are unsaved changes in the model for the
//file that just got removed under us.
return true;
}
@Override
public void editorContextAdded(InputContext context) {
addSourcePage(context.getId());
}
@Override
public void contextRemoved(InputContext context) {
close(false);
}
@Override
protected void createSystemFileContexts(InputContextManager manager, FileStoreEditorInput input) {
File file = new File(input.getURI());
File siteFile = null;
String name = file.getName().toLowerCase(Locale.ENGLISH);
if (name.equals("site.xml")) { //$NON-NLS-1$
siteFile = file;
if (siteFile.exists()) {
IFileStore store;
try {
store = EFS.getStore(siteFile.toURI());
IEditorInput in = new FileStoreEditorInput(store);
manager.putContext(in, new SiteInputContext(this, in, file == siteFile));
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
}
}
@Override
protected void createStorageContexts(InputContextManager manager, IStorageEditorInput input) {
String name = input.getName().toLowerCase(Locale.ENGLISH);
if (name.startsWith("site.xml")) { //$NON-NLS-1$
manager.putContext(input, new SiteInputContext(this, input, true));
}
}
@Override
protected void contextMenuAboutToShow(IMenuManager manager) {
super.contextMenuAboutToShow(manager);
}
@Override
protected void addEditorPages() {
try {
addPage(new FeaturesPage(this));
addPage(new ArchivePage(this));
} catch (PartInitException e) {
PDEPlugin.logException(e);
}
addSourcePage(SiteInputContext.CONTEXT_ID);
}
@Override
protected String computeInitialPageId() {
return FeaturesPage.PAGE_ID;
}
@Override
protected PDESourcePage createSourcePage(PDEFormEditor editor, String title, String name, String contextId) {
return new SiteSourcePage(editor, title, name);
}
@Override
protected ISortableContentOutlinePage createContentOutline() {
return new SiteOutlinePage(this);
}
@Override
protected InputContext getInputContext(Object object) {
InputContext context = null;
if (object instanceof ISiteObject) {
context = fInputContextManager.findContext(SiteInputContext.CONTEXT_ID);
}
return context;
}
@Override
public void contributeToToolbar(IToolBarManager manager) {
manager.add(getBuildAllAction());
}
protected Action getBuildAllAction() {
if (fBuildAllAction == null) {
fBuildAllAction = new Action() {
@Override
public void run() {
ISiteModel model = (ISiteModel) getAggregateModel();
if (model != null) {
handleBuild(model.getSite().getFeatures());
}
}
};
fBuildAllAction.setToolTipText(PDEUIMessages.CategorySection_buildAll);
fBuildAllAction.setImageDescriptor(PDEPluginImages.DESC_BUILD_TOOL);
updateActionEnablement();
ISiteModel model = (ISiteModel) getAggregateModel();
if (model != null) {
model.addModelChangedListener(event -> updateActionEnablement());
}
}
return fBuildAllAction;
}
private void updateActionEnablement() {
if (((ISiteModel) getAggregateModel()).getSite().getFeatures().length > 0)
fBuildAllAction.setEnabled(true);
else
fBuildAllAction.setEnabled(false);
}
protected void handleBuild(ISiteFeature[] sFeatures) {
if (sFeatures.length == 0) {
return;
}
IFeatureModel[] models = getFeatureModels(sFeatures);
if (models.length == 0) {
return;
}
ensureContentSaved();
IModel model = (IModel) getAggregateModel();
if (model == null) {
return;
}
ISiteModel buildSiteModel = new WorkspaceSiteModel((IFile) model.getUnderlyingResource());
try {
buildSiteModel.load();
} catch (CoreException e) {
PDEPlugin.logException(e);
return;
}
Job job = new SiteBuildOperation(models, buildSiteModel, PDEUIMessages.BuildSiteJob_name);
job.setUser(true);
job.schedule();
}
private IFeatureModel[] getFeatureModels(ISiteFeature[] sFeatures) {
ArrayList<IFeatureModel> list = new ArrayList<>();
for (ISiteFeature siteFeature : sFeatures) {
IFeatureModel model = PDECore.getDefault().getFeatureModelManager().findFeatureModelRelaxed(siteFeature.getId(), siteFeature.getVersion());
if (model != null)
list.add(model);
}
return list.toArray(new IFeatureModel[list.size()]);
}
private void ensureContentSaved() {
if (isDirty()) {
try {
IRunnableWithProgress op = this::doSave;
PlatformUI.getWorkbench().getProgressService().runInUI(PDEPlugin.getActiveWorkbenchWindow(), op, PDEPlugin.getWorkspace().getRoot());
} catch (InvocationTargetException e) {
PDEPlugin.logException(e);
} catch (InterruptedException e) {
}
}
}
}