/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * 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:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.ote.ui.test.manager.util;

import java.util.ArrayList;
import java.util.List;
import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

public class PluginUtil {

   public static List<IViewReference> findAllViews(String viewID) {
      ArrayList<IViewReference> list = new ArrayList<>();
      IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows();
      for (IWorkbenchWindow window : windows) {
         IWorkbenchPage pages[] = window.getPages();
         for (IWorkbenchPage page : pages) {
            IViewReference viewRefs[] = page.getViewReferences();
            for (IViewReference viewRef : viewRefs) {
               if (viewRef.getId().equals(viewID)) {
                  list.add(viewRef);
               }
            }

         }
      }
      return list;
   }

   public static boolean areTestManagersAvailable() {
      return getTestManagers().length > 0;
   }

   public static TestManagerEditor[] getTestManagers() {
      List<TestManagerEditor> tmes = new ArrayList<>();
      IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
      if (window != null) {
         IWorkbenchPage page = window.getActivePage();
         if (page != null) {
            IEditorReference editors[] = page.getEditorReferences();
            if (editors != null) {
               for (int j = 0; j < editors.length; j++) {
                  IEditorReference editor = editors[j];
                  IWorkbenchPart part = editor.getPart(true);
                  if (part instanceof TestManagerEditor) {
                     tmes.add((TestManagerEditor) part);
                  }
               }
            }
         }
      }
      return tmes.toArray(new TestManagerEditor[tmes.size()]);
   }
}
