package org.xmind.ui.internal.print.multipage;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.actions.ActionFactory;
import org.xmind.gef.IGraphicalViewer;
import org.xmind.gef.ui.actions.PageAction;
import org.xmind.gef.ui.editor.IGraphicalEditor;
import org.xmind.gef.ui.editor.IGraphicalEditorPage;
import org.xmind.ui.internal.print.PrintClient;
import org.xmind.ui.internal.print.PrintConstants;
import org.xmind.ui.mindmap.IMindMap;
/**
* Support single page print and multi page print of map.
*
* @author Shawn
*
*/
public class PrintMapAction2 extends PageAction {
public PrintMapAction2(IGraphicalEditorPage page) {
super(ActionFactory.PRINT.getId(), page);
setActionDefinitionId(ActionFactory.PRINT.getCommandId());
}
public void run() {
final IGraphicalEditor editor = getEditor();
if (editor == null) {
return;
}
Shell parentShell = editor.getSite().getShell();
if (parentShell == null || parentShell.isDisposed()) {
return;
}
IGraphicalEditorPage page = editor.getActivePageInstance();
if (page == null) {
return;
}
final IMindMap mindMap = findMindMap(page);
if (mindMap == null) {
return;
}
MultipageSetupDialog pageSetupDialog = new MultipageSetupDialog(
parentShell, page, mindMap);
int open = pageSetupDialog.open();
if (open == MultipageSetupDialog.CANCEL)
return;
final IDialogSettings settings = pageSetupDialog.getSettings();
PrinterData printerData = new PrinterData();
try {
printerData.orientation = settings
.getInt(PrintConstants.ORIENTATION);
} catch (NumberFormatException e) {
printerData.orientation = PrinterData.LANDSCAPE;
}
PrintDialog printDialog = new PrintDialog(parentShell);
printDialog.setPrinterData(printerData);
printerData = printDialog.open();
if (printerData != null) {
if (settings.getBoolean(PrintConstants.MULTI_PAGES)) {
//multiple page print
final MultipagePrintClient client = new MultipagePrintClient(
getJobName(mindMap), parentShell, printerData,
settings);
try {
if (settings.getBoolean(PrintConstants.CONTENTWHOLE)
&& !settings
.getBoolean(PrintConstants.MULTI_PAGES)) {
IGraphicalEditorPage[] pages = editor.getPages();
for (int i = 0; i < pages.length; i++) {
client.print(findMindMap(pages[i]));
}
} else {
client.print(mindMap);
}
} finally {
client.dispose();
}
} else {
//single page print
final PrintClient client = new PrintClient(getJobName(mindMap),
parentShell, printerData, settings);
Display display = parentShell.getDisplay();
try {
BusyIndicator.showWhile(display, new Runnable() {
public void run() {
if (settings
.getBoolean(PrintConstants.CONTENTWHOLE)) {
IGraphicalEditorPage[] pages = editor
.getPages();
for (int i = 0; i < pages.length; i++) {
client.print(findMindMap(pages[i]));
}
} else {
client.print(mindMap);
}
return;
}
});
} finally {
client.dispose();
}
}
}
}
private IMindMap findMindMap(IGraphicalEditorPage page) {
IMindMap map = (IMindMap) page.getAdapter(IMindMap.class);
if (map != null)
return map;
if (page.getInput() instanceof IMindMap)
return (IMindMap) page.getInput();
IGraphicalViewer viewer = page.getViewer();
if (viewer != null) {
map = (IMindMap) viewer.getAdapter(IMindMap.class);
if (map != null)
return map;
if (viewer.getInput() instanceof IMindMap)
return (IMindMap) viewer.getInput();
}
return null;
}
private String getJobName(IMindMap map) {
return map.getCentralTopic().getTitleText().replaceAll("\r\n|\r|\n", //$NON-NLS-1$
" "); //$NON-NLS-1$
}
}