Package de.innovationgate.eclipse.wgadesigner.editors

Source Code of de.innovationgate.eclipse.wgadesigner.editors.WGARuntimeEditor

/*******************************************************************************
* Copyright (c) 2009, 2010 Innovation Gate GmbH.
* 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:
*     Innovation Gate GmbH - initial API and implementation
******************************************************************************/
package de.innovationgate.eclipse.wgadesigner.editors;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.IFormPage;

import de.innovationgate.eclipse.utils.WorkbenchUtils;
import de.innovationgate.eclipse.utils.ui.GenesisBoundFormPage;
import de.innovationgate.eclipse.wgadesigner.WGADesignerPlugin;
import de.innovationgate.eclipse.wgadesigner.models.WGARuntimeConfigurationModel;
import de.innovationgate.eclipse.wgadesigner.natures.IncompatibleWGAConfigVersion;
import de.innovationgate.eclipse.wgadesigner.natures.WGARuntime;
import de.innovationgate.eclipse.wgadesigner.pages.WGARuntimeConfigurationPage;
import de.innovationgate.eclipse.wgadesigner.pages.WGARuntimeStatusPage;
import de.innovationgate.wga.model.ModelListener;

public class WGARuntimeEditor extends FormEditor implements ModelListener, IResourceChangeListener {

  private WGARuntimeConfigurationModel _model;
  private boolean _dirty;
  private WGARuntime _wgaRuntime;
  private Map<String, GenesisBoundFormPage> _pages = new HashMap<String, GenesisBoundFormPage>();

  public WGARuntimeEditor() {
    ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
  }
 
  @Override
  protected void addPages() {
    try {
      WGARuntimeStatusPage status = new WGARuntimeStatusPage(this);
      status.setModel(_model);
      addPage(status);
      WGARuntimeConfigurationPage general = new WGARuntimeConfigurationPage(this);
      general.setModel(_model);
      addPage(general);     
    } catch (PartInitException e) {
      WGADesignerPlugin.getDefault().logError("Unable to init runtime editor pages.", e);
    }
  }

  @Override
  public void init(IEditorSite site, IEditorInput input) throws PartInitException {
    super.init(site, input);
    IProject project = ((IFileEditorInput)input).getFile().getProject();
    try {
      if (project.hasNature(WGADesignerPlugin.NATURE_WGA_RUNTIME)) {
        _wgaRuntime = (WGARuntime) project.getNature(WGADesignerPlugin.NATURE_WGA_RUNTIME);
        setPartName("Runtime (" + _wgaRuntime.getName() + ")");
        _model = new WGARuntimeConfigurationModel();
        try {         
          _model.init(_wgaRuntime);
        } catch (IncompatibleWGAConfigVersion e) {
          MessageDialog.openWarning(getSite().getShell(), "Warning", "The configured WGA distribution seams to be incompatible. Please ensure that your are using the latest version of WGADevelopmentStudio. Some config features may not work properly.");
          WGADesignerPlugin.getDefault().logError(e.getMessage(), e);
        }       
        _model.addListener(this);
      } else {
        throw new PartInitException("This is no wga runtime project.");
      }   
    } catch (PartInitException e) {
      throw e;
    } catch (CoreException e) {
      throw new PartInitException(e.getMessage(), e);
    }
  }

  @Override
  public void doSave(IProgressMonitor monitor) {
    try {
      _model.saveChanges();   
      _dirty = false;
      firePropertyChange(IEditorPart.PROP_DIRTY);     
    } catch (IOException e) {
      WorkbenchUtils.showErrorDialog(WGADesignerPlugin.getDefault(), getSite().getShell(), "Unable to perform save on runtime editor", e);
    }   
  }

  @Override
  public boolean isSaveAsAllowed() {
    return false;
  }

  public void modelChanged() {
    _dirty = true;
    firePropertyChange(IEditorPart.PROP_DIRTY);
  }

  @Override
  public boolean isDirty() {
    return _dirty;
  }

  @Override
  public void doSaveAs() {
  }

  public void resourceChanged(IResourceChangeEvent event) {
    try {
      final IFile fRuntimeConfigFile = ((IFileEditorInput)getEditorInput()).getFile();
      final IFile fWGAConfigFile = _wgaRuntime.getWGAConfigFile();
      event.getDelta().accept(new IResourceDeltaVisitor() {

        public boolean visit(IResourceDelta delta) throws CoreException {
          if (delta.getResource().equals(fRuntimeConfigFile)) {
            if (delta.getResource().exists()) {
              refresh();
              return false;
            } else {
              // runtime has been deleted
              close(false);
            }
          } else if (delta.getResource().equals(fWGAConfigFile)) {
            refresh();
            return false;
          }
          return true;
        }
       
      });
    } catch (CoreException e) {
      WGADesignerPlugin.getDefault().logError("Unable to handle resource change event.", e);
    }
   
  }
 
  /**
   * refresh the editor and all pages with the model state in the filesystem
   */
  public void refresh() {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        Iterator<GenesisBoundFormPage> pages = _pages.values().iterator();
        while (pages.hasNext()) {
          GenesisBoundFormPage page = pages.next();
          try {
            page.refresh();
          } catch (Exception e) {
            WGADesignerPlugin.getDefault().logError("Unable to refresh editor page '" + page.getId() + "'.", e);
          }
        }
        _dirty = false;
        firePropertyChange(IEditorPart.PROP_DIRTY);
      }
    });
  }
 
  @Override
  public int addPage(IFormPage page) throws PartInitException {
    if (page instanceof GenesisBoundFormPage) {
      _pages.put(page.getId(), (GenesisBoundFormPage)page);
    }
    return super.addPage(page);
  }

  @Override
  public void addPage(int index, IFormPage page) throws PartInitException {
    if (page instanceof GenesisBoundFormPage) {
      _pages.put(page.getId(), (GenesisBoundFormPage)page);
    }
    super.addPage(index, page);
  }

  @Override
  public void dispose() {
    super.dispose();
    ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);   
  }
 
}
TOP

Related Classes of de.innovationgate.eclipse.wgadesigner.editors.WGARuntimeEditor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.