Package org.eclipse.egit.ui.internal.actions

Source Code of org.eclipse.egit.ui.internal.actions.RebaseAction$ItemSelectionListener

/*******************************************************************************
* Copyright (C) 2011, 2013 Dariusz Luksza <dariusz@luksza.org> 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
*******************************************************************************/
package org.eclipse.egit.ui.internal.actions;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.egit.core.internal.indexdiff.IndexDiffCache;
import org.eclipse.egit.core.internal.indexdiff.IndexDiffCacheEntry;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.commands.shared.AbortRebaseCommand;
import org.eclipse.egit.ui.internal.commands.shared.AbstractRebaseCommandHandler;
import org.eclipse.egit.ui.internal.commands.shared.AbstractSharedCommandHandler;
import org.eclipse.egit.ui.internal.commands.shared.ContinueRebaseCommand;
import org.eclipse.egit.ui.internal.commands.shared.SkipRebaseCommand;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.IWorkbenchWindowPulldownDelegate;

/**
* A pulldown action to rebase the current branch, or continue, skip or abort an
* active rebase.
*
* @see RebaseActionHandler
*/
public class RebaseAction extends RepositoryAction implements
    IWorkbenchWindowPulldownDelegate {

  private final Image rebaseSkip;

  private final Image rebaseAbort;

  private final Image rebaseContinue;

  /**
   *
   */
  public RebaseAction() {
    super(ActionCommands.REBASE_ACTION, new RebaseActionHandler());

    rebaseSkip = UIIcons.REBASE_SKIP.createImage();
    rebaseAbort = UIIcons.REBASE_ABORT.createImage();
    rebaseContinue = UIIcons.REBASE_CONTINUE.createImage();
  }

  public Menu getMenu(Control parent) {
    Menu menu = new Menu(parent);
    Repository repo = getRepository();

    boolean rebaseing = isInRebasingState(repo);
    boolean canContinue = rebaseing && canContinue(repo);

    addMenuItem(menu, UIText.RebasePulldownAction_Continue, rebaseContinue,
        new ContinueRebaseCommand(), canContinue);
    addMenuItem(menu, UIText.RebasePulldownAction_Skip, rebaseSkip,
        new SkipRebaseCommand(), rebaseing);
    addMenuItem(menu, UIText.RebasePulldownAction_Abort, rebaseAbort,
        new AbortRebaseCommand(), rebaseing);
    return menu;
  }

  @Override
  public void dispose() {
    rebaseSkip.dispose();
    rebaseAbort.dispose();
    rebaseContinue.dispose();
    super.dispose();
  }

  @Override
  protected boolean shouldRunAction() {
    Repository repo = getRepository();
    return !isInRebasingState(repo);
  }

  private void addMenuItem(Menu parent, String itemName, Image image,
      AbstractRebaseCommandHandler action, boolean isEnabled) {
    MenuItem item = new MenuItem(parent, SWT.PUSH);
    item.setImage(image);
    item.setText(itemName);
    item.setEnabled(isEnabled);
    ExecutionEvent event = createExecutionEvent();
    ItemSelectionListener selectionListener = new ItemSelectionListener(
        action, event);
    item.addSelectionListener(selectionListener);
  }

  private Repository getRepository() {
    ExecutionEvent event = createExecutionEvent();
    return AbstractSharedCommandHandler.getRepository(event);
  }

  private boolean isInRebasingState(Repository repo) {
    if (repo == null)
      return false;

    RepositoryState state = repo.getRepositoryState();
    return state.isRebasing();
  }

  private boolean canContinue(Repository repo) {
    IndexDiffCache diffCache = org.eclipse.egit.core.Activator.getDefault()
        .getIndexDiffCache();
    if (diffCache != null) {
      IndexDiffCacheEntry entry = diffCache.getIndexDiffCacheEntry(repo);
      return entry != null
          && entry.getIndexDiff().getConflicting().isEmpty();
    }
    return false;
  }

  private static class ItemSelectionListener implements SelectionListener {

    private final ExecutionEvent event;

    private final AbstractRebaseCommandHandler action;

    private ItemSelectionListener(AbstractRebaseCommandHandler action,
        ExecutionEvent event) {
      this.event = event;
      this.action = action;
    }

    public void widgetSelected(SelectionEvent selectionEvent) {
      try {
        action.execute(event);
      } catch (ExecutionException e) {
        Activator.logError(e.getMessage(), e);
      }
    }

    public void widgetDefaultSelected(SelectionEvent e) {
      // not used
    }

  }

}
TOP

Related Classes of org.eclipse.egit.ui.internal.actions.RebaseAction$ItemSelectionListener

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.