/*
 * Copyright (c) 2010-2012, 2015 Eike Stepper (Berlin, Germany) and others.
 * 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:
 *     Martin Fluegge - initial API and implementation
 */
package org.eclipse.emf.cdo.dawn.ui.wizards;

import org.eclipse.emf.cdo.dawn.ui.composites.CDOResourceNodeChooserComposite;
import org.eclipse.emf.cdo.dawn.ui.composites.CDOResourceNodeChooserComposite.ResourceChooserValidator;
import org.eclipse.emf.cdo.dawn.ui.composites.CDOResourceNodeChooserComposite.ValidationListener;
import org.eclipse.emf.cdo.dawn.ui.messages.Messages;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.emf.common.util.URI;

import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;

/**
 * @author Martin Fluegge
 */
public class DawnCreateNewResourceWizardPage extends WizardPage
{
  private Composite container;

  private boolean showResources;

  private final String fileExtension;

  private int resourceValidationType = ResourceChooserValidator.VALIDATION_ERROR;

  /**
   * left for backward compatibility with the generated editors. This field might soon be removed. Use
   * <b>org.eclipse.emf.cdo.dawn.ui.composites.ResourceChooserValidator.VALIDATION_WARN</b> instead.
   */
  @Deprecated
  public static final int VALIDATION_WARN = ResourceChooserValidator.VALIDATION_WARN;

  private final CDOView view;

  // private String resourceNamePrefix = "default"; //$NON-NLS-1$

  private boolean createAutomaticResourceName;

  /**
   * @since 1.0
   */
  protected CDOResourceNodeChooserComposite chooserComposite;

  public DawnCreateNewResourceWizardPage(String fileExtension)
  {
    this(fileExtension, true, null);
  }

  public DawnCreateNewResourceWizardPage(String fileExtension, boolean showResources, CDOView view)
  {
    super(Messages.DawnCreateNewResourceWizardPage_0);
    this.view = view;
    setTitle(Messages.DawnCreateNewResourceWizardPage_2);
    setDescription(Messages.DawnCreateNewResourceWizardPage_3);
    this.showResources = showResources;
    this.fileExtension = fileExtension;
  }

  public void createControl(Composite parent)
  {
    container = new Composite(parent, SWT.NULL);
    GridLayout layout = new GridLayout();
    container.setLayout(layout);
    layout.numColumns = 1;
    chooserComposite = new CDOResourceNodeChooserComposite(container, SWT.NONE, fileExtension, view);
    chooserComposite.showResources(showResources);
    ResourceChooserValidator validator = chooserComposite.getValidator();
    validator.setResourceValidationType(resourceValidationType);
    validator.setValidationListener(new ValidationListener()
    {
      public void validationFinished()
      {
        validatePage();
      }
    });

    if (createAutomaticResourceName)
    {
      chooserComposite.createAutomaticResourceName();
    }

    GridData gd = new GridData(GridData.FILL_BOTH);
    chooserComposite.setLayoutData(gd);

    setControl(container);
    validator.validate();
  }

  private void validatePage()
  {
    ResourceChooserValidator validator = chooserComposite.getValidator();
    boolean valid = validator.isValid();

    if (!valid)
    {
      int type = validator.getMessageType();
      setMessage(validator.getMessage(), type);
    }
    else
    {
      setMessage("");
    }
    setPageComplete(valid);
  }

  public URI getURI()
  {
    return chooserComposite.getURI();
  }

  public void setShowResources(boolean showResources)
  {
    this.showResources = showResources;
  }

  public boolean isShowResources()
  {
    return showResources;
  }

  public void setResourceNamePrefix(String resourceNamePrefix)
  {
    // this.resourceNamePrefix = resourceNamePrefix;
    chooserComposite.setResourceNamePrefix(resourceNamePrefix);
    chooserComposite.setResourceName(resourceNamePrefix);
  }

  public String getResourceNamePrefix()
  {
    return chooserComposite.getResourceNamePrefix();
  }

  public void setResourcePath(String text)
  {
    if (!text.endsWith("/") || !!text.endsWith("\\")) //$NON-NLS-1$ //$NON-NLS-2$
    {
      text += "/"; //$NON-NLS-1$
    }
    chooserComposite.setResourcePath(text);
  }

  public String getResourcePath()
  {
    return chooserComposite.getResourcePath();
  }

  public void setCreateAutomaticResourceName(boolean createAutomaticResourceName)
  {
    this.createAutomaticResourceName = createAutomaticResourceName;
  }

  public boolean isCreateAutomaticResourceName()
  {
    return createAutomaticResourceName;
  }

  public void setResourceValidationType(int resourceValidationType)
  {
    this.resourceValidationType = resourceValidationType;
  }

  public int getResourceValidationType()
  {
    return resourceValidationType;
  }

  public String getDefaultName()
  {
    return chooserComposite.getDefaultName();
  }
}
