com.dadabeatnik.codemap.ui.editors.CodeMapEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.dadabeatnik.codemap.ui.editors.CodeMapEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2008, 2012 Phillip Beauvoir
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Phillip Beauvoir
 *******************************************************************************/
package com.dadabeatnik.codemap.ui.editors;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
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.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.part.EditorPart;

import com.dadabeatnik.codemap.model.CodeMapModel;
import com.dadabeatnik.codemap.model.EntryModel;
import com.dadabeatnik.codemap.ui.CodeMapActionFactory;

/**
 * Main Editor
 * 
 * @author Phillip Beauvoir
 */
public class CodeMapEditor extends EditorPart {

    /**
     * @param file
     * @return The default Editor for a file or null. The file's contents is used as the basis.
     * @throws IOException 
     * @throws FileNotFoundException 
     */
    public static IEditorDescriptor getDefaultEditor(File file) throws IOException {
        IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
        FileInputStream fi = new FileInputStream(file);
        IContentType contentType = contentTypeManager.findContentTypeFor(fi, file.getName());
        fi.close(); // Must close it!
        IEditorRegistry editor_registry = PlatformUI.getWorkbench().getEditorRegistry();
        return editor_registry.getDefaultEditor(file.getName(), contentType);
    }

    private EntryTableViewer fEntriesTableViewer;
    private EntryComposite fEntryComposite;

    private FormToolkit fToolkit;
    private Form fForm;

    private CodeMapModel fCodeMapModel;

    private boolean fDirty;

    private IAction fActionDelete;
    private IAction fActionSelectAll;
    private IAction fActionNewEntry;

    @Override
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        setSite(site);
        setInput(input);

        setPartName(input.getName());

        fCodeMapModel = new CodeMapModel(((IFileEditorInput) input).getFile());

        try {
            fCodeMapModel.load();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void doSave(IProgressMonitor monitor) {
        try {
            fCodeMapModel.save();
            setDirty(false);
        } catch (CoreException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void doSaveAs() {
    }

    @Override
    public boolean isDirty() {
        return fDirty;
    }

    @Override
    public boolean isSaveAsAllowed() {
        return false;
    }

    public void setDirty(boolean dirty) {
        if (fDirty != dirty) {
            fDirty = dirty;
            firePropertyChange(IEditorPart.PROP_DIRTY);
        }
    }

    @Override
    public void createPartControl(Composite parent) {
        fToolkit = new FormToolkit(Display.getDefault());

        fForm = fToolkit.createForm(parent);
        fToolkit.paintBordersFor(fForm.getBody());

        /*
         * Form Body is main composite
         */
        Composite body = fForm.getBody();
        body.setLayout(new GridLayout());

        SashForm sash = new SashForm(body, SWT.VERTICAL);
        sash.setLayoutData(new GridData(GridData.FILL_BOTH));
        fToolkit.adapt(sash);

        Composite composite = fToolkit.createComposite(sash);
        composite.setLayout(new TableColumnLayout());

        // Entries Table
        fEntriesTableViewer = new EntryTableViewer(this, composite, SWT.BORDER);

        fEntriesTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                // Pass it on
                EntryModel entryModel = (EntryModel) ((StructuredSelection) event.getSelection()).getFirstElement();
                fEntryComposite.setEntry(entryModel);

                // Update actions
                updateActions(event.getSelection());
            }
        });

        fEntryComposite = new EntryComposite(this, sash);

        makeActions();
        hookContextMenu();
        registerGlobalActions();

        sash.setWeights(new int[] { 30, 70 });

        fEntriesTableViewer.setInput(fCodeMapModel);

        if (!fCodeMapModel.getEntries().isEmpty()) {
            fEntriesTableViewer.setSelection(new StructuredSelection(fCodeMapModel.getEntries().get(0)));
        }
    }

