blob: fc89db7b73a59a81f02f1918ad8ed5a8659b8a13 [file] [log] [blame]
/*
* Copyright (c) 2007, 2009, 2011-2013, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.util.ui.widgets;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
/**
* @author Eike Stepper
* @since 3.4
*/
public abstract class BaseDialog<VIEWER extends Viewer> extends TitleAreaDialog
{
public static final int DEFAULT_SHELL_STYLE = SWT.SHELL_TRIM;
private String title;
private String message;
private Image image;
private IDialogSettings settings;
private VIEWER currentViewer;
private MenuManager contextMenu;
/**
* @since 3.4
*/
public BaseDialog(Shell parentShell, int shellStyle, String title, String message, IDialogSettings settings,
ImageDescriptor descriptor)
{
super(parentShell);
setShellStyle(shellStyle);
this.title = title;
this.message = message;
this.settings = settings;
if (descriptor != null)
{
image = descriptor.createImage(parentShell.getDisplay());
}
}
public BaseDialog(Shell parentShell, int shellStyle, String title, String message, IDialogSettings settings)
{
this(parentShell, DEFAULT_SHELL_STYLE, title, message, settings, null);
}
public BaseDialog(Shell parentShell, String title, String message, IDialogSettings settings)
{
this(parentShell, DEFAULT_SHELL_STYLE, title, message, settings);
}
@Override
protected Control createDialogArea(Composite parent)
{
getShell().setText(title);
setTitle(title);
setMessage(message);
if (image != null)
{
setTitleImage(image);
}
Composite composite = (Composite)super.createDialogArea(parent);
contextMenu = new MenuManager("#PopupMenu"); //$NON-NLS-1$
contextMenu.setRemoveAllWhenShown(true);
contextMenu.addMenuListener(new IMenuListener()
{
public void menuAboutToShow(IMenuManager manager)
{
VIEWER viewer = getCurrentViewer();
if (viewer != null)
{
fillContextMenu(manager, viewer);
}
}
});
createUI(composite);
return composite;
}
protected abstract void createUI(Composite parent);
public VIEWER getCurrentViewer()
{
return currentViewer;
}
public void setCurrentViewer(VIEWER currentViewer)
{
if (this.currentViewer != null)
{
Control control = this.currentViewer.getControl();
control.setMenu(null);
}
this.currentViewer = currentViewer;
if (this.currentViewer != null)
{
Control control = this.currentViewer.getControl();
Menu menu = contextMenu.createContextMenu(control);
control.setMenu(menu);
}
}
protected void hookContextMenu()
{
contextMenu = new MenuManager("#PopupMenu"); //$NON-NLS-1$
contextMenu.setRemoveAllWhenShown(true);
contextMenu.addMenuListener(new IMenuListener()
{
public void menuAboutToShow(IMenuManager manager)
{
fillContextMenu(manager, getCurrentViewer());
}
});
}
protected void fillContextMenu(IMenuManager manager, VIEWER viewer)
{
}
/**
* @since 3.4
*/
protected IDialogSettings getDialogSettings()
{
return settings;
}
/**
* @since 3.4
*/
protected IDialogSettings getDialogSettings(String sectionName)
{
IDialogSettings settings = getDialogSettings();
if (settings == null)
{
return null;
}
sectionName = getClass().getName() + "_" + sectionName;
IDialogSettings section = settings.getSection(sectionName);
if (section == null)
{
section = settings.addNewSection(sectionName);
}
return section;
}
@Override
protected IDialogSettings getDialogBoundsSettings()
{
return getDialogSettings("bounds");
}
@Override
public boolean close()
{
if (image != null)
{
image.dispose();
image = null;
}
return super.close();
}
}