/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.ide.eclipse.adt.internal.editors.layout.refactoring;

import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;

import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;

public abstract class VisualRefactoringWizard extends RefactoringWizard {
    protected final LayoutEditorDelegate mDelegate;

    public VisualRefactoringWizard(Refactoring refactoring, LayoutEditorDelegate editor) {
        super(refactoring, DIALOG_BASED_USER_INTERFACE | PREVIEW_EXPAND_FIRST_NODE);
        mDelegate = editor;
    }

    @Override
    public boolean performFinish() {
        mDelegate.getEditor().setIgnoreXmlUpdate(true);
        try {
            return super.performFinish();
        } finally {
            mDelegate.getEditor().setIgnoreXmlUpdate(false);
            mDelegate.refreshXmlModel();
        }
    }

    protected abstract static class VisualRefactoringInputPage extends UserInputWizardPage {
        public VisualRefactoringInputPage(String name) {
            super(name);
        }

        /**
         * Listener which can be attached on any widget in the wizard page to force
         * modifications of the associated widget to validate the page again
         */
        protected ModifyListener mModifyValidateListener = new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                validatePage();
            }
        };

        /**
         * Listener which can be attached on any widget in the wizard page to force
         * selection changes of the associated widget to validate the page again
         */
        protected SelectionAdapter mSelectionValidateListener = new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                validatePage();
            }
        };

        protected abstract boolean validatePage();
    }
}
