/*******************************************************************************
* 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.editors.design.pages;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import net.java.dev.genesis.ui.swt.SWTBinder;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
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.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.ColumnLayout;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import de.innovationgate.eclipse.editors.Plugin;
import de.innovationgate.eclipse.editors.ResourceIDs;
import de.innovationgate.eclipse.editors.models.DirectAccessibleTMLModulModel;
import de.innovationgate.eclipse.utils.WorkbenchUtils;
import de.innovationgate.eclipse.utils.ui.EditableTableControl;
import de.innovationgate.eclipse.utils.ui.GenesisBoundFormPage;
import de.innovationgate.eclipse.utils.ui.model.WGADesignConfigurationModelWrapper;
import de.innovationgate.eclipse.utils.wga.WGADesignStructureHelper;
import de.innovationgate.wga.model.Model;
public class DirectAccessibleModulesPage extends GenesisBoundFormPage implements IResourceChangeListener {
public static final String ID = "de.innovationgate.eclipse.wgadesigner.pages.DirectAccessibleModulesDirectPage";
public static final String PAGE_TITLE = "Direct accessible TML-Modules";
private FormEditor _editor;
private WGADesignConfigurationModelWrapper _model;
private Table _tblModules;
private TableColumn _roleNameColumn;
private TableColumn _assignDefaultManagerColumn;
private TableViewer _tblViewerModules;
private EditableTableControl _tableControl;
private DirectAccessibleTMLModulModel _directAccessibleFilesModel;
public DirectAccessibleModulesPage(FormEditor editor) {
super(editor, ID, PAGE_TITLE);
_editor = editor;
ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
@Override
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
super.dispose();
}
public Model getModel() {
return _model;
}
public void setModel(Model model) {
if (!(model instanceof WGADesignConfigurationModelWrapper)) {
throw new IllegalArgumentException("Unsupported model type '" + model.getClass().getName() + "'.");
}
_model = (WGADesignConfigurationModelWrapper) model;
}
protected void createFormContent(IManagedForm managedForm) {
ScrolledForm form = managedForm.getForm();
FormToolkit toolkit = managedForm.getToolkit();
toolkit.decorateFormHeading(form.getForm());
form.setText(PAGE_TITLE);
ColumnLayout layout = new ColumnLayout();
layout.maxNumColumns = 2;
form.getBody().setLayout(layout);
Section section = toolkit.createSection(form.getBody(), Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
section.setText("Modules");
Composite sectionClient = toolkit.createComposite(section);
section.setClient(sectionClient);
GridLayout sectionLayout = new GridLayout();
GridData fillHSpan = new GridData(GridData.FILL_HORIZONTAL);
fillHSpan.horizontalSpan = 4;
GridData prefSize = new GridData();
prefSize.widthHint = 500;
sectionLayout.numColumns = 1;
sectionClient.setLayout(sectionLayout);
ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
ToolBar toolbar = toolBarManager.createControl(section);
Action action1 = new Action("refresh", Plugin.getDefault().getImageRegistry().getDescriptor(Plugin.IMAGE_REFRESH)) {
public void run() {
try {
refresh();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
toolBarManager.add(action1);
toolBarManager.update(true);
section.setTextClient(toolbar);
_directAccessibleFilesModel = new DirectAccessibleTMLModulModel(getDirectAccessibleFiles());
_tableControl = new EditableTableControl<IFile>(sectionClient, SWT.NONE) {
@Override
protected void createButtonArea(Composite area) {
}
};
_tableControl.init(new String[] { "TML File", "Path" }, _directAccessibleFilesModel);
GridData data = new GridData(GridData.FILL_BOTH);
data.heightHint = 300;
_tableControl.setLayoutData(data);
_tableControl.getTable().addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
handleOpenInEditor();
}
public void mouseDown(MouseEvent e) {
}
public void mouseUp(MouseEvent e) {
}
});
bind(form, SWTBinder.BINDING_STRATEGY_AS_YOU_TYPE);
}
private void handleOpenInEditor() {
if (_tableControl.getTable().getSelectionCount() > 0) {
IFile selectedFile = _directAccessibleFilesModel.getBeans().get(_tableControl.getTable().getSelectionIndex());
try {
WorkbenchUtils.openEditor(Plugin.getDefault().getWorkbench(), selectedFile, ResourceIDs.EDITOR_TML);
}
catch (PartInitException e) {
WorkbenchUtils.showErrorDialog(Plugin.getDefault(), getSite().getShell(), "Unable to open TML Editor", e);
}
}
}
private List<IFile> getDirectAccessibleFiles() {
final List<IFile> directAccessibleFiles = new ArrayList<IFile>();
try {
_model.getDesignContainer().accept(new IResourceVisitor() {
public boolean visit(IResource resource) throws CoreException {
if (resource instanceof IFile) {
IFile file = (IFile) resource;
if (WGADesignStructureHelper.isDirectAccess(file)) {
directAccessibleFiles.add(file);
}
}
return true;
}
});
}
catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return directAccessibleFiles;
}
@Override
public void refresh() throws IOException {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if(_directAccessibleFilesModel != null){
_directAccessibleFilesModel.refresh(getDirectAccessibleFiles());
}
}
});
}
public void resourceChanged(IResourceChangeEvent event) {
final IPath dsgPath = _model.getDesignContainer().getFullPath();
try {
myDeltaVisitor visitor = new myDeltaVisitor();
event.getDelta().accept(visitor);
if (visitor.isRefreshNeeded()) {
refresh();
}
}
catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class myDeltaVisitor implements IResourceDeltaVisitor {
final IPath dsgPath = _model.getDesignContainer().getFullPath();
private boolean _isRefreshNeeded = false;
public boolean visit(IResourceDelta delta) throws CoreException {
if (delta.getFullPath().equals(dsgPath)) {
_isRefreshNeeded = true;
return false;
}
else {
return true;
}
}
public boolean isRefreshNeeded() {
return _isRefreshNeeded;
}
}
}