    private void makeActions() {
        // Delete
        fActionDelete = new CodeMapActionFactory.DeleteAction() {
            @Override
            public void run() {
                doDeleteAction();
            }
        };
        fActionDelete.setEnabled(false);

        // Select All
        fActionSelectAll = new CodeMapActionFactory.SelectAllAction() {
            @Override
            public void run() {
                fEntriesTableViewer.getTable().selectAll();
                updateActions(fEntriesTableViewer.getSelection());
            }
        };

        // New Entry
        fActionNewEntry = new Action("New Entry") {
            @Override
            public void run() {
                EntryModel entryModel = new EntryModel();
                entryModel.setTitle("new entry");
                fCodeMapModel.addEntry(entryModel);
                fEntriesTableViewer.refresh();
                setDirty(true);
                fEntriesTableViewer.setSelection(new StructuredSelection(entryModel));
                fEntriesTableViewer.reveal(entryModel);
            }
        };
    }

    private void updateActions(ISelection selection) {
        boolean isEmpty = selection.isEmpty();

        //Object obj = ((IStructuredSelection)selection).getFirstElement();

        fActionDelete.setEnabled(!isEmpty);
    }

    /**
     * Delete selected objects
     */
    private void doDeleteAction() {
        List<?> selected = ((IStructuredSelection) fEntriesTableViewer.getSelection()).toList();

        if (!askUserDeleteResources(selected)) {
            return;
        }

        for (Object o : selected) {
            EntryModel entryModel = (EntryModel) o;
            fCodeMapModel.removeEntry(entryModel);
        }

        fEntriesTableViewer.refresh();
        setDirty(true);
    }

    private boolean askUserDeleteResources(List<?> selected) {
        // Confirmation dialog
        return MessageDialog.openQuestion(Display.getDefault().getActiveShell(), "Delete",
                selected.size() > 1 ? "Are you sure you want to delete these entries?"
                        : "Are you sure you want to delete this entry?");
    }

    /**
     * Hook into a right-click menu
     */
    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#CodeMapPopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);

        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                fillContextMenu(manager);
            }
        });

        Menu menu = menuMgr.createContextMenu(fEntriesTableViewer.getControl());
        fEntriesTableViewer.getControl().setMenu(menu);
        //fEditor.getSite().registerContextMenu(menuMgr, this); // NO!!!!! Otherwise you get the full Eclipse context menu items
    }

    private void fillContextMenu(IMenuManager manager) {
        boolean isEmpty = fEntriesTableViewer.getSelection().isEmpty();

        manager.add(new Separator(IWorkbenchActionConstants.EDIT_START));
        manager.add(fActionNewEntry);

        if (!isEmpty) {
            manager.add(fActionDelete);
        }

        manager.add(new Separator(IWorkbenchActionConstants.EDIT_END));
        manager.add(fActionSelectAll);

        // Other plug-ins can contribute their actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    /**
     * Register Global Actions on focus events
     */
    private void registerGlobalActions() {
        final IActionBars bars = getEditorSite().getActionBars();

        fEntriesTableViewer.getControl().addFocusListener(new FocusListener() {
            public void focusGained(FocusEvent e) {
                register(true);
            }

            public void focusLost(FocusEvent e) {
                register(false);
            }

            // Only de-register specific actions (not undo/redo!)
            private void register(boolean hasFocus) {
                bars.setGlobalActionHandler(ActionFactory.DELETE.getId(), hasFocus ? fActionDelete : null);
                // bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), hasFocus ? fActionSelectAll : null);
                bars.updateActionBars();
            }
        });
    }

    public void changedModel(EntryModel entryModel) {
        fEntriesTableViewer.refresh(entryModel);
    }

    @Override
    public void setFocus() {
        if (fEntriesTableViewer != null) {
            fEntriesTableViewer.getControl().setFocus();
        }
    }

    @SuppressWarnings("rawtypes")
    @Override
    public Object getAdapter(Class adapter) {
        if (adapter == CodeMapModel.class) {
            return fCodeMapModel;
        }

        if (adapter == FormToolkit.class) {
            return fToolkit;
        }

        return super.getAdapter(adapter);
    }

    @Override
    public void dispose() {
        super.dispose();
        fToolkit.dispose();
    }

}