/**
SpagoBI, the Open Source Business Intelligence suite
Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this file,
You can obtain one at http://mozilla.org/MPL/2.0/.
**/
package it.eng.spagobi.studio.documentcomposition.editors;
import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.DocumentComposition;
import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.bo.ModelBO;
import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.metadata.MetadataBO;
import it.eng.spagobi.studio.documentcomposition.util.DocCompUtilities;
import it.eng.spagobi.studio.documentcomposition.util.XmlTemplateGenerator;
import it.eng.spagobi.studio.documentcomposition.views.DocumentParametersView;
import it.eng.spagobi.studio.documentcomposition.views.DocumentPropertiesView;
import it.eng.spagobi.studio.documentcomposition.views.NavigationView;
import it.eng.spagobi.studio.documentcomposition.views.VideoSizeView;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.FileEditorInput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** this is the editor of a file that terminates with .doccomp
*
* @author gavardi
*
*/
public class DocumentCompositionEditor extends EditorPart {
String templateName="";
int height=0;
int width=0;
Designer designer;
private XmlTemplateGenerator generator = new XmlTemplateGenerator();
protected boolean isDirty = false;
private static Logger logger = LoggerFactory.getLogger(DocumentCompositionEditor.class);
/**
* Dispose of the editor
*/
@Override
public void dispose() {
logger.debug("IN");
super.dispose();
// construct navigationVie
IViewPart navigationView = DocCompUtilities.getViewReference(DocCompUtilities.NAVIGATION_VIEW_ID);
if(navigationView != null && navigationView instanceof NavigationView){
navigationView = (NavigationView)navigationView;
getSite().getPage().hideView(navigationView);
}
// construct navigationVie
IViewPart propertiesView = DocCompUtilities.getViewReference(DocCompUtilities.DOCUMENT_PROPERTIES_VIEW_ID);
if(propertiesView != null && propertiesView instanceof DocumentPropertiesView){
propertiesView = (DocumentPropertiesView)propertiesView;
getSite().getPage().hideView(propertiesView);
}
IViewPart parametersView = DocCompUtilities.getViewReference(DocCompUtilities.DOCUMENT_PARAMETERS_VIEW_ID);
if(parametersView != null && parametersView instanceof DocumentParametersView){
parametersView = (DocumentParametersView)parametersView;
getSite().getPage().hideView(parametersView);
}
IViewPart videoView = DocCompUtilities.getViewReference(DocCompUtilities.VIDEO_SIZE_VIEW_ID);
if(videoView != null && videoView instanceof VideoSizeView){
videoView = (VideoSizeView)videoView;
getSite().getPage().hideView(videoView);
}
logger.debug("OUT");
}
@Override
public void doSave(IProgressMonitor monitor) {
logger.debug("IN");
ByteArrayInputStream bais = null;
// Before Saving recalculate all containers style because they could have changed with video size
DocumentComposition documentComposition=(new ModelBO()).getModel();
// reload styles
documentComposition.reloadAllStylesContained();
try {
FileEditorInput fei = (FileEditorInput) getEditorInput();
IFile file = fei.getFile();
String newContent = generator.transformToXml(documentComposition);
byte[] bytes = newContent.getBytes();
bais = new ByteArrayInputStream(bytes);
file.setContents(bais, IFile.FORCE, null);
} catch (CoreException e) {
logger.error("Error while Saving Document Composition Template File",e);
}
finally {
if (bais != null)
try {
bais.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
setIsDirty(false);
logger.debug("OUT");
}
public void setIsDirty(boolean isDirty) {
this.isDirty = isDirty;
firePropertyChange(PROP_DIRTY);
}
public boolean isDirty() {
return isDirty;
}
@Override
public void doSaveAs() {
// TODO Auto-generated method stub
}
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
logger.debug("IN");
//verifica se esiste gi� un documento aperto
try{
this.setPartName(input.getName());
FileEditorInput fei = (FileEditorInput) input;
setInput(input);
setSite(site);
IEditorPart currentEditor = DocCompUtilities.getEditorReference(DocCompUtilities.DOCUMENT_COMPOSITION_EDITOR_ID);
if(currentEditor != null && currentEditor instanceof DocumentCompositionEditor){
logger.warn("Editor is already opened!!!");
// System.out.println("Editor is already opened!!!");
MessageDialog.openError(site.getShell(), "ERROR", "Operation denied. Another editor is opened.");
IWorkbenchPage iworkbenchpage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
iworkbenchpage.closeEditor(this, false);
return;
}
IFile file = fei.getFile();
templateName=file.getName();
ModelBO bo=new ModelBO();
try {
// create the model from the file and save it
DocumentComposition documentComposition = bo.createModel(file);
bo.saveModel(documentComposition);
// create the metadatamodel that will be filled later in designer initialization
new MetadataBO().createMetadataDocumentComposition(file);
// make the editor dirty; that s needed because metadata on parameters of contained
// documents could have changed, and in order to be persisted user will have to save them!
setIsDirty(true);
} catch (CoreException e) {
e.printStackTrace();
logger.error(DocumentCompositionEditor.class.toString()+": Error in reading template", e);
throw(new PartInitException("Error in reading template"));
}
}catch(Exception e){
logger.warn("Error occurred:"+e.getMessage());
}
logger.debug("OUT");
}
@Override
public boolean isSaveAsAllowed() {
// TODO Auto-generated method stub
return false;
}
@Override
public void createPartControl(Composite _parent) {
logger.debug("IN");
//inserisce le viste
try {
IWorkbenchPage iworkbenchpage = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
if(iworkbenchpage != null){
if (iworkbenchpage.findView(DocCompUtilities.DOCUMENT_PROPERTIES_VIEW_ID) == null ){
iworkbenchpage.showView(DocCompUtilities.DOCUMENT_PROPERTIES_VIEW_ID);
}
if (iworkbenchpage.findView(DocCompUtilities.DOCUMENT_PARAMETERS_VIEW_ID) == null ){
iworkbenchpage.showView(DocCompUtilities.DOCUMENT_PARAMETERS_VIEW_ID);
}
if (iworkbenchpage.findView(DocCompUtilities.NAVIGATION_VIEW_ID) == null ){
iworkbenchpage.showView(DocCompUtilities.NAVIGATION_VIEW_ID);
}
if (iworkbenchpage.findView(DocCompUtilities.VIDEO_SIZE_VIEW_ID) == null ){
iworkbenchpage.showView(DocCompUtilities.VIDEO_SIZE_VIEW_ID);
}
IViewPart object=DocCompUtilities.getViewReference(DocCompUtilities.VIDEO_SIZE_VIEW_ID);
if(object!=null){
VideoSizeView view=(VideoSizeView)object;
view.reloadSizes();
}
}
} catch (PartInitException partinitexception) {
partinitexception.printStackTrace();
}
FormToolkit toolkit = new FormToolkit(_parent.getDisplay());
final ScrolledForm form = toolkit.createScrolledForm(_parent);
TableWrapLayout layout = new TableWrapLayout();
layout.numColumns = 1;
layout.horizontalSpacing = 20;
layout.verticalSpacing = 10;
layout.topMargin = 20;
layout.leftMargin = 20;
// FillLayout layout = new FillLayout();
form.getBody().setLayout(layout);
final Section section = toolkit.createSection(form.getBody(),
Section.TITLE_BAR | SWT.NO_REDRAW_RESIZE);
//section.setLayoutData()
section.setSize(1000, 1000);
section.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
//parent.setSize(width, height);
form.reflow(true);
}
});
section.setText("Document Composition designer: Screen");
Composite sectionClient = toolkit.createComposite(section, SWT.NO_REDRAW_RESIZE);
//sectionClient.setSize(1000, 1000);
Composite composite=new Group(sectionClient,SWT.BORDER_DOT);
// composite.setText("Video");
composite.setBackground(new Color(composite.getDisplay(), new RGB(240,240,240)));
composite.setLocation(0, 0);
composite.setSize(800, 600);
designer=new Designer(composite, this);
designer.setEditor(this);
String projectName=retrieveProjectFile((FileEditorInput)getEditorInput());
designer.setProjectName(projectName);
section.setClient(sectionClient);
// Add the control resize, shell resize all the document Containers
width=sectionClient.getBounds().width;
height=sectionClient.getBounds().height;
// Now initialize Editor with DocumentComposition retrieved
initializeEditor(new ModelBO().getModel());
logger.debug("OUT");
}
public void initializeEditor(DocumentComposition documentComposition){
logger.debug("IN");
// clean the properties View
IWorkbenchWindow a=PlatformUI.getWorkbench().getWorkbenchWindows()[0];
// Document properties
IWorkbenchPage aa=a.getActivePage();
try{
IViewPart object=DocCompUtilities.getViewReference(DocCompUtilities.DOCUMENT_PROPERTIES_VIEW_ID);
if(object!=null){
DocumentPropertiesView view=(DocumentPropertiesView)object;
view.cleanSizeAndProperties();
}
else{
logger.warn("view Document Propertiess closed");
}
}
catch (Exception e) {
logger.warn("Window not active, could not empty the property view");
}
try{
IViewPart object=DocCompUtilities.getViewReference(DocCompUtilities.DOCUMENT_PARAMETERS_VIEW_ID);
if(object!=null){
DocumentParametersView view=(DocumentParametersView)object;
view.cleanParameters();
}
else{
logger.warn("view Document Parameters closed");
}
}
catch (Exception e) {
logger.warn("Window not active, could not empty the property view");
}
try{
IViewPart object=DocCompUtilities.getViewReference(DocCompUtilities.NAVIGATION_VIEW_ID);
if(object!=null){
NavigationView view=(NavigationView)object;
view.cleanParameters();
}
else{
logger.warn("view Navigation not present");
}
}
catch (Exception e) {
logger.warn("Window not active, could not empty the property view");
}
// Initialize Designer
designer.initializeDesigner(documentComposition);
logger.debug("OUT");
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
String retrieveProjectFile(FileEditorInput input){
IFile file=input.getFile();
IProject project=file.getProject();
String toReturn=project.getName();
return toReturn;
}
public Designer getDesigner() {
return designer;
}
public void setDesigner(Designer designer) {
this.designer = designer;
}
}