org.xmind.ui.internal.properties.MindMapPropertySheetPage.java Source code

Java tutorial

Introduction

Here is the source code for org.xmind.ui.internal.properties.MindMapPropertySheetPage.java

Source

/* ******************************************************************************
 * 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.properties;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.part.IPageSite;
import org.xmind.core.style.IStyled;
import org.xmind.gef.ui.editor.IGraphicalEditor;
import org.xmind.gef.ui.editor.IGraphicalEditorPage;
import org.xmind.gef.ui.properties.GraphicalPropertySheetPage;
import org.xmind.ui.commands.CommandMessages;
import org.xmind.ui.commands.ModifyStyleCommand;
import org.xmind.ui.forms.WidgetFactory;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.mindmap.ICategoryAnalyzation;
import org.xmind.ui.mindmap.ICategoryManager;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.resources.FontUtils;

public class MindMapPropertySheetPage extends GraphicalPropertySheetPage {

    private static PropertySectionContributorManager manager = PropertySectionContributorManager.getInstance();

    private Hyperlink resetStyleControl;

    public MindMapPropertySheetPage(IGraphicalEditor editor) {
        super(editor);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.xmind.gef.ui.properties.GraphicalPropertySheetPage#init(org.eclipse
     * .ui.part.IPageSite)
     */
    @Override
    public void init(IPageSite pageSite) {
        super.init(pageSite);
        IActionBars targetActionBars = pageSite.getActionBars();
        IActionBars sourceActionBars = getContributedEditor().getEditorSite().getActionBars();
        retargetAction(sourceActionBars, targetActionBars, ActionFactory.UNDO.getId());
        retargetAction(sourceActionBars, targetActionBars, ActionFactory.REDO.getId());
    }

    /**
     * @param sourceActionBars
     * @param targetActionBars
     * @param id
     */
    private void retargetAction(IActionBars sourceActionBars, IActionBars targetActionBars, String actionId) {
        IAction handler = sourceActionBars.getGlobalActionHandler(actionId);
        if (handler != null) {
            targetActionBars.setGlobalActionHandler(actionId, handler);
        }
    }

    @Override
    protected void createExtendSectionControls(WidgetFactory widgetFactory, Composite parent) {
        super.createExtendSectionControls(widgetFactory, parent);
        createResetStyleControl(widgetFactory, parent);
    }

    private void createResetStyleControl(WidgetFactory widgetFactory, Composite parent) {
        resetStyleControl = widgetFactory.createHyperlink(parent,
                MindMapMessages.MindMapPropertySheetPage_ResetStyle_text, SWT.NONE);
        resetStyleControl.setUnderlined(false);
        resetStyleControl.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false));
        resetStyleControl.addHyperlinkListener(new IHyperlinkListener() {

            public void linkExited(HyperlinkEvent e) {
                resetStyleControl.setUnderlined(false);
            }

            public void linkEntered(HyperlinkEvent e) {
                resetStyleControl.setUnderlined(true);
            }

            public void linkActivated(HyperlinkEvent e) {
                resetStyles();
            }
        });
        resetStyleControl.setFont(FontUtils.getRelativeHeight(JFaceResources.DEFAULT_FONT, -1));
        resetStyleControl.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_BLUE));
    }

    private boolean shouldHasResetStyleControl(ISelection selection) {
        if (!(selection instanceof StructuredSelection))
            return false;

        boolean result = true;

        Object[] resetedStyleds = ((StructuredSelection) selection).toArray();
        if (resetedStyleds != null) {
            for (Object styled : resetedStyleds) {
                if (!(styled instanceof IStyled)) {
                    result = false;
                }
            }
        }
        return result;
    }

    protected void resetStyles() {
        IGraphicalEditor editor = getContributedEditor();
        if (editor == null)
            return;

        IGraphicalEditorPage activePageInstance = editor.getActivePageInstance();
        if (activePageInstance == null)
            return;

        ISelectionProvider selectionProvider = activePageInstance.getSelectionProvider();
        if (selectionProvider == null)
            return;

        ISelection selection = selectionProvider.getSelection();
        if (!(selection instanceof StructuredSelection))
            return;

        Object[] resetedStyleds = ((StructuredSelection) selection).toArray();
        if (resetedStyleds != null) {
            for (Object styled : resetedStyleds) {
                if (styled instanceof IStyled) {
                    IStyled resetedStyled = (IStyled) styled;
                    ModifyStyleCommand modifyStyleCommand = new ModifyStyleCommand(resetedStyled, (String) null);
                    modifyStyleCommand.setLabel(CommandMessages.Command_ModifyStyle);
                    editor.getCommandStack().execute(modifyStyleCommand);
                }
            }
        }
    }

    protected void selectionChanged(ISelection selection) {
        if (getControl() != null && !getControl().isDisposed())
            getControl().setRedraw(false);

        if (resetStyleControl != null && !resetStyleControl.isDisposed()) {
            boolean resetStyleControlVisible = shouldHasResetStyleControl(selection);
            GridData gd = (GridData) resetStyleControl.getLayoutData();
            gd.exclude = !resetStyleControlVisible;
            resetStyleControl.setVisible(resetStyleControlVisible);
        }

        if (selection instanceof IStructuredSelection) {
            IStructuredSelection ss = (IStructuredSelection) selection;
            List<String> newVisibleSectionIds = manager.getApplicableSectionIds(ss.toArray());
            List<String> oldVisibleSectionIds = getVisibleSectionIds();
            if (!equalsList(oldVisibleSectionIds, newVisibleSectionIds)) {
                List<String> oldSectionIds = getSectionIds();
                List<String> toAdd = new ArrayList<String>(newVisibleSectionIds);
                toAdd.removeAll(oldSectionIds);
                for (String id : toAdd) {
                    addSection(id, newVisibleSectionIds, oldSectionIds);
                    oldSectionIds = getSectionIds();
                }

                List<String> toHide = new ArrayList<String>(oldSectionIds);
                toHide.removeAll(newVisibleSectionIds);
                for (String id : oldSectionIds) {
                    setSectionVisible(id, !toHide.contains(id));
                }

                reflow();
            }
            setTitle(calcTitle(ss.toArray()));
        } else {
            setTitle(null);
        }
        if (getControl() != null && !getControl().isDisposed())
            getControl().setRedraw(true);
    }

    private void addSection(String id, List<String> newVisibleSectionIds, List<String> oldSectionIds) {
        addSection(id, manager.createSection(id));
        String aboveId = findAboveId(id, oldSectionIds, newVisibleSectionIds);
        moveSectionAfter(id, aboveId);
    }

    private String findAboveId(String id, List<String> oldSectionIds, List<String> newSectionIds) {
        int index = newSectionIds.indexOf(id);
        for (int i = index - 1; i >= 0; i--) {
            String aboveId = newSectionIds.get(i);
            if (oldSectionIds.contains(aboveId))
                return aboveId;
        }
        return null;
    }

    private static boolean equalsList(List<String> list1, List<String> list2) {
        if (list1.size() != list2.size())
            return false;
        for (int i = 0; i < list1.size(); i++) {
            String s1 = list1.get(i);
            String s2 = list2.get(i);
            if (!s1.equals(s2))
                return false;
        }
        return true;
    }

    private String calcTitle(Object[] objects) {
        if (objects == null || objects.length == 0)
            return null;
        String category = getCategoryName(objects);
        return category;
        //        String names = join(getObjectNames(objects));
        //        if ("".equals(names)) //$NON-NLS-1$
        //            return category;
        //        return NLS.bind("{0} ({1})", category, names); //$NON-NLS-1$
    }

    //    private String[] getObjectNames(Object[] objects) {
    //        String[] names = new String[objects.length];
    //        for (int i = 0; i < objects.length; i++) {
    //            Object obj = objects[i];
    //            names[i] = trim(getObjectName(obj));
    //        }
    //        return names;
    //    }

    //    private String getObjectName(Object obj) {
    //        if (obj instanceof ITitled)
    //            return ((ITitled) obj).getTitleText();
    //        if (obj instanceof INamed)
    //            return ((INamed) obj).getName();
    //        if (obj instanceof IAdaptable) {
    //            ITitled titled = (ITitled) ((IAdaptable) obj)
    //                    .getAdapter(ITitled.class);
    //            if (titled != null)
    //                return titled.getTitleText();
    //            INamed named = (INamed) ((IAdaptable) obj).getAdapter(INamed.class);
    //            if (named != null)
    //                return named.getName();
    //        }
    //
    //        if (obj != null)
    //            return obj.toString();
    //        return ""; //$NON-NLS-1$
    //    }

    private String getCategoryName(Object[] objects) {
        ICategoryManager typeManager = MindMapUI.getCategoryManager();
        ICategoryAnalyzation result = typeManager.analyze(objects);
        return typeManager.getCategoryName(result.getMainCategory());
    }

    //    private static String join(String[] strs) {
    //        StringBuilder sb = new StringBuilder(strs.length * 15);
    //        for (String s : strs) {
    //            if (sb.length() > 0) {
    //                sb.append(", "); //$NON-NLS-1$
    //            }
    //            sb.append(s);
    //        }
    //        return sb.toString();
    //    }

    //    private static String trim(String name) {
    //        name = name.replaceAll("\\s+", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$
    //        return name.length() > 100 ? name.substring(0, 97) + "..." : name; //$NON-NLS-1$
    //    }

}