/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.attribute.editor; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.jboss.tools.common.model.ui.attribute.adapter.DefaultValueAdapter; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.wizard.IWizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Shell; import org.jboss.tools.common.model.ui.widgets.DefaultSettings; public class PropertyEditorDialog extends Dialog { public static final int MINIMUM_WIDTH = 400; public static final int MINIMUM_HEIGHT = 300; IPropertyEditor propertyEditor; ExtendedFieldEditor editor; DefaultValueAdapter adapter; PropertyChangeListener listener = new VCL(); Object initValue; public PropertyEditorDialog(Shell parentShell, IPropertyEditor editor) { super(parentShell); this.propertyEditor = editor; initValue = editor.getValue(); } protected Control createDialogArea(Composite parent) { Composite composite = (Composite)super.createDialogArea(parent); Layout pageContainerLayout = new LayoutFactory(parent.getShell()).createLayout(5, 5, MINIMUM_WIDTH, MINIMUM_HEIGHT); //GridLayout pageContainerLayout = new GridLayout(); composite.setLayout(pageContainerLayout); createDialogAreaInternal(composite); if(propertyEditor.getInput() instanceof DefaultValueAdapter) { adapter = (DefaultValueAdapter)propertyEditor.getInput(); adapter.addValueChangeListener(listener); } return composite; } protected Control createButtonBar(Composite parent) { Control c = super.createButtonBar(parent); Button b = getButton(IDialogConstants.OK_ID); b.setEnabled(false); return c; } protected Control createDialogAreaInternal(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; composite.setLayout(layout); createFieldEditor(composite); return composite; } protected void createFieldEditor(Composite parent) { editor = propertyEditor.getFieldEditor(parent); editor.setSettings(DefaultSettings.getDefault()); int cn = editor.getNumberOfControls(); if(cn > 2) { GridLayout layout = new GridLayout(); layout.numColumns = cn; parent.setLayout(layout); } else cn = 2; editor.fillIntoGrid(parent, cn); editor.setOwnerDialog(this); } public void okPressed() { Button b = getButton(IDialogConstants.OK_ID); if(b == null || !b.isEnabled()) { return; } super.okPressed(); } protected void buttonPressed(int buttonId) { if (IDialogConstants.OK_ID == buttonId) { editor.store(); } super.buttonPressed(buttonId); } public void dispose() { if(adapter != null) { adapter.removeValueChangeListener(listener); adapter = null; } if(editor != null) editor.setOwnerDialog(null); } class VCL implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent event) { Object value = event.getNewValue(); Button b = getButton(IDialogConstants.OK_ID); if(b == null || b.isDisposed()) { dispose(); return; } boolean enabled = (value != null && !value.equals(initValue)); b.setEnabled(enabled); } } class LayoutFactory extends WizardDialog { public LayoutFactory(Shell shell) { super(shell, null); } protected void setWizard(IWizard newWizard) { } public Layout createLayout(int mw, int mh, int minW, int minH) { return new PageContainerFillLayout(mw, mh, minW, minH) { public Point computeSize(Composite composite, int wHint, int hHint, boolean force) { Point p = super.computeSize(composite, wHint, hHint, force); if(p.y > 400) p.y = 400; return p; } }; } } }