/*
-----------------------------------------------------------------------
--          			CHESS editor plugin							 --
--                                                                   --
--                    Copyright (C) 2011-2012                        --
--                 University of Padova, ITALY                       --
--                                                                   --
-- Author: Alessandro Zovi         azovi@math.unipd.it 		         --
--                                                                   --
-- 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-v20.html                         --
-----------------------------------------------------------------------
 */

package org.polarsys.chess.service.internal.utils;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.uml2.uml.Port;
import org.polarsys.chess.service.internal.Activator;

public class CHESSInternalEditorUtils {
	
	static public List<View> getDiagramAllVisiblePort(final View diagram) {
		List<View> list = new ArrayList<View>();
		list = CHESSInternalEditorUtils.getDiagramAllVisiblePortRecur(
				list, diagram);
		return list;
	}
	
	static public /* @NonNull */ List<View> getDiagramAllVisiblePortRecur(/* @NonNull */ final List<View> list,
			/* @NonNull */ final View view) {
		for (Object v : view.getVisibleChildren()) {
			if (!(v instanceof View))
				continue;
			if (((View) v).getElement() instanceof Port)
				list.add((View) v);
			getDiagramAllVisiblePortRecur(list, (View) v);
		}
		return list;
	}

	public static /*@Nullable*/IEditorPart getEditor() {
		IEditorPart editor = null;
		try {
			editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
					.getActivePage().getActiveEditor();
		} catch (Exception e) {
			Activator.error("Editor not found", e);
		}
		return editor;
	}


	public static int StatusDialog( EditorPart editor, String dialogTitle,
			String dialogMessage, IStatus status) {
		ErrorDialog errDlg = new ErrorDialog(editor.getSite().getShell(),
				dialogTitle, dialogMessage, status, IStatus.ERROR) {

			protected void buttonPressed(int id) {
				if (id == IDialogConstants.YES_ID)
					id = IDialogConstants.OK_ID;
				if (id == IDialogConstants.NO_ID) {
					setReturnCode(5);
					close();
				} else {
					super.buttonPressed(id);
				}
			}

			protected void createButtonsForButtonBar(Composite parent) {
				// create OK and Details buttons
				createButton(parent, IDialogConstants.YES_ID,
						IDialogConstants.YES_LABEL, true);
				createButton(parent, IDialogConstants.NO_ID,
						IDialogConstants.NO_LABEL, true);
				createDetailsButton(parent);
			}
		};
		return errDlg.open();
	}
	
	public static MessageDialog showYesNoDialog(EditorPart editor,
			String dialogTitle, String dialogMessage) {
		MessageDialog md = new MessageDialog(editor.getSite().getShell(),
				dialogTitle, null, dialogMessage, MessageDialog.CONFIRM,
				new String[] { "Yes", "No" }, 0);
		md.setBlockOnOpen(true);
		return md;
	}
}
