// Copyright (c) 2003-2004 by Leif Frenzel - see http://leiffrenzel.de package net.sf.eclipsefp.common.ui.preferences; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.sf.eclipsefp.common.ui.util.DialogUtil; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; 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; /** <p>the super class for all tabs on a tabbed preference page.</p> * * @author Leif Frenzel */ public abstract class Tab implements IPropertyChangeListener{ private final IPreferenceStore preferenceStore; private final Map<Button, String> checkBoxes = new HashMap<>(); private final Map<Control, Control> labels = new HashMap<>(); private final Map<Text, String> textFields = new HashMap<>(); private final SelectionListener fCheckBoxListener = new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { Button button = ( Button )event.widget; String key = checkBoxes.get( button ); getPreferenceStore().setValue( key, button.getSelection() ); } }; private final ModifyListener fTextFieldListener = new ModifyListener() { @Override public void modifyText( final ModifyEvent event ) { Text text = ( Text )event.widget; String key = textFields.get( text ); getPreferenceStore().setValue( key, text.getText() ); } }; private final VerifyListener integerVerify=new VerifyListener() { @Override public void verifyText( final VerifyEvent e ) { try { Integer.parseInt(e.text); e.doit=true; } catch (NumberFormatException nfe){ if ((e.character=='\b' || e.character==0x7F) && ((Text)e.widget).getText().length()>1){ e.doit=true; } else { e.doit=false; } } } }; public Tab( final IPreferenceStore store ) { this.preferenceStore = store; this.preferenceStore.addPropertyChangeListener(this); } public abstract Control createControl( Composite parent ); public void dispose(){ if (this.preferenceStore!=null){ this.preferenceStore.removePropertyChangeListener(this); } } public void initializeFields() { initializeCheckboxes(); initializeTexts(); } public Control getLabel( final Control field ) { return labels.get( field ); } protected IPreferenceStore getPreferenceStore() { return preferenceStore; } // UI creation helping methods for subclasses ///////////////////////////////////////////// public void createLabel( final Composite parent, final String text ) { Label label = new Label( parent, SWT.LEFT ); label.setText( text ); GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.BEGINNING; label.setLayoutData( gridData ); } public final Button addBooleanField( final Composite parent, final String label, final String key, final int indentation ) { Button checkBox = new Button( parent, SWT.CHECK ); checkBox.setText( label ); GridData gd = new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ); gd.horizontalIndent = indentation; gd.horizontalSpan = 2; checkBox.setLayoutData( gd ); checkBox.addSelectionListener( fCheckBoxListener ); checkBoxes.put( checkBox, key ); return checkBox; } public Control addIntegerField( final Composite composite, final String label, final String key, final int textLimit, final int indentation ) { Text result = addStringField( composite, label, textLimit, indentation ); textFields.put( result, key ); result.addModifyListener( fTextFieldListener ); result.addVerifyListener( integerVerify ); return result; } public Control addTextField( final Composite composite, final String label, final String key, final int textLimit, final int indentation ) { Text result = addStringField( composite, label, textLimit, indentation ); textFields.put( result, key ); result.addModifyListener( fTextFieldListener ); return result; } // helping methods ////////////////// private Text addStringField( final Composite composite, final String label, final int textLimit, final int indentation ) { Label labelControl = new Label( composite, SWT.NONE ); labelControl.setText( label ); GridData gd = new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ); gd.horizontalIndent = indentation; labelControl.setLayoutData( gd ); Text textControl = new Text( composite, SWT.BORDER | SWT.SINGLE ); gd = new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ); gd.widthHint = DialogUtil.convertWidthInCharsToPixels( textControl, textLimit + 1 ); textControl.setLayoutData( gd ); textControl.setTextLimit( textLimit ); labels.put( textControl, labelControl ); return textControl; } private void initializeTexts() { Iterator<Text> iter = textFields.keySet().iterator(); while( iter.hasNext() ) { Text text = iter.next(); String key = textFields.get( text ); text.setText( getPreferenceStore().getString( key ) ); } } private void initializeCheckboxes() { Iterator<Button> iter = checkBoxes.keySet().iterator(); while( iter.hasNext() ) { Button button = iter.next(); String key = checkBoxes.get( button ); button.setSelection( getPreferenceStore().getBoolean( key ) ); } } }