/*******************************************************************************
 * Copyright (c) 2017 the TeXlipse team 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:
 *     The TeXlipse team - initial API and implementation
 *******************************************************************************/
package org.eclipse.texlipse.actions;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.texlipse.TexlipsePlugin;
import org.eclipse.texlipse.templates.ProjectTemplateManager;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;


/**
 * This action sets the currently open file as project's main file.
 * 
 * @author Kimmo Karlsson
 */
public class SaveAsTemplateAction implements IWorkbenchWindowActionDelegate, IEditorActionDelegate {
    
    // the window
    private IWorkbenchWindow window;
    
    // the editor
    private IEditorPart editor;
    
    /**
     * Creates a window for entering the template name, checks the user's input and
     * proceeds to save the template. 
     */
    public void run(IAction action) {
        
        IFile file = ((FileEditorInput)editor.getEditorInput()).getFile();
        String fullname = file.getFullPath().toString();
        
        // create dialog
        InputQueryDialog dialog = new InputQueryDialog(editor.getEditorSite().getShell(),
                TexlipsePlugin.getResourceString("templateSaveDialogTitle"),
                TexlipsePlugin.getResourceString("templateSaveDialogMessage").replaceAll("%s", fullname),
                file.getName().substring(0,file.getName().lastIndexOf('.')),
                new IInputValidator() {
            public String isValid(String newText) {
                if (newText != null && newText.length() > 0) {
                    return null; // no error
                }
                return TexlipsePlugin.getResourceString("templateSaveErrorFileName");
            }});
        
        if (dialog.open() == InputDialog.OK) {
            String newName = dialog.getInput();
            
            // check existing
            boolean reallySave = true;
            if (ProjectTemplateManager.templateExists(newName)) {
                reallySave = MessageDialog.openConfirm(editor.getSite().getShell(),
                        TexlipsePlugin.getResourceString("templateSaveOverwriteTitle"),
                        TexlipsePlugin.getResourceString("templateSaveOverwriteText").replaceAll("%s", newName));
            }
            
            if (reallySave) {
                ProjectTemplateManager.saveProjectTemplate(file, newName);
            }
        }
    }
    
    /**
     * Nothing to do.
     */
    public void selectionChanged(IAction action, ISelection selection) {
    }
    
    /**
     * Nothing to do.
     */
    public void dispose() {
    }
    
    /**
     * Cache the window object in order to be able to provide
     * UI components for the action.
     */
    public void init(IWorkbenchWindow window) {
        this.window = window;
    }
    
    /**
     * 
     */
    public void setActiveEditor(IAction action, IEditorPart targetEditor) {
        editor = targetEditor;
        action.setEnabled(editor instanceof ITextEditor);
    }
}