package eu.jucy.gui.settings; import java.io.IOException; import logger.LoggerFactory; import org.apache.log4j.Logger; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; 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.Cursor; import org.eclipse.swt.graphics.Image; 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.Link; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.preferences.ScopedPreferenceStore; import uc.PI; public abstract class UCPrefpage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { protected static final Logger logger = LoggerFactory.make(); private final ScopedPreferenceStore preferences; private final String showHelpID; public UCPrefpage(String pluginID,String helpID) { super(GRID); preferences = new ScopedPreferenceStore(InstanceScope.INSTANCE ,pluginID); setPreferenceStore(preferences); this.showHelpID = helpID; } public UCPrefpage(String pluginID) { this(pluginID,null); } public UCPrefpage() { this(PI.PLUGIN_ID); } public boolean performOk() { try { preferences.save(); } catch(IOException ioe){ logger.warn(ioe,ioe); } catch(NullPointerException npe) { throw new RuntimeException("Bad NPE: "+getClass().getName(),npe) ; } return super.performOk(); } public void init(IWorkbench workbench) {} protected void contributeButtons(Composite parent) { if (showHelpID != null) { createHelpControl(parent); PlatformUI.getWorkbench().getHelpSystem().setHelp(getFieldEditorParent(),showHelpID); } } protected Control createHelpControl(Composite parent) { Image helpImage = JFaceResources.getImage(Dialog.DLG_IMG_HELP); if (helpImage != null) { return createHelpImageButton(parent, helpImage); } return createHelpLink(parent); } /* * Creates a help link. This is used when there is no help image * available. */ private Link createHelpLink(Composite parent) { Link link = new Link(parent, SWT.WRAP | SWT.NO_FOCUS); ((GridLayout) parent.getLayout()).numColumns++; link.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); link.setText("<a>"+IDialogConstants.HELP_LABEL+"</a>"); //$NON-NLS-1$ //$NON-NLS-2$ link.setToolTipText(IDialogConstants.HELP_LABEL); link.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { helpPressed(); } }); return link; } /* * Creates a button with a help image. This is only used if there * is an image available. */ private ToolBar createHelpImageButton(Composite parent, Image image) { ToolBar toolBar = new ToolBar(parent, SWT.FLAT | SWT.NO_FOCUS); ((GridLayout) parent.getLayout()).numColumns++; toolBar.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); final Cursor cursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND); toolBar.setCursor(cursor); toolBar.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { cursor.dispose(); } }); ToolItem item = new ToolItem(toolBar, SWT.NONE); item.setImage(image); item.setToolTipText(JFaceResources.getString("helpToolTip")); //$NON-NLS-1$ item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { helpPressed(); } }); return toolBar; } /* * Called when the help control is invoked. This emulates the keyboard * context help behavior (e.g. F1 on Windows). It traverses the widget * tree upward until it finds a widget that has a help listener on it, * then invokes a help event on that widget. */ private void helpPressed() { logger.debug("help Pressed.."); if (getShell() != null) { Control c = getFieldEditorParent(); while (c != null) { if (c.isListening(SWT.Help)) { logger.debug("found listener"); c.notifyListeners(SWT.Help, new Event()); break; } c = c.getParent(); } } } }