📄 progressmonitorpart.java
字号:
/******************************************************************************* * Copyright (c) 2000, 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.jface.wizard;import org.eclipse.core.runtime.IProgressMonitor;import org.eclipse.core.runtime.IProgressMonitorWithBlocking;import org.eclipse.core.runtime.IStatus;import org.eclipse.jface.dialogs.ProgressIndicator;import org.eclipse.jface.resource.JFaceResources;import org.eclipse.jface.util.Assert;import org.eclipse.swt.SWT;import org.eclipse.swt.graphics.Font;import org.eclipse.swt.graphics.FontMetrics;import org.eclipse.swt.graphics.GC;import org.eclipse.swt.layout.GridData;import org.eclipse.swt.layout.GridLayout;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Control;import org.eclipse.swt.widgets.Event;import org.eclipse.swt.widgets.Label;import org.eclipse.swt.widgets.Layout;import org.eclipse.swt.widgets.Listener;/** * A standard implementation of an IProgressMonitor. It consists * of a label displaying the task and subtask name, and a * progress indicator to show progress. In contrast to * <code>ProgressMonitorDialog</code> this class only implements * <code>IProgressMonitor</code>. */public class ProgressMonitorPart extends Composite implements IProgressMonitorWithBlocking { protected Label fLabel; protected String fTaskName; protected String fSubTaskName; protected ProgressIndicator fProgressIndicator; protected Control fCancelComponent; protected boolean fIsCanceled; protected IStatus blockedStatus; protected Listener fCancelListener = new Listener() { public void handleEvent(Event e) { setCanceled(true); if (fCancelComponent != null) { fCancelComponent.setEnabled(false); } } }; /** * Creates a ProgressMonitorPart. * @param parent The SWT parent of the part. * @param layout The SWT grid bag layout used by the part. A client * can supply the layout to control how the progress monitor part * is layed out. If null is passed the part uses its default layout. */ public ProgressMonitorPart(Composite parent, Layout layout) { this(parent, layout, SWT.DEFAULT); } /** * Creates a ProgressMonitorPart. * @param parent The SWT parent of the part. * @param layout The SWT grid bag layout used by the part. A client * can supply the layout to control how the progress monitor part * is layed out. If null is passed the part uses its default layout. * @param progressIndicatorHeight The height of the progress indicator in pixel. */ public ProgressMonitorPart(Composite parent, Layout layout, int progressIndicatorHeight) { super(parent, SWT.NONE); initialize(layout, progressIndicatorHeight); } /** * Attaches the progress monitor part to the given cancel * component. * @param cancelComponent the control whose selection will * trigger a cancel */ public void attachToCancelComponent(Control cancelComponent) { Assert.isNotNull(cancelComponent); fCancelComponent = cancelComponent; fCancelComponent.addListener(SWT.Selection, fCancelListener); } /** * Implements <code>IProgressMonitor.beginTask</code>. * @see IProgressMonitor#beginTask(java.lang.String, int) */ public void beginTask(String name, int totalWork) { fTaskName = name; updateLabel(); if (totalWork == IProgressMonitor.UNKNOWN || totalWork == 0) { fProgressIndicator.beginAnimatedTask(); } else { fProgressIndicator.beginTask(totalWork); } } /** * Implements <code>IProgressMonitor.done</code>. * @see IProgressMonitor#done() */ public void done() { fLabel.setText("");//$NON-NLS-1$ fProgressIndicator.sendRemainingWork(); fProgressIndicator.done(); } /** * Escapes any occurrence of '&' in the given String so that * it is not considered as a mnemonic * character in SWT ToolItems, MenuItems, Button and Labels. * @param in the original String * @return The converted String */ protected static String escapeMetaCharacters(String in) { if (in == null || in.indexOf('&') < 0) { return in; } int length = in.length(); StringBuffer out = new StringBuffer(length + 1); for (int i = 0; i < length; i++) { char c = in.charAt(i); if (c == '&') { out.append("&&");//$NON-NLS-1$ } else { out.append(c); } } return out.toString(); } /** * Creates the progress monitor's UI parts and layouts them * according to the given layout. If the layou is <code>null</code> * the part's default layout is used. * @param layout The layoutfor the receiver. * @param progressIndicatorHeight The suggested height of the indicator */ protected void initialize(Layout layout, int progressIndicatorHeight) { if (layout == null) { GridLayout l = new GridLayout(); l.marginWidth = 0; l.marginHeight = 0; l.numColumns = 1; layout = l; } setLayout(layout); fLabel = new Label(this, SWT.LEFT); fLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); if (progressIndicatorHeight == SWT.DEFAULT) { GC gc = new GC(fLabel); FontMetrics fm = gc.getFontMetrics(); gc.dispose(); progressIndicatorHeight = fm.getHeight(); } fProgressIndicator = new ProgressIndicator(this); GridData gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; gd.verticalAlignment = GridData.CENTER; gd.heightHint = progressIndicatorHeight; fProgressIndicator.setLayoutData(gd); } /** * Implements <code>IProgressMonitor.internalWorked</code>. * @see IProgressMonitor#internalWorked(double) */ public void internalWorked(double work) { fProgressIndicator.worked(work); } /** * Implements <code>IProgressMonitor.isCanceled</code>. * @see IProgressMonitor#isCanceled() */ public boolean isCanceled() { return fIsCanceled; } /** * Detach the progress monitor part from the given cancel * component * @param cc */ public void removeFromCancelComponent(Control cc) { Assert.isTrue(fCancelComponent == cc && fCancelComponent != null); fCancelComponent.removeListener(SWT.Selection, fCancelListener); fCancelComponent = null; } /** * Implements <code>IProgressMonitor.setCanceled</code>. * @see IProgressMonitor#setCanceled(boolean) */ public void setCanceled(boolean b) { fIsCanceled = b; } /** * Sets the progress monitor part's font. */ public void setFont(Font font) { super.setFont(font); fLabel.setFont(font); fProgressIndicator.setFont(font); } /* * (non-Javadoc) * @see org.eclipse.core.runtime.IProgressMonitor#setTaskName(java.lang.String) */ public void setTaskName(String name) { fTaskName = name; updateLabel(); } /* * (non-Javadoc) * @see org.eclipse.core.runtime.IProgressMonitor#subTask(java.lang.String) */ public void subTask(String name) { fSubTaskName = name; updateLabel(); } /** * Updates the label with the current task and subtask names. */ protected void updateLabel() { if (blockedStatus == null) { String text = taskLabel(); fLabel.setText(text); } else { fLabel.setText(blockedStatus.getMessage()); } //Force an update as we are in the UI Thread fLabel.update(); } /** * Return the label for showing tasks * @return String */ private String taskLabel() { String text = fSubTaskName == null ? "" : fSubTaskName; //$NON-NLS-1$ if (fTaskName != null && fTaskName.length() > 0) { text = JFaceResources.format( "Set_SubTask", new Object[] { fTaskName, text });//$NON-NLS-1$ } return escapeMetaCharacters(text); } /** * Implements <code>IProgressMonitor.worked</code>. * @see IProgressMonitor#worked(int) */ public void worked(int work) { internalWorked(work); } /* (non-Javadoc) * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#clearBlocked() */ public void clearBlocked() { blockedStatus = null; updateLabel(); } /* (non-Javadoc) * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#setBlocked(org.eclipse.core.runtime.IStatus) */ public void setBlocked(IStatus reason) { blockedStatus = reason; updateLabel(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -