org.cfeclipse.cfml.views.snips.SnipTreeView.java Source code

Java tutorial

Introduction

Here is the source code for org.cfeclipse.cfml.views.snips.SnipTreeView.java

Source

/*
 * Created on Feb 27, 2004
 *
 * The MIT License
 * Copyright (c) 2004 Rob Rohan
 *
 * Permission is hereby granted, free of charge, to any person obtaining a 
 * copy of this software and associated documentation files (the "Software"), 
 * to deal in the Software without restriction, including without limitation 
 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
 * and/or sell copies of the Software, and to permit persons to whom the Software 
 * is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in 
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
 * SOFTWARE.
 */
package org.cfeclipse.cfml.views.snips;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import org.cfeclipse.cfml.CFMLPlugin;
import org.cfeclipse.cfml.editors.actions.GenericEncloserAction;
import org.cfeclipse.cfml.preferences.CFMLPreferenceConstants;
import org.cfeclipse.cfml.properties.CFMLPropertyManager;
import org.cfeclipse.cfml.preferences.CFMLPreferenceManager;
import org.cfeclipse.cfml.preferences.SnipExPreferenceConstants;
import org.cfeclipse.cfml.preferences.SnipExPreferencePage;
import org.cfeclipse.cfml.util.CFPluginImages;
import org.cfeclipse.cfml.wizards.snipex.SnippetToSnipExWizard;
import org.eclipse.core.internal.resources.Folder;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.IPreferencePage;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.preference.PreferenceNode;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
import org.cfeclipse.snipex.SnipEx;
import org.cfeclipse.snipex.Library;
import org.cfeclipse.snipex.Snippet;

/**
 * @author Rob
 *
 * This is a more complex view of snips with a tree view. This is the main
 * view class
 * 
 * @see ViewPart
 * 
 * This class was influenced by the aricle:
 * How to use the JFace Tree Viewer
 * By Chris Grindstaff, Applied Reasoning (chrisg at appliedReasoning.com)
 * May 5, 2002
 */
public class SnipTreeView extends ViewPart implements IPropertyChangeListener {
    public static final String ID_SNIPVIEWTREE = "org.cfeclipse.cfml.views.snips.sniptreeview";

    public static final String DREAMWEAVER_SNIP_TYPE = "Dreamweaver";
    public static final String HOMESITE_SNIP_TYPE = "Homesite";
    public static final String CFECLIPSE_SNIP_TYPE = "CFEclipse";
    public static final String UNKNOWN_SNIP_TYPE = "Unknown";

    public static final String DW_SNIP_EXT = "csn";
    public static final String CFE_SNIP_EXT = "xml";

    /** the treeviewer control */
    protected TreeViewer treeViewer;
    protected Text text, preview;
    protected Label previewLabel;
    protected LabelProvider labelProvider;

    /** the path to the icons. i.e. file://C/blah/plugin/icons/ */
    protected static IPath snipBase;
    /** used as a proxy action to add snips to the editor */
    private static GenericEncloserAction tmpAction;
    /** Config file is used to load simple xml documents and get to
     * simple items via DOM - not recommended for large documents
     */
    //private static XMLConfigFile xmlconfile;
    private static SnipReader snipReader;
    private String snippetType;

    MenuManager menuMgr;

    protected Action insertAction, createFolderAction, createSnippetAction, editSnippetAction,
            refreshSnippetsAction, deleteSnippetAction, deleteFolderAction;

    protected Action refreshSnipEx;
    protected Action exportToSnipEx;
    protected Action openSnipExPage;

    /** the root directory */
    protected File root;

    private CFMLPropertyManager propertyManager;

    /**
     * The constructor.
     */
    public SnipTreeView() {
        super();

        propertyManager = new CFMLPropertyManager();
        // By default we want to use cfeclipse style snippets
        snippetType = CFECLIPSE_SNIP_TYPE;

        // This ensures that we are notified when the properties are saved
        CFMLPlugin.getDefault().getPropertyStore().addPropertyChangeListener(this);

        snipBase = new Path(propertyManager.defaultSnippetsPath());

        if (tmpAction == null)
            tmpAction = new GenericEncloserAction();
        //if(xmlconfile == null)
        //   xmlconfile = new XMLConfigFile();
        if (snipReader == null)
            snipReader = new SnipReader();
    }

    /*
     * @see IWorkbenchPart#createPartControl(Composite)
     */
    public void createPartControl(Composite parent) {
        //Create a grid layout object so the text and treeviewer
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        layout.verticalSpacing = 2;
        layout.marginWidth = 0;
        layout.marginHeight = 2;
        parent.setLayout(layout);

        //Create a "label" to display information in. I'm
        //using a text field instead of a lable so you can
        //copy-paste out of it.
        text = new Text(parent, SWT.READ_ONLY | SWT.SINGLE | SWT.BORDER);
        // layout the text field above the treeviewer
        GridData layoutData = new GridData();
        layoutData.grabExcessHorizontalSpace = true;
        layoutData.horizontalAlignment = GridData.FILL;
        text.setLayoutData(layoutData);

        //Create the tree viewer as a child of the composite parent
        treeViewer = new TreeViewer(parent);
        treeViewer.setContentProvider(new SnipTreeViewContentProvider(getRootInput()));
        labelProvider = new SnipTreeViewLabelProvider();
        treeViewer.setLabelProvider(labelProvider);

        treeViewer.setUseHashlookup(true);

        //layout the tree viewer below the text field
        layoutData = new GridData();
        layoutData.grabExcessHorizontalSpace = true;
        layoutData.grabExcessVerticalSpace = true;
        layoutData.horizontalAlignment = GridData.FILL;
        layoutData.verticalAlignment = GridData.FILL;
        treeViewer.getControl().setLayoutData(layoutData);

        previewLabel = new Label(parent, SWT.WRAP);
        GridData gridData = new GridData();
        gridData.horizontalSpan = 2;
        previewLabel.setLayoutData(gridData);
        previewLabel.setText("Preview"); //$NON-NLS-1$

        preview = new Text(parent, SWT.READ_ONLY | SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        // layout the text field above the treeviewer
        layoutData = new GridData();
        layoutData.grabExcessHorizontalSpace = true;
        layoutData.heightHint = 100;
        layoutData.horizontalAlignment = GridData.FILL;
        preview.setLayoutData(layoutData);

        //Create menu, toolbars, filters
        createActions();
        createMenus();
        createToolbar();
        createContextMenu();
        hookListeners();

        treeViewer.setInput(getRootInput());
        //treeViewer.expandAll();
    }

    public static Object[] getSnipExURLs() {
        String[] prefKeys = { SnipExPreferenceConstants.P_SNIPEX_URL1, SnipExPreferenceConstants.P_SNIPEX_URL2,
                SnipExPreferenceConstants.P_SNIPEX_URL3, SnipExPreferenceConstants.P_SNIPEX_URL4,
                SnipExPreferenceConstants.P_SNIPEX_URL5, SnipExPreferenceConstants.P_SNIPEX_URL6,
                SnipExPreferenceConstants.P_SNIPEX_URL7, SnipExPreferenceConstants.P_SNIPEX_URL8 };

        Object[] snipex = new Object[0];

        CFMLPreferenceManager pm = new CFMLPreferenceManager();

        for (int i = 0; i < prefKeys.length; i++) {

            String url = pm.getStringPref(prefKeys[i]);
            if (url.trim().length() > 0) {
                try {
                    Object[] temp = new Object[1];
                    temp[0] = new SnipEx(new URL(url), false);
                    snipex = appendArrays(snipex, temp);
                } catch (MalformedURLException e) {
                    System.err.println("Snipex URL failed:" + e);
                } catch (Exception e) {
                    System.err.println("Snipex failed to load:" + e);
                }
            }
        }

        return snipex;
    }

    public static Object[] appendArrays(Object[] array1, Object[] array2) {
        Object[] newArray = new Object[array1.length + array2.length];
        System.arraycopy(array1, 0, newArray, 0, array1.length);
        System.arraycopy(array2, 0, newArray, array1.length, array2.length);
        return newArray;
    }

    /*
    public void mouseEnter(MouseEvent e) {
    //System.out.println("Mouse entered viewer");
    }
        
    public void mouseHover(MouseEvent e) {
    //System.out.println("Mouse hovered over viewer");
    }
        
    public void mouseExit(MouseEvent e) {
    //System.out.println("Mouse exited viewer");
    }
    */

    protected void hookListeners() {
        //add a selection listener so we can look at the selected file and
        //get the help information out
        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                // if the selection is empty clear the label
                if (event.getSelection().isEmpty()) {
                    text.setText("");
                    preview.setText("");
                    return;
                }

                if (event.getSelection() instanceof IStructuredSelection) {
                    IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                    StringBuffer toShow = new StringBuffer("");
                    StringBuffer toPreview = new StringBuffer("");

                    Object element = selection.getFirstElement();
                    // Clear text/preview
                    text.setText("");
                    preview.setText("");

                    if (element instanceof File) {
                        //IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection();
                        File selectedfile = (File) selection.getFirstElement();

                        if (selectedfile.isDirectory()) {
                            return;
                        }

                        //get the full path to the file
                        String f = selectedfile.getAbsolutePath();

                        try {

                            snipReader.read(f);
                            toShow.append(snipReader.getSnipDescription());
                            toPreview.append(snipReader.getSnipStartBlock() + snipReader.getSnipEndBlock());

                        } catch (Exception e) {
                            e.printStackTrace(System.err);
                        }

                        preview.setText(toPreview.toString());
                    } else if (element instanceof SnipEx) {
                        SnipEx sx = (SnipEx) element;
                        text.setText(sx.toString());
                        preview.setText(sx.getSource().toString());

                    } else if (element instanceof Library) {
                        Library lib = (Library) element;
                        text.setText(lib.getName());
                        preview.setText(lib.getDescription());

                    } else if (element instanceof Snippet) {
                        Snippet snip = (Snippet) element;
                        text.setText(snip.getDescription());
                        preview.setText(snip.getStartText() + snip.getEndText());

                    }
                }
            }
        });

        treeViewer.addDoubleClickListener(new SnipDoubleClickListener(this));
        /*
        try {
           this.getViewSite().getShell().addMouseTrackListener(this);
        }
        catch (Exception e) {
           e.printStackTrace(System.err);
        }
        */
    }

    /**
     * creates all the default actions
     */
    protected void createActions() {

        openSnipExPage = new Action("Edit SnipEx Servers",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_SNIPEX)) {
            public void run() {
                IPreferencePage page = new SnipExPreferencePage();
                PreferenceManager mgr = new PreferenceManager();
                IPreferenceNode node = new PreferenceNode("1", page);
                mgr.addToRoot(node);
                PreferenceDialog dialog = new PreferenceDialog(getSite().getShell(), mgr);
                dialog.create();
                dialog.setMessage(page.getTitle());
                dialog.open();

            }

        };

        refreshSnipEx = new Action("Refresh SnipEx Server",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_REFRESH)) {
            public void run() {

                System.out.println("Refreshing the snipex server");
            }
        };

        insertAction = new Action("Insert",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_SNIP)) {
            public void run() {
                insertItem();
            }
        };
        insertAction.setToolTipText("Insert the selected snip into the document");

        createFolderAction = new Action("Create Folder",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_PACKAGE)) {
            public void run() {
                createSnipFolder();
            }
        };
        createFolderAction.setToolTipText("Create a new snip package");

        createSnippetAction = new Action("Create Snippet",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_ADD)) {
            public void run() {
                createSnippet();
            }
        };
        createSnippetAction.setToolTipText("Create a new snip");

        editSnippetAction = new Action("Edit Snippet",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_EDIT)) {
            public void run() {
                editSnippet();
            }
        };
        editSnippetAction.setToolTipText("Edit the selected snip");

        refreshSnippetsAction = new Action("Refresh Snippets",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_REFRESH)) {
            public void run() {
                reloadSnippets();
            }
        };
        refreshSnippetsAction.setToolTipText("Refresh snip view");

        deleteSnippetAction = new Action("Delete Snippet",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_REMOVE)) {
            public void run() {
                deleteSnippet();
            }
        };
        deleteSnippetAction.setToolTipText("Delete selected snip");

        deleteFolderAction = new Action("Delete Folder",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_DELETE)) {
            public void run() {
                deleteSnipFolder();
            }
        };
        deleteFolderAction.setToolTipText("Delete selected snip package (must be empty)");

        exportToSnipEx = new Action("Export to SnipEx server",
                CFPluginImages.getImageRegistry().getDescriptor(CFPluginImages.ICON_SNIP_EXPORT)) {
            public void run() {
                IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
                File selectedfile = (File) selection.getFirstElement();

                Shell shell = getSite().getShell();
                SnippetToSnipExWizard wizard = new SnippetToSnipExWizard(selectedfile); //TODO: pass in the object we have selected

                WizardDialog dialog = new WizardDialog(shell, wizard);
                int result = dialog.open();

                //Run the wizard

            }
        };
        exportToSnipEx.setToolTipText("Export the selected snippet to a SnipX Server");
    }

    /**
     * creates all the menus
     * This is here mosly because I have found Mac users dont like to right 
     * click most of the time (ctrl+click actually)
     */
    protected void createMenus() {
        IMenuManager rootMenuManager = getViewSite().getActionBars().getMenuManager();
        rootMenuManager.add(refreshSnippetsAction);
        rootMenuManager.add(insertAction);

        rootMenuManager.add(createSnippetAction);
        rootMenuManager.add(editSnippetAction);
        rootMenuManager.add(deleteSnippetAction);

        rootMenuManager.add(createFolderAction);
        rootMenuManager.add(deleteFolderAction);
        rootMenuManager.add(openSnipExPage);
    }

    /**
     * Create context menu.
     */
    private void createContextMenu() {
        // Create menu manager.
        menuMgr = new MenuManager();
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager mgr) {
                fillContextMenu(mgr);
            }
        });

        // Create menu.
        Menu menu = menuMgr.createContextMenu(treeViewer.getControl());
        treeViewer.getControl().setMenu(menu);

        // Register menu for extension.
        getSite().registerContextMenu(menuMgr, treeViewer);
    }

    private void fillContextMenu(IMenuManager mgr) {
        File selectedFile = getSelectedFile();

        if (selectedFile.isDirectory()) {
            mgr.add(createFolderAction);
            mgr.add(createSnippetAction);
            String[] files = selectedFile.list();
            if (files.length == 0) {
                mgr.add(deleteFolderAction);
            }

        } else {
            mgr.add(insertAction);
            mgr.add(editSnippetAction);
            mgr.add(deleteSnippetAction);
            mgr.add(exportToSnipEx);
        }

        mgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
        //mgr.add(deleteItemAction);
        //mgr.add(new Separator());
        //mgr.add(selectAllAction);
    }

    /**
     * creates the toolbars
     */
    protected void createToolbar() {
        IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
        //toolbarManager.add(createSnippetAction);
        //toolbarManager.add(createFolderAction);
        toolbarManager.add(refreshSnippetsAction);
        toolbarManager.add(insertAction);

        toolbarManager.add(createSnippetAction);
        toolbarManager.add(editSnippetAction);
        toolbarManager.add(deleteSnippetAction);

        toolbarManager.add(createFolderAction);
        toolbarManager.add(deleteFolderAction);

    }

    /**
     * Gets the root directory used as the snips base
     * @return the root directory
     */
    public File getRootInput() {
        return snipBase.toFile();
    }

    /**
     * Gets the selected item parses it, and adds the defined stuff to the
     * editor
     */
    protected void insertItem() {
        //get a handle to the current editor and assign it to our temp action
        IEditorPart iep = this.getViewSite().getWorkbenchWindow().getActivePage().getActiveEditor();
        tmpAction.setActiveEditor(null, iep);

        Object element = null;
        String startBlock = null;
        String endBlock = null;

        if (treeViewer.getSelection().isEmpty()) {
            return;
        } else {
            IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
            element = (Object) selection.getFirstElement();
        }

        if (element instanceof File) {
            File selectedfile = (File) element;
            if (selectedfile.isDirectory())
                return;

            snipReader.read(selectedfile.getAbsolutePath());

            try {
                IFile activeFile = null;
                if (iep.getEditorInput() instanceof IFileEditorInput) {
                    activeFile = ((IFileEditorInput) iep.getEditorInput()).getFile();
                }

                startBlock = SnipVarParser.parse(snipReader.getSnipStartBlock(), activeFile,
                        this.getViewSite().getShell());
                endBlock = SnipVarParser.parse(snipReader.getSnipEndBlock(), activeFile,
                        this.getViewSite().getShell());

            } catch (Exception e) {
                e.printStackTrace(System.err);
            }
        } else if (element instanceof Snippet) {

            IFile activeFile = null;
            if (iep.getEditorInput() instanceof IFileEditorInput) {
                activeFile = ((IFileEditorInput) iep.getEditorInput()).getFile();
            }

            Snippet snip = (Snippet) element;
            startBlock = SnipVarParser.parse(snip.getStartText(), activeFile, this.getViewSite().getShell());
            endBlock = SnipVarParser.parse(snip.getEndText(), activeFile, this.getViewSite().getShell());
        }

        if (startBlock != null && endBlock != null) {
            tmpAction.setEnclosingStrings(startBlock, endBlock);
            tmpAction.run(null);

            //after the addition, they'll probably want to start typing
            iep.setFocus();
        }
    }

    /*
     * Returns the currently selected file or the root directory if nothing is selected
     */

    private File getSelectedFile() {
        File selectedfile = null;

        if (treeViewer.getSelection().isEmpty()) {
            selectedfile = getRootInput();
        } else {
            IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
            selectedfile = (File) selection.getFirstElement();
            treeViewer.setExpandedState(selection.getFirstElement(), true);

        }
        return selectedfile;
    }

    protected void reloadSnippets() {

        //Display a delete cache dialog
        MessageBox warndialog = new MessageBox(this.getViewSite().getShell(), SWT.ICON_WARNING | SWT.YES | SWT.NO);
        warndialog.setMessage("Also delete SnipEx cached snippets?");

        int response = warndialog.open();

        if (response == SWT.YES) {
            String dir = CFMLPlugin.getDefault().getStateLocation().toString() + "/snipex";
            File cacheFolder = new File(dir);
            if (cacheFolder.exists() && cacheFolder.isDirectory()) {
                String[] list = cacheFolder.list();
                for (int i = 0; i < list.length; i++) {
                    File cacheFile = new File(dir + File.separatorChar + list[i]);
                    boolean delete = cacheFile.delete();
                    System.out.println("deleting " + cacheFile + " " + delete);

                }

            }
        }

        treeViewer.setInput(getRootInput());
    }

    /**
     * Creates a new folder called below the currently active folder
     * If no folder is currently active it creates the folder below the root.
     * 
     */

    protected void createSnipFolder() {
        File selectedfile = getSelectedFile();

        if (!selectedfile.isDirectory()) {
            selectedfile = selectedfile.getParentFile();
        }

        SnipWriter writer = new SnipWriter(selectedfile, snippetType, snipBase);
        SnipFolderDialog folderDialog = new SnipFolderDialog(this.getViewSite().getShell(), writer,
                this.treeViewer);
        folderDialog.open();

    }

    protected void deleteSnipFolder() {
        File selectedfile = getSelectedFile();

        if (!selectedfile.isDirectory()) {
            selectedfile = selectedfile.getParentFile();
        }

        //SnipWriter writer = new SnipWriter(selectedfile,snippetType,snipBase);
        MessageBox deleteDialog = new MessageBox(this.getViewSite().getShell(), SWT.YES | SWT.NO);

        if (selectedfile.listFiles().length > 0) {
            MessageBox warndialog = new MessageBox(this.getViewSite().getShell(), SWT.ICON_WARNING);
            warndialog.setMessage("You must delete the snippets in this folder first");
        } else {

            deleteDialog.setMessage("Are you sure you want to delete this folder?");
            if (deleteDialog.open() == SWT.YES) {

                selectedfile.delete();
                reloadSnippets();
            }

        }

    }

    protected void createSnippet() {
        File selectedfile = getSelectedFile();

        if (!selectedfile.isDirectory()) {
            selectedfile = selectedfile.getParentFile();
        }
        snippetType = CFECLIPSE_SNIP_TYPE;
        SnipWriter writer = new SnipWriter(selectedfile, snippetType, snipBase);
        SnipFileDialog snippetDialog = new SnipFileDialog(this.getViewSite().getShell(), writer, this.treeViewer,
                "", "", "", "", "", false, "cfm");
        snippetDialog.open();

    }

    protected void deleteSnippet() {
        File selectedfile = getSelectedFile();

        if (selectedfile.isDirectory()) {
            return;
        }
        MessageBox deleteDialog = new MessageBox(this.getViewSite().getShell(), SWT.YES | SWT.NO);
        deleteDialog.setMessage("Are you sure you want to delete this snippet?");
        if (deleteDialog.open() == SWT.YES) {
            selectedfile.delete();
            reloadSnippets();
        }

    }

    protected void editSnippet() {
        File selectedfile = getSelectedFile();

        if (selectedfile.isDirectory()) {
            return;
        }

        File parentDirectory = selectedfile.getParentFile();

        String f = selectedfile.getAbsolutePath().toLowerCase();

        if (f.endsWith(SnipTreeView.DW_SNIP_EXT)) {
            snippetType = DREAMWEAVER_SNIP_TYPE;
        } else {
            snippetType = CFECLIPSE_SNIP_TYPE;
        }

        snipReader.read(f);

        SnipKeyCombos keyCombos = new SnipKeyCombos();

        String filepath = selectedfile.getAbsolutePath().replaceAll("\\\\", "/");
        String basePath = snipBase.toString();

        String relativePath = filepath.replaceFirst(basePath, "");

        String snippetName = selectedfile.getName().substring(0, selectedfile.getName().length() - 4);
        String snippetKeyCombo = keyCombos.getSequence(relativePath);
        String snippetDescription = snipReader.getSnipDescription();
        String snippetStartText = snipReader.getSnipStartBlock();
        String snippetEndText = snipReader.getSnipEndBlock();
        boolean isTemplate = snipReader.isFileTemplate();
        String templateExtension = snipReader.getTemplateExtension();

        SnipWriter writer = new SnipWriter(parentDirectory, snippetType, snipBase);
        SnipFileDialog snippetDialog = new SnipFileDialog(this.getViewSite().getShell(), writer, this.treeViewer,
                snippetName, snippetKeyCombo, snippetDescription, snippetStartText, snippetEndText, isTemplate,
                templateExtension);
        snippetDialog.open();

    }

    /*
     *  (non-Javadoc)
     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
     */
    public void propertyChange(PropertyChangeEvent event) {

        if (event.getProperty().equals(CFMLPreferenceConstants.P_SNIPPETS_PATH)) {
            CFMLPropertyManager propertyManager = new CFMLPropertyManager();
            snipBase = new Path(propertyManager.defaultSnippetsPath());
            treeViewer.setInput(getRootInput());

        }
    }

    /*
     * @see IWorkbenchPart#setFocus()
     */
    public void setFocus() {
        ;
    }
}