/*
* � Copyright IBM Corp. 2015, 2016
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.ibm.xsp.extlib.designer.bluemix.manifest.editor;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.part.MultiPageEditorPart;
import com.ibm.commons.iloader.node.NodeException;
import com.ibm.commons.iloader.node.collections.SingleCollection;
import com.ibm.commons.util.StringUtil;
import com.ibm.designer.domino.ide.resources.project.IDominoDesignerProject;
import com.ibm.xsp.extlib.designer.bluemix.BluemixLogger;
import com.ibm.xsp.extlib.designer.bluemix.manifest.editor.ManifestMetaModel.BluemixManifestEditorInput;
import com.ibm.xsp.extlib.designer.bluemix.util.BluemixUtil;
/**
* @author Gary Marjoram
*
*/
public class ManifestMultiPageEditor extends MultiPageEditorPart implements IWindowListener, ISelectionProvider {
private static final int PAGE_GENERAL = 0;
private static final int PAGE_ENV = 1;
private static final int PAGE_HYBRID = 2;
private static final int PAGE_SOURCE = 3;
private ManifestEditorPage _genEditor;
private ManifestHybridEditorPage _hybridEditor;
private ManifestEnvEditorPage _envEditor;
private ManifestTextEditor _srcEditor;
private IEditorInput _editorInput;
private FormToolkit _toolkit;
private ManifestBeanLoader _beanLoader;
private ManifestBean _bean;
private IDominoDesignerProject _designerProject;
private ISelection _editorSelection = null;
private int _currentPage = PAGE_GENERAL;
public ManifestMultiPageEditor() {
}
@Override
protected void createPages() {
String label = BluemixUtil.productizeString(StringUtil.format("%BM_PRODUCT% Manifest - {0}", _designerProject.getDatabaseTitle())); // $NLX-ManifestMultiPageEditor.IBMBluemixManifest0-1$
setPartName(label);
Composite ourContainer = this.getContainer();
if ( _toolkit == null){
_toolkit = new FormToolkit(ourContainer.getDisplay() );
_toolkit.setBackground(ourContainer.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
_toolkit.setBorderStyle(ourContainer.getBorderWidth());
}
ourContainer.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (_toolkit != null) {
_toolkit.dispose();
_toolkit = null;
}
PlatformUI.getWorkbench().removeWindowListener(ManifestMultiPageEditor.this);
}
});
try {
// Add the General page
_genEditor = new ManifestEditorPage(this.getContainer(), _toolkit, this);
setupPage(PAGE_GENERAL, _genEditor, "General"); // $NLX-ManifestMultiPageEditor.General-1$
// Add the Environment Variables page
_envEditor = new ManifestEnvEditorPage(this.getContainer(), _toolkit, this);
setupPage(PAGE_ENV, _envEditor, "Environment Variables"); // $NLX-ManifestMultiPageEditor.EnvironmentVariables-1$
// Add the Hybrid Configuration page
_hybridEditor = new ManifestHybridEditorPage(this.getContainer(), _toolkit, this);
setupPage(PAGE_HYBRID, _hybridEditor, "Hybrid Configuration"); // $NLX-ManifestMultiPageEditor.HybridConfiguration-1$
// Add the Source page
_srcEditor = new ManifestTextEditor();
addPage(_srcEditor, _editorInput);
setPageText(PAGE_SOURCE, "Source"); // $NLX-ManifestMultiPageEditor.Source-1$
} catch (Exception e) {
if (BluemixLogger.BLUEMIX_LOGGER.isErrorEnabled()) {
BluemixLogger.BLUEMIX_LOGGER.errorp(this, "createPages", e, "Failed to create visual editor"); // $NON-NLS-1$ $NLE-ManifestMultiPageEditor.Failedtocreatevisualeditor-2$
}
}
PlatformUI.getWorkbench().addWindowListener(this);
}
protected void setupPage(int index, AbstractManifestEditorPage page, String tabText) throws NodeException {
page.getDataNode().setClassDef(_beanLoader.getClassOf(_bean));
page.getDataNode().setDataProvider(new SingleCollection(_bean));
page.getDataNode().setModelModified(false);
addPage(page);
setPageText(index, tabText);
page.refreshUI();
}
@Override
protected void pageChange(int newPageIndex) {
if (_currentPage == PAGE_SOURCE) {
// Moving from the Source Editor to visual - update the bean from the src
String contents = getSrcEditor().getDocumentProvider().getDocument(_editorInput).get();
_bean.loadFromString(contents);
}
switch (newPageIndex) {
case PAGE_GENERAL:
refreshPage(_genEditor);
break;
case PAGE_ENV:
refreshPage(_envEditor);
break;
case PAGE_HYBRID:
refreshPage(_hybridEditor);
break;
default:
break;
}
super.pageChange(newPageIndex);
_currentPage = this.getActivePage();
}
public void refreshPage(AbstractManifestEditorPage page) {
if (_bean.isManifestValid()) {
page.getDataNode().notifyInvalidate(null);
page.refreshUI();
page.hideError();
} else {
page.displayError();
}
}
@Override
public void init(IEditorSite editorSite, IEditorInput editorInput) throws PartInitException {
_editorInput = editorInput;
_designerProject = ((BluemixManifestEditorInput)_editorInput).getDesignerProject();
// Setup the bean and the bean loader
_beanLoader = new ManifestBeanLoader("bluemix.manifest", (FileStoreEditorInput) editorInput, this); // $NON-NLS-1$
_bean = new ManifestBean((FileStoreEditorInput)editorInput);
super.init(editorSite, editorInput);
getSite().setSelectionProvider(this);
}
@Override
public void doSave(IProgressMonitor progress) {
if (_srcEditor.isDirty()) {
// Save
_srcEditor.doSave(progress);
// Update the bean file modified time so we're
// not prompting the user to reload
_bean.resetModifiedTime();
// Have to do this to update the dirty state of the editor
firePropertyChange(IEditorPart.PROP_DIRTY);
}
}
@Override
public void doSaveAs() {
}
@Override
public boolean isSaveAsAllowed() {
return true;
}
public TextEditor getSrcEditor() {
return _srcEditor;
}
public ManifestBean getBean() {
return _bean;
}
public IEditorInput getEditorInput() {
return _editorInput;
}
// Function to update the source editor with the contents of the bean
public void writeContentsFromBean() {
getSrcEditor().getDocumentProvider().getDocument(getEditorInput()).set(getBean().getContents());
}
public IDominoDesignerProject getDesignerProject() {
return _designerProject;
}
@Override
public void setFocus() {
super.setFocus();
// Every time the editor gets focus check if it has been modified externally
checkForExternalChange();
}
@Override
public void windowActivated(IWorkbenchWindow arg0) {
// Every time the editor gets focus check if it has been modified externally
checkForExternalChange();
}
@Override
public void windowClosed(IWorkbenchWindow arg0) {
}
@Override
public void windowDeactivated(IWorkbenchWindow arg0) {
}
@Override
public void windowOpened(IWorkbenchWindow arg0) {
}
private void checkForExternalChange() {
// Check has the file been externally modified
if (_bean.externallyModified()) {
// Only do this once per change
_bean.resetModifiedTime();
// Ask the reload question
String msg = "The file '{0}' has been changed on the file system. Do you wish to replace the editor contents with these changes?"; // $NLX-ManifestMultiPageEditor.Thefile0hasbeenchangedonthefilesy-1$
if (MessageDialog.openQuestion(null, "File changed", StringUtil.format(msg, _bean.getFileName()))) { // $NLX-ManifestMultiPageEditor.Filechanged-1$
// Reload the file
_srcEditor.doRevertToSaved();
// Make sure the contents are reflected in the editor
pageChange(getActivePage());
} else {
// User has chosen not to reload - show editor as "dirty"
_srcEditor.setExternallyModified(true);
firePropertyChange(IEditorPart.PROP_DIRTY);
}
}
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener arg0) {
}
@Override
public ISelection getSelection() {
if (_editorSelection == null) {
_editorSelection = new StructuredSelection(getDesignerProject());
}
return _editorSelection;
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener arg0) {
}
@Override
public void setSelection(ISelection selection) {
_editorSelection = selection;
}
}