/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.viewsupport;
import java.util.Properties;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.teiid.core.designer.event.IChangeListener;
import org.teiid.core.designer.event.IChangeNotifier;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.DotProjectUtils;
import org.teiid.designer.ui.UiConstants;
import org.teiid.designer.ui.common.util.WidgetFactory;
import org.teiid.designer.ui.common.viewsupport.ClosedProjectFilter;
import org.teiid.designer.ui.common.viewsupport.StatusInfo;
import org.teiid.designer.ui.common.widget.Label;
import org.teiid.designer.ui.explorer.ModelExplorerContentProvider;
import org.teiid.designer.ui.explorer.ModelExplorerLabelProvider;
/**
* This dialog allows users to either SELECT or CREATE NEW Designer model
* project
*
*
* @since 8.0
*/
public class DefineModelProjectDialog extends TitleAreaDialog implements
IChangeListener, UiConstants {
private static final String PREFIX = I18nUtil.getPropertyPrefix(DefineModelProjectDialog.class);
private IProject project;
private ILabelProvider labelProvider = new ModelExplorerLabelProvider();
private Button newProjectButton;
private Button browseButton;
private Text selectedProjectText;
DesignerProperties designerProperties;
/**
* @since 5.5.3
*/
public DefineModelProjectDialog(Shell parentShell) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
/**
* @since 5.5.3
*/
public DefineModelProjectDialog(Shell parentShell, Properties properties) {
this(parentShell);
this.designerProperties = (DesignerProperties)properties;
}
/**
* @see org.eclipse.jface.dialogs.Dialog#close()
* @since 5.5.3
*/
@Override
public boolean close() {
if (this.labelProvider != null) {
this.labelProvider.dispose();
}
return super.close();
}
/**
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
* @since 5.5.3
*/
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(Util.getString(PREFIX + "title")); //$NON-NLS-1$
}
/**
* @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
* @since 5.5.3
*/
@Override
protected Control createButtonBar(Composite parent) {
Control buttonBar = super.createButtonBar(parent);
getButton(OK).setEnabled(false);
// set the first selection so that initial validation state is set
// (doing it here since the selection handler uses OK
// button)
return buttonBar;
}
/**
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
* @since 5.5.3
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite pnlOuter = (Composite) super.createDialogArea(parent);
Composite panel = new Composite(pnlOuter, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 4;
panel.setLayout(gridLayout);
panel.setLayoutData(new GridData(GridData.FILL_BOTH));
// set title
setTitle(Util.getString(PREFIX + "subTitle")); //$NON-NLS-1$
setMessage(Util.getString(PREFIX + "initialMessage")); //$NON-NLS-1$
Label label = WidgetFactory.createLabel(panel, Util.getString(PREFIX + "modelProject")); //$NON-NLS-1$
label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
// textfield for named type
this.selectedProjectText = WidgetFactory.createTextField(panel,GridData.FILL_HORIZONTAL/* GridData.HORIZONTAL_ALIGN_FILL */);
this.selectedProjectText.setToolTipText(Util.getString(PREFIX+ "projectNameTooltip")); //$NON-NLS-1$
this.selectedProjectText.setEditable(false);
this.selectedProjectText.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
this.selectedProjectText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE));
// browse type button
this.newProjectButton = WidgetFactory.createButton(panel, Util.getString(PREFIX+ "newButton")); //$NON-NLS-1$
this.newProjectButton.setToolTipText(Util.getString(PREFIX+ "newButtonTooltip")); //$NON-NLS-1$
this.newProjectButton.setEnabled(true);
this.newProjectButton.setLayoutData(new GridData(SWT.CENTER, SWT.NONE,false, false));
this.newProjectButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent theEvent) {
handleNewProjectPressed();
}
});
this.browseButton = WidgetFactory.createButton(panel, Util.getString(PREFIX+ "browseButton")); //$NON-NLS-1$
this.browseButton.setToolTipText(Util.getString(PREFIX+ "browseButtonTooltip")); //$NON-NLS-1$
this.browseButton.setEnabled(true);
this.browseButton.setLayoutData(new GridData(SWT.CENTER, SWT.NONE,false, false));
this.browseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent theEvent) {
handleBrowseWorkspaceForObjectPressed();
}
});
return panel;
}
@Override
protected Control createContents(Composite parent) {
Control control = super.createContents(parent);
if (this.designerProperties != null) {
// Check for existing project??
this.project = DesignerPropertiesUtil.getProject(this.designerProperties);
if (this.project != null) {
this.selectedProjectText.setText(this.project.getName());
}
updateState();
}
return control;
}
public IProject getProject() {
return this.project;
}
/**
* @see org.teiid.core.designer.event.IChangeListener#stateChanged(org.teiid.core.designer.event.IChangeNotifier)
* @since 5.5.3
*/
@Override
public void stateChanged(IChangeNotifier theSource) {
updateState();
}
private void updateState() {
IStatus status = Status.OK_STATUS;
if (status.getSeverity() == IStatus.ERROR) {
getButton(OK).setEnabled(false);
setErrorMessage(status.getMessage());
} else {
getButton(OK).setEnabled(true);
setErrorMessage(null);
setMessage(Util.getString(PREFIX + "okMsg")); //$NON-NLS-1$
}
}
private void handleNewProjectPressed() {
Properties properties = this.designerProperties;
if( properties == null ) {
properties = new Properties();
} else {
properties.clear();
}
ModelerUiViewUtils.launchWizard("newModelProject", new StructuredSelection(), properties, true); //$NON-NLS-1$
// Get the new project, which may be null if cancelled
this.project = DesignerPropertiesUtil.getProject(properties);
if( this.project != null ) {
this.selectedProjectText.setText(this.project.getName());
}
}
private void handleBrowseWorkspaceForObjectPressed() {
ModelWorkspaceDialog sdDialog = createProjectSelector();
// add filters
sdDialog.addFilter(new ClosedProjectFilter());
sdDialog.open();
if (sdDialog.getReturnCode() == Window.OK) {
Object[] selections = sdDialog.getResult();
// should be single selection
// Check for duplicate project, if NOT then need to clear all properties and then set, else ignore
IProject selectedProject = (IProject) selections[0];
if( this.project != null &&
selectedProject != null &&
selectedProject.getName().equals(this.project.getName())) {
return;
}
// projects are different, clear properties
this.designerProperties.clear();
this.project = selectedProject;
String pName = (this.project!=null) ? this.project.getName() : ""; //$NON-NLS-1$
this.selectedProjectText.setText(pName);
DesignerPropertiesUtil.setProjectName(this.designerProperties, pName);
if( this.project != null ) {
DesignerPropertiesUtil.setProjectStatus(this.designerProperties, IPropertiesContext.OPEN_PROJECTS_EXIST);
// Check for source and view folders
try {
for( IResource res : project.members() ) {
if( res instanceof IContainer ) {
if ( ((IContainer)res).getName().equalsIgnoreCase("sources") ) { //$NON-NLS-1$
DesignerPropertiesUtil.setSourcesFolderName(this.designerProperties, "sources"); //$NON-NLS-1$
} else if(((IContainer)res).getName().equalsIgnoreCase("views")) { //$NON-NLS-1$
DesignerPropertiesUtil.setViewsFolderName(this.designerProperties, "views"); //$NON-NLS-1$
}
}
}
} catch (CoreException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
updateState();
}
}
public ModelWorkspaceDialog createProjectSelector() {
ModelWorkspaceDialog result = new ModelWorkspaceDialog(getShell(),
null, new ModelExplorerLabelProvider(),
new ModelExplorerContentProvider());
String title = Util.getString(PREFIX + "selectionDialog.title"); //$NON-NLS-1$
String message = Util.getString(PREFIX + "selectionDialog.message"); //$NON-NLS-1$
result.setTitle(title);
result.setMessage(message);
result.setAllowMultiple(false);
result.setInput(ModelerCore.getWorkspace().getRoot());
result.setValidator(new ISelectionStatusValidator() {
@Override
public IStatus validate(Object[] selection) {
if (selection == null
|| selection.length == 0
|| selection[0] == null
|| !(selection[0] instanceof IProject)
|| !DotProjectUtils.isModelerProject((IProject)selection[0]) ) {
String msg = Util.getString(PREFIX+ "selectionDialog.invalidSelection"); //$NON-NLS-1$
return new StatusInfo(UiConstants.PLUGIN_ID,IStatus.ERROR, msg);
}
return new StatusInfo(UiConstants.PLUGIN_ID);
}
});
return result;
}
}