Package org.eclipse.ui.internal.browser

Source Code of org.eclipse.ui.internal.browser.WorkbenchBrowserSupport

/*******************************************************************************
* Copyright (c) 2005, 2007 IBM Corporation 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:
*     IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.browser;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;
import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;
import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.AbstractWorkbenchBrowserSupport;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;

/**
* Implements the support interface and delegates the calls to the active
* support if contributed via the extension point, or the default support
* otherwise.
*
* @since 3.1
*/
public class WorkbenchBrowserSupport extends AbstractWorkbenchBrowserSupport {

  private static WorkbenchBrowserSupport instance;

  private IWorkbenchBrowserSupport activeSupport;

  private boolean initialized;
   
    private String desiredBrowserSupportId;

  private IExtensionChangeHandler handler = new IExtensionChangeHandler() {
       
        /* (non-Javadoc)
         * @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker, org.eclipse.core.runtime.IExtension)
         */
        public void addExtension(IExtensionTracker tracker,IExtension extension) {
            //Do nothing
        }

        /* (non-Javadoc)
         * @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#removeExtension(org.eclipse.core.runtime.IExtension, java.lang.Object[])
         */
        public void removeExtension(IExtension source, Object[] objects) {
      for (int i = 0; i < objects.length; i++) {
        if (objects[i] == activeSupport) {
          dispose();
          // remove ourselves - we'll be added again in initalize if
          // needed
          PlatformUI.getWorkbench().getExtensionTracker()
              .unregisterHandler(handler);
        }
      }
    }
  };

  /**
   * Cannot be instantiated from outside.
   */
  private WorkbenchBrowserSupport() {
  }

  /**
   * Returns the shared instance.
   *
   * @return shared instance
   */
  public static IWorkbenchBrowserSupport getInstance() {
    if (instance == null) {
      instance = new WorkbenchBrowserSupport();
    }
    return instance;
  }

  /* (non-Javadoc)
   * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#createBrowser(int, java.lang.String, java.lang.String, java.lang.String)
   */
  public IWebBrowser createBrowser(int style, String browserId, String name,
      String tooltip) throws PartInitException {
    return getActiveSupport()
        .createBrowser(style, browserId, name, tooltip);
  }

  /* (non-Javadoc)
   * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#createBrowser(java.lang.String)
   */
  public IWebBrowser createBrowser(String browserId) throws PartInitException {
    return getActiveSupport().createBrowser(browserId);
  }
 
  /* (non-Javadoc)
   * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#isInternalWebBrowserAvailable()
   */
  public boolean isInternalWebBrowserAvailable() {
    return getActiveSupport().isInternalWebBrowserAvailable();
  }

  private IWorkbenchBrowserSupport getActiveSupport() {
    if (initialized == false) {
      loadActiveSupport();
    }
    // ensure we always have an active instance
    if (activeSupport == null) {
      activeSupport = new DefaultWorkbenchBrowserSupport();
    }
    return activeSupport;
  }
   
    /**
     * Answers whether the system has a non-default browser installed.
     *
     * @return whether the system has a non-default browser installed
     */
    public boolean hasNonDefaultBrowser() {
        return !(getActiveSupport() instanceof DefaultWorkbenchBrowserSupport);
    }

  private void loadActiveSupport() {
    BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
      /*
       * (non-Javadoc)
       *
       * @see java.lang.Runnable#run()
       */
      public void run() {
                IConfigurationElement[] elements = Platform
                        .getExtensionRegistry().getConfigurationElementsFor(
                                PlatformUI.PLUGIN_ID,
                                IWorkbenchRegistryConstants.PL_BROWSER_SUPPORT);
        IConfigurationElement elementToUse = null;
               
                if (desiredBrowserSupportId != null) {
          elementToUse = findDesiredElement(elements);
        } else {
          elementToUse = getElementToUse(elements);
        }
        if (elementToUse != null) {
          initialized = initializePluggableBrowserSupport(elementToUse);
        }
      }

            /**
             * Search for the element whose extension has ID equal to that of
             * the field desiredBrowserSupport.
             *
             * @param elements
             *            the elements to search
             * @return the element or <code>null</code>
             */
            private IConfigurationElement findDesiredElement(IConfigurationElement [] elements) {
                for (int i = 0; i < elements.length; i++) {
                    if (desiredBrowserSupportId.equals(elements[i].getDeclaringExtension().getUniqueIdentifier())) {
            return elements[i];
          }
                }
                return null;
            }

            private IExtensionPoint getExtensionPoint() {
                return Platform.getExtensionRegistry()
            .getExtensionPoint(PlatformUI.PLUGIN_ID, IWorkbenchRegistryConstants.PL_BROWSER_SUPPORT);
            }

      private IConfigurationElement getElementToUse(
          IConfigurationElement[] elements) {
        if (elements.length == 0) {
          return null;
        }
        IConfigurationElement defaultElement = null;
        IConfigurationElement choice = null;
        // find the first default element and
        // the first non-default element. If non-default
        // is found, pick it. Otherwise, use default.
        for (int i = 0; i < elements.length; i++) {
          IConfigurationElement element = elements[i];
          if (element.getName().equals(IWorkbenchRegistryConstants.TAG_SUPPORT)) {
            String def = element.getAttribute(IWorkbenchRegistryConstants.ATT_DEFAULT);
            if (def != null && Boolean.valueOf(def).booleanValue()) {
              if (defaultElement == null) {
                defaultElement = element;
              }
            } else {
              // non-default
              if (choice == null) {
                choice = element;
              }
            }
          }
        }
        if (choice == null) {
          choice = defaultElement;
        }
        return choice;
      }

      private boolean initializePluggableBrowserSupport(
          IConfigurationElement element) {
        // Instantiate the browser support
        try {
          activeSupport = (AbstractWorkbenchBrowserSupport) WorkbenchPlugin
              .createExtension(element, IWorkbenchRegistryConstants.ATT_CLASS);
          // start listening for removals
          IExtensionTracker extensionTracker = PlatformUI.getWorkbench().getExtensionTracker();
                    extensionTracker.registerHandler(handler, ExtensionTracker
                            .createExtensionPointFilter(getExtensionPoint()));
          // register the new browser support for removal
          // notification
          extensionTracker
              .registerObject(element.getDeclaringExtension(),
                  activeSupport, IExtensionTracker.REF_WEAK);
          return true;
        } catch (CoreException e) {
          WorkbenchPlugin
              .log("Unable to instantiate browser support" + e.getStatus(), e);//$NON-NLS-1$
        }
        return false;
      }

    });
  }
   
    /**
     * For debug purposes only.
     *
     * @param desiredBrowserSupportId the desired browser system id
     */
    public void setDesiredBrowserSupportId(String desiredBrowserSupportId) {
        dispose(); // prep for a new help system
        this.desiredBrowserSupportId = desiredBrowserSupportId;
    }

    /**
     * Dispose of the active support.
     */
    protected void dispose() {
        activeSupport = null;
        initialized = false;
    }
}
TOP

Related Classes of org.eclipse.ui.internal.browser.WorkbenchBrowserSupport

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.