DebugPopup.java :  » IDE-Eclipse » debug » org » eclipse » debug » ui » Java Open Source

Java Open Source » IDE Eclipse » debug 
debug » org » eclipse » debug » ui » DebugPopup.java
/*******************************************************************************
 * 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.debug.ui;

import com.ibm.icu.text.MessageFormat;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.keys.IBindingService;

/**
 * A <code>PopupDialog</code> that is automatically positioned relative
 * to a specified anchor point. The popup can be dismissed in the same
 * manor as all popup dialogs, but additionally allows clients the option
 * of specifying a command id that can be used to persist the contents of
 * the dialog.
 * <p>
 * Clients may subclass this.
 * @since 3.2
 */
public abstract class DebugPopup extends PopupDialog {

    private Point fAnchor;

    private IHandlerActivation fActivation;

    private IHandlerService fHandlerService;

  private String fCommandId;
  
  private boolean fPersisted = false;

    /**
     * Constructs a new popup dialog of type <code>PopupDialog.INFOPOPUPRESIZE_SHELLSTYLE</code>
     * @param parent The parent shell
     * @param anchor point at which to anchor the popup dialog in Display coordinate space.
     *   Since 3.3, <code>null</code> can be specified to use a default anchor point
     * @param commandId The command id to be used for persistence of 
     *  the dialog, or <code>null</code>
     */
    public DebugPopup(Shell parent, Point anchor, String commandId) {
        super(parent, PopupDialog.INFOPOPUPRESIZE_SHELLSTYLE, true, true, true, false, null, null);
        fAnchor = anchor;
        fCommandId = commandId;
    }

    /**
     * Returns the text to be shown in the popups's information area. 
     * May return <code>null</code>.
     * <p>
     * By default, if this dialog has a persistence command associated with it,
     * the text displayed is of the form "Press {key-sequence} to {action}". The
     * action text is specified by the method <code>getActionText()</code>.
     * </p>
     * @return The text to be shown in the popup's information area or <code>null</code>
     */
    protected String getInfoText() {
      if (getCommandId() != null && getActionText() != null) {
          IWorkbench workbench = PlatformUI.getWorkbench();
          IBindingService bindingService = (IBindingService) workbench.getAdapter(IBindingService.class);
          String formattedBinding = bindingService.getBestActiveBindingFormattedFor(getCommandId());
          
          String infoText = null;
          if (formattedBinding != null) {
               infoText = MessageFormat.format(DebugUIViewsMessages.InspectPopupDialog_1, new String[] { formattedBinding, getActionText()});
          }
          return infoText;
      }
      return null;
    }
    
    /**
     * Returns the text to be shown as the action performed when this dialog's
     * persist command is invoked, or <code>null</code>.
     * <p>
     * Subclasses should override as necessary.
     * </p>
     * @return the text to be shown as the action performed when this dialog's
     *  persist command is invoked
     */
    protected String getActionText() {
      return null;
    }

    /**
     * Returns the command id to be used for persisting the contents of the
     * dialog. If the contents should not be persisted, this method should 
     * return null. 
     * 
     * @return The command id to be used for persisting the contents of the
     * dialog or <code>null</code>
     */
    protected String getCommandId() {
        return fCommandId;
    }

    /**
     * Persists the contents of the dialog. Subclasses should override as required,
     * but also call super.persist().
     */
    protected void persist() {
      fPersisted = true;
    }
    
    /**
     * Returns whether the command handler was invoked to persist this popup's result.
     * 
     * @return whether the command handler was invoked to persist this popup's result
     */
    protected boolean wasPersisted() {
      return fPersisted;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.PopupDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    protected abstract Control createDialogArea(Composite parent);


    /**
     * Returns the initial location to use for the shell based upon the 
     * current selection in the viewer. Bottom is preferred to top, and 
     * right is preferred to left, therefore if possible the popup will
     * be located below and to the right of the selection.
     * 
     * @param initialSize
     *            the initial size of the shell, as returned by
     *            <code>getInitialSize</code>.
     * @return the initial location of the shell
     */
    protected Point getInitialLocation(Point initialSize) {
      if (fAnchor == null) {
        return super.getInitialLocation(initialSize);
      }
        Point point = fAnchor;
        Rectangle monitor = getShell().getMonitor().getClientArea();
        if (monitor.width < point.x + initialSize.x) {
            point.x = Math.max(0, point.x - initialSize.x);
        }
        if (monitor.height < point.y + initialSize.y) {
            point.y = Math.max(0, point.y - initialSize.y);
        }
        return point;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.PopupDialog#getDialogSettings()
     */
    protected IDialogSettings getDialogSettings() {
        IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
        return settings;
    }

    
    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.PopupDialog#open()
     */
    public int open() {
        IWorkbench workbench = PlatformUI.getWorkbench();
        String commandId = getCommandId();
        if (commandId != null) {
            IHandler fCloseHandler = new AbstractHandler() {
                public Object execute(ExecutionEvent event) throws ExecutionException {
                    persist();
                    close();
                    return null;
                }
            };

            fHandlerService = (IHandlerService) workbench.getAdapter(IHandlerService.class);
            fActivation = fHandlerService.activateHandler(commandId, fCloseHandler);
        }

        String infoText = getInfoText();
        if (infoText != null)
            setInfoText(infoText);
        
        return super.open();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.PopupDialog#close()
     */
    public boolean close() {
        if (fActivation != null)
            fHandlerService.deactivateHandler(fActivation);

        return super.close();
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.