package org.xmind.ui.internal.e4models; import javax.inject.Inject; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.ColorDescriptor; import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.resource.ResourceManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.xmind.core.ITopic; import org.xmind.gef.EditDomain; import org.xmind.gef.GEF; import org.xmind.gef.IGraphicalViewer; import org.xmind.gef.IViewer; import org.xmind.gef.Request; import org.xmind.gef.part.IPart; import org.xmind.gef.ui.editor.IGraphicalEditor; import org.xmind.gef.ui.editor.IGraphicalEditorPage; import org.xmind.ui.internal.MindMapMessages; import org.xmind.ui.internal.dialogs.DialogMessages; import org.xmind.ui.internal.dialogs.DialogUtils; import org.xmind.ui.mindmap.MindMapUI; import org.xmind.ui.resources.ColorUtils; import org.xmind.ui.resources.FontUtils; import org.xmind.ui.util.MindMapUtils; public class LocalImageModelPage extends ModelPage implements ISelectionChangedListener, IPartListener { public static final String PAGE_ID = "org.xmind.ui.modelPart.image.pages.local"; //$NON-NLS-1$ private class InsertImageAction extends Action { public void run() { IGraphicalEditorPage page = (getEditor() == null ? null : getEditor().getActivePageInstance()); if (page == null || page.isDisposed()) { return; } EditDomain domain = page.getEditDomain(); if (domain == null) { return; } IGraphicalViewer viewer = page.getViewer(); if (viewer == null) { return; } Control control = viewer.getControl(); if (control == null || control.isDisposed()) { return; } ISelection selection = viewer.getSelection(); if (selection.isEmpty() || !(selection instanceof IStructuredSelection)) { return; } Object o = ((IStructuredSelection) selection).getFirstElement(); IPart part = viewer.findPart(o); ITopic topic = (ITopic) part.getAdapter(ITopic.class); if (topic == null) { return; } IPart topicPart = viewer.findPart(topic); if (topicPart == null) { return; } FileDialog dialog = new FileDialog(control.getShell(), SWT.OPEN); DialogUtils.makeDefaultImageSelectorDialog(dialog, true); dialog.setText(DialogMessages.SelectImageDialog_title); String path = dialog.open(); if (path == null) { return; } insertImage(path, topicPart, viewer, domain); } private void insertImage(String path, IPart topicPart, IViewer viewer, EditDomain domain) { Request request = new Request(MindMapUI.REQ_ADD_IMAGE); request.setViewer(viewer); request.setPrimaryTarget(topicPart); request.setParameter(GEF.PARAM_PATH, new String[] { path }); domain.handleRequest(request); } } @Inject private IWorkbenchWindow workbenchWindow; private ResourceManager resources; private Button button; private IGraphicalEditor editor; @Override public String getModelPageId() { return PAGE_ID; } @Override public String getModelPageTitle() { return MindMapMessages.LocalImageModelPage_title; } @Override protected Control doCreateControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); resources = new LocalResourceManager(JFaceResources.getResources(), container); container.setBackground( (Color) resources.get(ColorUtils.toDescriptor("#ffffff"))); //$NON-NLS-1$ container.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; container.setLayout(layout); createContent(container); //add dispose listener container.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { dispose(); } }); return container; } private void createContent(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setBackground(parent.getBackground()); composite.setLayoutData( new GridData(SWT.CENTER, SWT.CENTER, true, true)); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 60; layout.horizontalSpacing = 0; composite.setLayout(layout); createImageSection(composite); createButtonSection(composite); } private void createImageSection(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setBackground(parent.getBackground()); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 20; layout.horizontalSpacing = 0; composite.setLayout(layout); Label image = new Label(composite, SWT.NONE); image.setBackground(composite.getBackground()); image.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); image.setImage((Image) resources.get(MindMapUI.getImages() .get("insert_local_image_page.png", true))); //$NON-NLS-1$ Composite composite2 = new Composite(composite, SWT.NONE); composite2.setBackground(parent.getBackground()); composite2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); GridLayout layout2 = new GridLayout(1, false); layout2.marginWidth = 10; layout2.marginHeight = 0; composite2.setLayout(layout2); Label text = new Label(composite2, SWT.WRAP); text.setBackground(composite2.getBackground()); text.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); text.setForeground((Color) resources .get(ColorDescriptor.createFrom(ColorUtils.toRGB("#aaaaaa")))); //$NON-NLS-1$ text.setAlignment(SWT.CENTER); text.setFont((Font) resources.get(FontDescriptor.createFrom( FontUtils.relativeHeight(text.getFont().getFontData(), 2)))); text.setText( MindMapMessages.LocalImageModelPage_ImageSection_description); } private void createButtonSection(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setBackground(parent.getBackground()); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; composite.setLayout(layout); button = new Button(composite, SWT.PUSH); button.setBackground(composite.getBackground()); GridData layoutData = new GridData(SWT.CENTER, SWT.CENTER, true, false); layoutData.widthHint = 90; button.setLayoutData(layoutData); button.setText(MindMapMessages.LocalImageModelPage_Insert_button); final InsertImageAction insertImageAction = new InsertImageAction(); button.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { insertImageAction.run(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); //set button state setTargetEditor(getEditor()); workbenchWindow.getActivePage().addPartListener(this); } public void setFocus() { if (button != null && !button.isDisposed()) { button.setFocus(); } } private void setTargetEditor(IGraphicalEditor editor) { if (editor == this.editor) { return; } if (this.editor != null) { this.editor.getSite().getSelectionProvider() .removeSelectionChangedListener(this); } this.editor = editor; if (this.editor != null) { this.editor.getSite().getSelectionProvider() .addSelectionChangedListener(this); setSelection( editor.getSite().getSelectionProvider().getSelection()); } else { setSelection(null); } } @Override public void selectionChanged(SelectionChangedEvent event) { setSelection(event.getSelection()); } private void setSelection(ISelection selection) { boolean isEnabled = MindMapUtils.isSingleTopic(selection); if (button != null && !button.isDisposed()) { button.setEnabled(isEnabled); } } @Override public void partActivated(IWorkbenchPart part) { if (part instanceof IGraphicalEditor) { setTargetEditor((IGraphicalEditor) part); } } @Override public void partBroughtToTop(IWorkbenchPart part) { } @Override public void partClosed(IWorkbenchPart part) { setTargetEditor(null); } @Override public void partDeactivated(IWorkbenchPart part) { } @Override public void partOpened(IWorkbenchPart part) { } private void dispose() { setTargetEditor(null); workbenchWindow.getActivePage().removePartListener(this); } private IGraphicalEditor getEditor() { IEditorPart activeEditor = workbenchWindow.getActivePage() .getActiveEditor(); if (activeEditor instanceof IGraphicalEditor) { return (IGraphicalEditor) activeEditor; } return null; } }