package name.abuchen.portfolio.bootstrap;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.eclipse.e4.ui.internal.workbench.PartServiceSaveHandler;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
@SuppressWarnings("restriction")
public class CustomSaveHandler extends PartServiceSaveHandler
{
private static final class PromptForSaveDialog extends MessageDialog
{
private PromptForSaveDialog(Shell parentShell, String dialogMessage)
{
super(parentShell, Messages.SaveHandlerTitle, null, dialogMessage, MessageDialog.INFORMATION, //
new String[] { Messages.LabelYes, Messages.LabelNo, Messages.LabelCancel }, 0);
setShellStyle(getShellStyle() | SWT.SHEET);
}
}
@Override
public Save promptToSave(MPart dirtyPart)
{
String prompt = MessageFormat.format(Messages.SaveHandlerPrompt, dirtyPart.getLabel());
MessageDialog dialog = new PromptForSaveDialog(Display.getDefault().getActiveShell(), prompt);
switch (dialog.open())
{
case 0:
return Save.YES;
case 1:
return Save.NO;
case 2:
default:
return Save.CANCEL;
}
}
@Override
public Save[] promptToSave(Collection<MPart> dirtyParts)
{
if (dirtyParts.size() == 1)
return new Save[] { promptToSave(dirtyParts.iterator().next()) };
else
return promptToSaveMultiple(dirtyParts);
}
private Save[] promptToSaveMultiple(Collection<MPart> dirtyParts)
{
FilePickerDialog dialog = new FilePickerDialog(Display.getDefault().getActiveShell());
dialog.setElements(dirtyParts);
int returnCode = dialog.open();
Save[] answer = new Save[dirtyParts.size()];
if (returnCode == Dialog.OK)
{
Arrays.fill(answer, Save.NO);
if (dialog.getResult() != null)
{
List<MPart> parts = new ArrayList<MPart>(dirtyParts);
for (Object toBeSaved : dialog.getResult())
answer[parts.indexOf(toBeSaved)] = Save.YES;
}
}
else if (returnCode == FilePickerDialog.SAVE_ALL)
{
Arrays.fill(answer, Save.YES);
}
else if (returnCode == Dialog.CANCEL)
{
Arrays.fill(answer, Save.CANCEL);
}
return answer;
}
}