/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.ui.preferences; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.resource.JFaceResources; 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.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; public abstract class StringButtonComboFieldEditor extends StringComboFieldEditor { private Button changeButton; private String changeButtonText; protected StringButtonComboFieldEditor(String[] items) { super(items); } protected StringButtonComboFieldEditor(String name, String labelText, String[] items, Composite parent) { super(items); init(name, labelText); createControl(parent); } protected void adjustForNumColumns(int numColumns) { ((GridData) getTextControl().getLayoutData()).horizontalSpan = (numColumns - 2); } protected abstract String changePressed(); protected void doFillIntoGrid(Composite parent, int numColumns) { super.doFillIntoGrid(parent, numColumns - 1); this.changeButton = getChangeControl(parent); GridData gd = new GridData(); gd.horizontalAlignment = 4; int widthHint = convertHorizontalDLUsToPixels(this.changeButton, 61); gd.widthHint = Math.max(widthHint, this.changeButton.computeSize(-1, -1, true).x); this.changeButton.setLayoutData(gd); } protected Button getChangeControl(Composite parent) { if (this.changeButton == null) { this.changeButton = new Button(parent, 8); if (this.changeButtonText == null) { this.changeButtonText = JFaceResources.getString("openChange"); } this.changeButton.setText(this.changeButtonText); this.changeButton.setFont(parent.getFont()); this.changeButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { String newValue = StringButtonComboFieldEditor.this .changePressed(); if (newValue != null) StringButtonComboFieldEditor.this.setStringValue(newValue); } }); this.changeButton.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent event) { StringButtonComboFieldEditor.this.changeButton = null; } }); } else { checkParent(this.changeButton, parent); } return this.changeButton; } public int getNumberOfControls() { return 3; } protected Shell getShell() { if (this.changeButton == null) { return null; } return this.changeButton.getShell(); } public void setChangeButtonText(String text) { Assert.isNotNull(text); this.changeButtonText = text; if (this.changeButton != null) { this.changeButton.setText(text); Point prefSize = this.changeButton.computeSize(-1, -1); GridData data = (GridData) this.changeButton.getLayoutData(); data.widthHint = Math.max(-1, prefSize.x); } } public void setEnabled(boolean enabled, Composite parent) { super.setEnabled(enabled, parent); if (this.changeButton != null) this.changeButton.setEnabled(enabled); } }