/******************************************************************************* * Copyright (c) 2000, 2011 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.jdt.internal.ui.wizards.dialogfields; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.jface.resource.JFaceResources; /** * Dialog field containing a label, text control, status label and a button control. * The status label can be either a image or text label, and can be usd to give * additional information about the current element chosen. */ public class StringButtonStatusDialogField extends StringButtonDialogField { private Label fStatusLabelControl; private Object fStatus; // String or ImageDescriptor private String fWidthHintString; private int fWidthHint; public StringButtonStatusDialogField(IStringButtonAdapter adapter) { super(adapter); fStatus= null; fWidthHintString= null; fWidthHint= -1; } // ------ set status /** * Sets the status string. */ public void setStatus(String status) { if (isOkToUse(fStatusLabelControl)) { fStatusLabelControl.setText(status); } fStatus= status; } /** * Sets the status image. * Caller is responsible to dispose image */ public void setStatus(Image image) { if (isOkToUse(fStatusLabelControl)) { if (image == null) { fStatusLabelControl.setImage(null); } else { fStatusLabelControl.setImage(image); } } fStatus= image; } /** * Sets the staus string hint of the status label. * The string is used to calculate the size of the status label. */ public void setStatusWidthHint(String widthHintString) { fWidthHintString= widthHintString; fWidthHint= -1; } /** * Sets the width hint of the status label. */ public void setStatusWidthHint(int widthHint) { fWidthHint= widthHint; fWidthHintString= null; } // ------- layout helpers /* * @see DialogField#doFillIntoGrid */ @Override public Control[] doFillIntoGrid(Composite parent, int nColumns) { assertEnoughColumns(nColumns); Label label= getLabelControl(parent); label.setLayoutData(gridDataForLabel(1)); Text text= getTextControl(parent); text.setLayoutData(gridDataForText(nColumns - 3)); Label status= getStatusLabelControl(parent); status.setLayoutData(gridDataForStatusLabel(parent, 1)); Button button= getChangeControl(parent); button.setLayoutData(gridDataForButton(button, 1)); return new Control[] { label, text, status, button }; } /* * @see DialogField#getNumberOfControls */ @Override public int getNumberOfControls() { return 4; } protected GridData gridDataForStatusLabel(Control aControl, int span) { GridData gd= new GridData(); gd.horizontalAlignment= GridData.BEGINNING; gd.grabExcessHorizontalSpace= false; gd.horizontalIndent= 0; if (fWidthHintString != null) { GC gc= new GC(aControl); gc.setFont(JFaceResources.getDialogFont()); gd.widthHint= gc.textExtent(fWidthHintString).x; gc.dispose(); } else if (fWidthHint != -1) { gd.widthHint= fWidthHint; } else { gd.widthHint= SWT.DEFAULT; } return gd; } // ------- ui creation /** * Creates or returns the created status label widget. * @param parent The parent composite or <code>null</code> when the widget has * already been created. */ public Label getStatusLabelControl(Composite parent) { if (fStatusLabelControl == null) { assertCompositeNotNull(parent); fStatusLabelControl= new Label(parent, SWT.LEFT); fStatusLabelControl.setFont(parent.getFont()); fStatusLabelControl.setEnabled(isEnabled()); if (fStatus instanceof Image) { fStatusLabelControl.setImage((Image)fStatus); } else if (fStatus instanceof String) { fStatusLabelControl.setText((String)fStatus); } else { // must be null } } return fStatusLabelControl; } // ------ enable / disable management /* * @see DialogField#updateEnableState */ @Override protected void updateEnableState() { super.updateEnableState(); if (isOkToUse(fStatusLabelControl)) { fStatusLabelControl.setEnabled(isEnabled()); } } /* (non-Javadoc) * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField#refresh() */ @Override public void refresh() { super.refresh(); if (fStatus instanceof String) { setStatus((String) fStatus); } else { setStatus((Image) fStatus); } } }