/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.dialogs; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; 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.Label; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.dialogs.FilteredTree; import org.eclipse.ui.dialogs.PatternFilter; import org.xmind.core.ISheet; import org.xmind.core.ITopic; import org.xmind.core.IWorkbook; import org.xmind.core.util.HyperlinkUtils; import org.xmind.ui.dialogs.HyperlinkPage; /** * @author Frank Shaka */ public class TopicHyperlinkPage extends HyperlinkPage { private class TopicPageContentProvider implements ITreeContentProvider { public Object[] getElements(Object inputElement) { if (inputElement instanceof IWorkbook) { List<ISheet> sheets = ((IWorkbook) inputElement).getSheets(); List<ITopic> rootTopics = new ArrayList<ITopic>(sheets.size()); for (ISheet sheet : sheets) { rootTopics.add(sheet.getRootTopic()); } return rootTopics.toArray(); } return new Object[0]; } public boolean hasChildren(Object element) { if (element instanceof ITopic) { return !((ITopic) element).getAllChildren().isEmpty(); } return false; } public Object[] getChildren(Object parentElement) { if (parentElement instanceof ITopic) { return ((ITopic) parentElement).getAllChildren().toArray(); } return new Object[0]; } public Object getParent(Object element) { if (element instanceof ITopic) { ITopic topic = (ITopic) element; if (topic.isRoot()) return topic.getOwnedWorkbook(); return topic.getParent(); } return null; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } private class TopicPageLabelProvider extends LabelProvider { public String getText(Object element) { if (element instanceof ITopic) { ITopic topic = (ITopic) element; if (topic.isRoot()) { return topic.getTitleText() + " (" //$NON-NLS-1$ + topic.getOwnedSheet().getTitleText() + ")"; //$NON-NLS-1$ } String titleText = topic.getTitleText(); return titleText.replaceAll("\\r\\n|\\n|\\r", " "); //$NON-NLS-1$ //$NON-NLS-2$ } return super.getText(element); } /* * (non-Javadoc) * @see * org.xmind.ui.viewers.ImageCachedLabelProvider#createImage(java.lang * .Object) */ // protected Image createImage(Object element) { // ImageDescriptor icon = MindMapUI.getImages().getElementIcon(element, // true); // if (icon == null) // return null; // return icon.createImage(false); // } } private class TopicSelectionListener implements ISelectionChangedListener { public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) selection; Object element = ss.getFirstElement(); if (element instanceof ITopic) { isModifyValue = true; setValue(HyperlinkUtils.toInternalURL((ITopic) element)); isModifyValue = false; setCanFinish(true); } } } } public Composite composite; public IWorkbook workbook; public boolean isModifyValue = false; public String str; private TreeViewer topicViewer; public TopicHyperlinkPage() { } public void init(IEditorPart editor, IStructuredSelection selection) { this.workbook = (IWorkbook) editor.getAdapter(IWorkbook.class); } public void createControl(Composite parent) { composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(1, false)); createLabel(composite); createTopicViewer(composite); } /** * @param parent */ private void createLabel(Composite parent) { Label label = new Label(parent, SWT.WRAP); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); label.setText(DialogMessages.TopicHyperlinkPage_label); } /** * @param parent */ private void createTopicViewer(Composite parent) { // topicViewer = new TreeViewer(parent, SWT.SINGLE | SWT.BORDER); PatternFilter filter = new PatternFilter(); FilteredTree tree = new FilteredTree(parent, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, filter, true); topicViewer = tree.getViewer(); topicViewer.getControl() .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); topicViewer.setAutoExpandLevel(2); topicViewer.setContentProvider(new TopicPageContentProvider()); topicViewer.setLabelProvider(new TopicPageLabelProvider()); if (workbook != null) topicViewer.setInput(workbook); topicViewer.addSelectionChangedListener(new TopicSelectionListener()); } public void setValue(String value) { super.setValue(value); if (!isModifyValue) { if (topicViewer != null && topicViewer.getControl() != null && !topicViewer.getControl().isDisposed()) { Object element = getElement(value); if (element != null) { topicViewer.setSelection(new StructuredSelection(element), true); } else { topicViewer.setSelection(StructuredSelection.EMPTY); } } } } /** * @param value */ private Object getElement(String value) { if (value == null) return null; if (workbook == null) return null; return HyperlinkUtils.findElement(value, workbook); } public void dispose() { } public Control getControl() { return composite; } public void setFocus() { if (topicViewer != null) { Control control = topicViewer.getControl(); if (control != null && !control.isDisposed()) { control.setFocus(); } } } }