blob: 449858829df4a753f2060e9c848f2bd10f9a2999 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 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.ltk.internal.ui.refactoring.history;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;
import org.eclipse.ltk.internal.ui.refactoring.RefactoringPluginImages;
import org.eclipse.ltk.internal.ui.refactoring.RefactoringUIMessages;
import org.eclipse.ltk.internal.ui.refactoring.util.PixelConverter;
import org.eclipse.ltk.internal.ui.refactoring.util.SWTUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.ltk.ui.refactoring.history.RefactoringHistoryContentProvider;
import org.eclipse.ltk.ui.refactoring.history.RefactoringHistoryControlConfiguration;
import org.eclipse.ltk.ui.refactoring.history.RefactoringHistoryLabelProvider;
/**
* Control which is capable of selecting elements of a refactoring history. The
* refactoring history can be sorted by project or by timestamps.
* <p>
* This control expects a control configuration with a checkable tree viewer.
* </p>
*
* @since 3.2
*/
public class BrowseRefactoringHistoryControl extends RefactoringHistoryControl {
/** The empty descriptors constant */
private static final RefactoringDescriptorProxy[] EMPTY_DESCRIPTORS= {};
/** The toolbar sort group */
private static final String TOOLBAR_SORT_GROUP= "group.sort"; //$NON-NLS-1$
/** The deselect all button, or <code>null</code> */
private Button fDeselectAllButton= null;
/** The select all button, or <code>null</code> */
private Button fSelectAllButton= null;
/** The sort projects action */
private final IAction fSortProjects= new Action(RefactoringUIMessages.BrowseRefactoringHistoryControl_sort_project, IAction.AS_RADIO_BUTTON) {
public final void run() {
final BrowseRefactoringHistoryContentProvider provider= (BrowseRefactoringHistoryContentProvider) fHistoryViewer.getContentProvider();
provider.setSortProjects(true);
fHistoryViewer.setSorter(fViewerSorter);
fHistoryViewer.refresh(false);
setExpandedState();
reconcileCheckState();
fSortProjects.setChecked(true);
fSortTimestamps.setChecked(false);
}
};
/** The sort time stamps action */
private final IAction fSortTimestamps= new Action(RefactoringUIMessages.BrowseRefactoringHistoryControl_sort_date, IAction.AS_RADIO_BUTTON) {
public final void run() {
final BrowseRefactoringHistoryContentProvider provider= (BrowseRefactoringHistoryContentProvider) fHistoryViewer.getContentProvider();
provider.setSortProjects(false);
fHistoryViewer.setSorter(null);
fHistoryViewer.refresh(false);
setExpandedState();
reconcileCheckState();
fSortTimestamps.setChecked(true);
fSortProjects.setChecked(false);
}
};
/** The toolbar manager, or <code>null</code> */
private ToolBarManager fToolBarManager= null;
/** The viewer sorter */
private final BrowseRefactoringHistoryViewerSorter fViewerSorter= new BrowseRefactoringHistoryViewerSorter();
/**
* Creates a new browse refactoring history control.
*
* @param parent
* the parent control
* @param configuration
* the refactoring history control configuration to use
*/
public BrowseRefactoringHistoryControl(final Composite parent, final RefactoringHistoryControlConfiguration configuration) {
super(parent, configuration);
addDisposeListener(new DisposeListener() {
public final void widgetDisposed(final DisposeEvent event) {
if (fToolBarManager != null) {
fToolBarManager.removeAll();
fToolBarManager.dispose();
fToolBarManager= null;
}
}
});
}
/**
* {@inheritDoc}
*/
protected void createBottomButtonBar(final Composite parent) {
Assert.isNotNull(parent);
final Composite composite= new Composite(parent, SWT.NONE);
final GridLayout layout= new GridLayout(2, false);
layout.marginWidth= 0;
layout.marginHeight= 0;
layout.marginTop= 5;
composite.setLayout(layout);
final GridData data= new GridData();
data.grabExcessHorizontalSpace= true;
data.grabExcessVerticalSpace= false;
data.horizontalAlignment= SWT.FILL;
data.verticalAlignment= SWT.TOP;
composite.setLayoutData(data);
createSelectAllButton(composite);
createDeselectAllButton(composite);
}
/**
* {@inheritDoc}
*/
public void createControl() {
super.createControl();
final GridData data= new GridData();
data.grabExcessHorizontalSpace= true;
data.heightHint= new PixelConverter(this).convertHeightInCharsToPixels(22);
data.horizontalAlignment= SWT.FILL;
data.verticalAlignment= SWT.FILL;
setLayoutData(data);
}
/**
* Creates the deselect all button of the control.
*
* @param parent
* the parent composite
*/
protected void createDeselectAllButton(final Composite parent) {
Assert.isNotNull(parent);
fDeselectAllButton= new Button(parent, SWT.NONE);
fDeselectAllButton.setEnabled(false);
fDeselectAllButton.setText(RefactoringUIMessages.SelectRefactoringHistoryControl_deselect_all_label);
final GridData data= new GridData();
data.horizontalAlignment= GridData.END;
data.verticalAlignment= GridData.BEGINNING;
data.widthHint= SWTUtil.getButtonWidthHint(fDeselectAllButton);
fDeselectAllButton.setLayoutData(data);
fDeselectAllButton.addSelectionListener(new SelectionAdapter() {
public final void widgetSelected(final SelectionEvent event) {
handleDeselectAll();
}
});
}
/**
* {@inheritDoc}
*/
protected TreeViewer createHistoryViewer(final Composite parent) {
Assert.isNotNull(parent);
TreeViewer viewer= null;
if (fControlConfiguration.isCheckableViewer())
viewer= new RefactoringHistoryTreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
else
viewer= new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
return viewer;
}
/**
* Creates the select all button of the control.
*
* @param parent
* the parent composite
*/
protected void createSelectAllButton(final Composite parent) {
Assert.isNotNull(parent);
fSelectAllButton= new Button(parent, SWT.NONE);
fSelectAllButton.setEnabled(false);
fSelectAllButton.setText(RefactoringUIMessages.SelectRefactoringHistoryControl_select_all_label);
final GridData data= new GridData();
data.horizontalAlignment= GridData.END;
data.grabExcessHorizontalSpace= true;
data.verticalAlignment= GridData.BEGINNING;
data.widthHint= SWTUtil.getButtonWidthHint(fSelectAllButton);
fSelectAllButton.setLayoutData(data);
fSelectAllButton.addSelectionListener(new SelectionAdapter() {
public final void widgetSelected(final SelectionEvent event) {
handleSelectAll();
}
});
}
/**
* {@inheritDoc}
*/
protected void createToolBar(final ViewForm parent) {
final ToolBarManager manager= getToolBarManager();
if (manager != null) {
manager.removeAll();
manager.add(new Separator(TOOLBAR_SORT_GROUP));
fSortProjects.setText(RefactoringUIMessages.BrowseRefactoringHistoryControl_sort_project);
fSortProjects.setToolTipText(RefactoringUIMessages.BrowseRefactoringHistoryControl_sort_project);
fSortProjects.setDescription(RefactoringUIMessages.BrowseRefactoringHistoryControl_sort_project_description);
fSortProjects.setImageDescriptor(RefactoringPluginImages.DESC_ELCL_SORT_PROJECT);
fSortProjects.setDisabledImageDescriptor(RefactoringPluginImages.DESC_DLCL_SORT_PROJECT);
fSortTimestamps.setText(RefactoringUIMessages.BrowseRefactoringHistoryControl_sort_date);
fSortTimestamps.setToolTipText(RefactoringUIMessages.BrowseRefactoringHistoryControl_sort_date);
fSortTimestamps.setDescription(RefactoringUIMessages.BrowseRefactoringHistoryControl_sort_date_description);
fSortTimestamps.setImageDescriptor(RefactoringPluginImages.DESC_ELCL_SORT_DATE);
fSortTimestamps.setDisabledImageDescriptor(RefactoringPluginImages.DESC_DLCL_SORT_DATE);
manager.appendToGroup(TOOLBAR_SORT_GROUP, fSortProjects);
manager.appendToGroup(TOOLBAR_SORT_GROUP, fSortTimestamps);
manager.update(true);
}
}
/**
* {@inheritDoc}
*/
protected int getContainerColumns() {
return 1;
}
/**
* {@inheritDoc}
*/
protected RefactoringHistoryContentProvider getContentProvider() {
return new BrowseRefactoringHistoryContentProvider(fControlConfiguration);
}
/**
* Returns the deselect all button.
*
* @return the deselect all button, or <code>null</code>
*/
public Button getDeselectAllButton() {
return fDeselectAllButton;
}
/**
* {@inheritDoc}
*/
protected RefactoringHistoryLabelProvider getLabelProvider() {
return new BrowseRefactoringHistoryLabelProvider(fControlConfiguration);
}
/**
* Returns the select all button.
*
* @return the select all button, or <code>null</code>
*/
public Button getSelectAllButton() {
return fSelectAllButton;
}
/**
* Returns the toolbar manager of this control
*
* @return the toolbar manager
*/
protected ToolBarManager getToolBarManager() {
if (fToolBarManager == null) {
final ToolBar toolbar= new ToolBar(fHistoryPane, SWT.FLAT);
fHistoryPane.setTopCenter(toolbar);
fToolBarManager= new ToolBarManager(toolbar);
}
return fToolBarManager;
}
/**
* {@inheritDoc}
*/
protected void handleCheckStateChanged() {
super.handleCheckStateChanged();
final RefactoringHistory history= getInput();
if (history != null) {
final int checked= getCheckedDescriptors().length;
final int total= history.getDescriptors().length;
if (fSelectAllButton != null)
fSelectAllButton.setEnabled(checked < total);
if (fDeselectAllButton != null)
fDeselectAllButton.setEnabled(checked > 0);
}
}
/**
* Handles the deselect all event.
*/
protected void handleDeselectAll() {
setCheckedDescriptors(EMPTY_DESCRIPTORS);
}
/**
* Handles the select all event.
*/
protected void handleSelectAll() {
final RefactoringHistory history= getInput();
if (history != null)
setCheckedDescriptors(history.getDescriptors());
}
/**
* Is sorting by date enabled?
*
* @return <code>true</code> if it is enabled, <code>false</code>
* otherwise
*/
public boolean isSortByDate() {
return !isSortByProjects();
}
/**
* Is sorting by projects enabled?
*
* @return <code>true</code> if it is enabled, <code>false</code>
* otherwise
*/
public boolean isSortByProjects() {
final IContentProvider provider= fHistoryViewer.getContentProvider();
if (provider instanceof BrowseRefactoringHistoryContentProvider) {
final BrowseRefactoringHistoryContentProvider extended= (BrowseRefactoringHistoryContentProvider) provider;
return extended.isSortProjects();
}
return false;
}
/**
* {@inheritDoc}
*/
public void setInput(final RefactoringHistory history) {
super.setInput(history);
if (fDeselectAllButton != null)
fDeselectAllButton.setEnabled(false);
if (fSelectAllButton != null)
fSelectAllButton.setEnabled(history != null && !history.isEmpty());
}
/**
* Sorts the refactorings by date.
*/
public void sortByDate() {
fSortTimestamps.run();
}
/**
* Sorts the refactorings by projects.
*/
public void sortByProjects() {
fSortProjects.run();
}
}