com.archimatetool.templates.dialog.TemplateManagerDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.archimatetool.templates.dialog.TemplateManagerDialog.java

Source

/**
 * This program and the accompanying materials
 * are made available under the terms of the License
 * which accompanies this distribution in the file LICENSE.txt
 */
package com.archimatetool.templates.dialog;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
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.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;

import com.archimatetool.editor.ui.IArchimateImages;
import com.archimatetool.editor.ui.UIUtils;
import com.archimatetool.editor.ui.components.ExtendedTitleAreaDialog;
import com.archimatetool.editor.utils.StringUtils;
import com.archimatetool.templates.model.ITemplate;
import com.archimatetool.templates.model.ITemplateGroup;
import com.archimatetool.templates.model.TemplateGroup;
import com.archimatetool.templates.model.TemplateManager;

/**
 * Template Manager Dialog
 * 
 * @author Phillip Beauvoir
 */
public class TemplateManagerDialog extends ExtendedTitleAreaDialog {

    private static String HELP_ID = "com.archimatetool.help.TemplateManagerDialog"; //$NON-NLS-1$

    protected TemplatesTableViewer fTableViewer;
    protected TemplatesTreeViewer fTreeViewer;

    protected Button fButtonAddTemplate;
    protected Button fButtonNewGroup;
    protected Button fButtonRemove;

    protected Label fFileLabel;
    protected Label fNameLabel;
    protected Label fDescriptionLabel;
    protected Text fFileTextField;
    protected Text fNameTextField;
    protected Text fDescriptionTextField;

    protected Object fSelectedControl;
    protected ITemplate fSelectedTemplate;
    protected ITemplateGroup fSelectedTemplateGroup;

    protected List<ITemplate> fModifiedTemplates = new ArrayList<ITemplate>();

    protected TemplateManager fTemplateManager;

    protected boolean fIsSettingFields;

    public TemplateManagerDialog(Shell parentShell, TemplateManager templateManager) {
        super(parentShell, "TemplateManagerDialog"); //$NON-NLS-1$
        setTitleImage(IArchimateImages.ImageFactory.getImage(IArchimateImages.ECLIPSE_IMAGE_NEW_WIZARD));
        setShellStyle(getShellStyle() | SWT.RESIZE);

        fTemplateManager = templateManager;
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(Messages.TemplateManagerDialog_1);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        // Help
        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, getHelpID());

        setTitle(Messages.TemplateManagerDialog_2);
        setMessage(Messages.TemplateManagerDialog_3);
        Composite composite = (Composite) super.createDialogArea(parent);

        Composite client = new Composite(composite, SWT.NULL);
        GridLayout layout = new GridLayout(2, false);
        client.setLayout(layout);
        client.setLayoutData(new GridData(GridData.FILL_BOTH));

        SashForm sash = new SashForm(client, SWT.HORIZONTAL);
        sash.setLayoutData(new GridData(GridData.FILL_BOTH));
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 580;
        gd.heightHint = 300;
        sash.setLayoutData(gd);

        // Templates Table
        Composite tableComp = new Composite(sash, SWT.BORDER);
        layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        tableComp.setLayout(layout);

        CLabel label = new CLabel(tableComp, SWT.NULL);
        label.setText(Messages.TemplateManagerDialog_4);

        Composite tableComp2 = new Composite(tableComp, SWT.NULL);
        tableComp2.setLayout(new TableColumnLayout());
        tableComp2.setLayoutData(new GridData(GridData.FILL_BOTH));
        fTableViewer = new TemplatesTableViewer(tableComp2, SWT.MULTI);
        fTableViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
        fTableViewer.setInput(fTemplateManager.getUserTemplates());
        fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
                fSelectedControl = fTableViewer;
                updateControls(o);
            }
        });

        // Groups Tree
        Composite treeComp = new Composite(sash, SWT.BORDER);
        layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        treeComp.setLayout(layout);

        label = new CLabel(treeComp, SWT.NULL);
        label.setText(Messages.TemplateManagerDialog_5);
        //label.setImage(IArchimateImages.ImageFactory.getImage(ImageFactory.ECLIPSE_IMAGE_FOLDER));

        fTreeViewer = new TemplatesTreeViewer(treeComp, SWT.MULTI);
        fTreeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
        fTreeViewer.setInput(fTemplateManager.getUserTemplateGroups());
        fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
                fSelectedControl = fTreeViewer;
                updateControls(o);
            }
        });

        new TemplateManagerDialogDragDropHandler(fTableViewer, fTreeViewer);

        // Buttons
        Composite buttonBar = new Composite(client, SWT.NULL);
        layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        buttonBar.setLayout(layout);
        buttonBar.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));

        fButtonAddTemplate = new Button(buttonBar, SWT.NULL);
        fButtonAddTemplate.setText(Messages.TemplateManagerDialog_6);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        fButtonAddTemplate.setLayoutData(gd);
        fButtonAddTemplate.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                openTemplate();
            }
        });

        fButtonNewGroup = new Button(buttonBar, SWT.NULL);
        fButtonNewGroup.setText(Messages.TemplateManagerDialog_7);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        fButtonNewGroup.setLayoutData(gd);
        fButtonNewGroup.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                newGroup();
            }
        });

        fButtonRemove = new Button(buttonBar, SWT.NULL);
        fButtonRemove.setText(Messages.TemplateManagerDialog_8);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        fButtonRemove.setLayoutData(gd);
        fButtonRemove.setEnabled(false);
        fButtonRemove.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                deleteSelectedObjects();
            }
        });

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

        Composite fieldContainer = new Composite(composite, SWT.NULL);
        layout = new GridLayout(2, false);
        fieldContainer.setLayout(layout);
        fieldContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        fNameLabel = new Label(fieldContainer, SWT.NULL);
        fNameLabel.setText(Messages.TemplateManagerDialog_9);
        fNameLabel.setEnabled(false);

        fNameTextField = new Text(fieldContainer, SWT.BORDER | SWT.SINGLE);
        fNameTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fNameTextField.setEnabled(false);
        // Single text control so strip CRLFs
        UIUtils.conformSingleTextControl(fNameTextField);

        fNameTextField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                String text = fNameTextField.getText();
                if (fIsSettingFields || !StringUtils.isSet(text)) {
                    return;
                }

                // Edit Template name
                if (fSelectedTemplate != null) {
                    fSelectedTemplate.setName(text);
                    if (!fModifiedTemplates.contains(fSelectedTemplate)) {
                        fModifiedTemplates.add(fSelectedTemplate);
                    }
                    fTableViewer.refresh();
                    fTreeViewer.refresh();
                }
                // Edit Group name
                else if (fSelectedTemplateGroup != null) {
                    fSelectedTemplateGroup.setName(text);
                    fTreeViewer.refresh();
                }
            }
        });

        fDescriptionLabel = new Label(fieldContainer, SWT.NULL);
        fDescriptionLabel.setText(Messages.TemplateManagerDialog_10);
        fDescriptionLabel.setEnabled(false);

        fDescriptionTextField = new Text(fieldContainer, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
        fDescriptionTextField.setEnabled(false);
        gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 100;
        fDescriptionTextField.setLayoutData(gd);
        fDescriptionTextField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                String text = fDescriptionTextField.getText();
                if (fIsSettingFields || !StringUtils.isSet(text)) {
                    return;
                }
                if (fSelectedTemplate != null) {
                    fSelectedTemplate.setDescription(fDescriptionTextField.getText());
                    if (!fModifiedTemplates.contains(fSelectedTemplate)) {
                        fModifiedTemplates.add(fSelectedTemplate);
                    }
                }
            }
        });

        fFileLabel = new Label(fieldContainer, SWT.NULL);
        fFileLabel.setText(Messages.TemplateManagerDialog_11);
        fFileLabel.setEnabled(false);

        fFileTextField = new Text(fieldContainer, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
        fFileTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fFileTextField.setEnabled(false);

        return composite;
    }

    @Override
    protected void okPressed() {
        super.okPressed();

        BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
            @Override
            public void run() {
                try {
                    // Save main manifest
                    fTemplateManager.saveUserTemplatesManifest();

                    // Save changes
                    for (ITemplate template : fModifiedTemplates) {
                        template.save();
                    }

                    // Dispose
                    fTemplateManager.dispose();
                } catch (IOException ex) {
                    ex.printStackTrace();
                    MessageDialog.openError(null, Messages.TemplateManagerDialog_12, ex.getMessage());
                }
            }
        });
    }

    @Override
    protected void cancelPressed() {
        fTemplateManager.dispose();
        super.cancelPressed();
    }

    /**
     * Add a Template file
     */
    protected void openTemplate() {
        FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
        dialog.setText(Messages.TemplateManagerDialog_13);
        dialog.setFilterExtensions(new String[] { "*" + fTemplateManager.getTemplateFileExtension(), "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
        String path = dialog.open();
        if (path == null) {
            return;
        }

        final File file = new File(path);

        if (hasUserTemplate(file)) {
            MessageDialog.openInformation(getShell(), Messages.TemplateManagerDialog_16,
                    Messages.TemplateManagerDialog_17);
            return;
        }

        BusyIndicator.showWhile(null, new Runnable() {
            @Override
            public void run() {
                try {
                    ITemplate template = fTemplateManager.createTemplate(file);
                    template.setFile(file);
                    fTemplateManager.addUserTemplate(template);
                    fTableViewer.refresh();
                } catch (IOException ex) {
                    MessageDialog.openError(getShell(), Messages.TemplateManagerDialog_18, ex.getMessage());
                }
            }
        });
    }

    /**
     * Add a new group
     */
    protected void newGroup() {
        IInputValidator validator = new IInputValidator() {
            @Override
            public String isValid(String newText) {
                return "".equals(newText) ? "" : hasGroup(newText) ? Messages.TemplateManagerDialog_21 : null; //$NON-NLS-1$ //$NON-NLS-2$
            }

            boolean hasGroup(String name) {
                for (ITemplateGroup group : fTemplateManager.getUserTemplateGroups()) {
                    if (name.equals(group.getName())) {
                        return true;
                    }
                }
                return false;
            }
        };

        InputDialog dialog = new InputDialog(getShell(), Messages.TemplateManagerDialog_22,
                Messages.TemplateManagerDialog_23, "", //$NON-NLS-1$
                validator);

        if (dialog.open() == Window.OK) {
            String name = dialog.getValue();
            if (StringUtils.isSetAfterTrim(name)) {
                ITemplateGroup group = new TemplateGroup(name);
                fTemplateManager.getUserTemplateGroups().add(group);
                fTreeViewer.refresh();
                fTreeViewer.setSelection(new StructuredSelection(group), true);
            }
        }
    }

    /**
     * Remove selected object
     */
    protected void deleteSelectedObjects() {
        // Table
        if (fSelectedControl == fTableViewer) {
            for (Object o : ((IStructuredSelection) fTableViewer.getSelection()).toArray()) {
                if (o instanceof ITemplate) {
                    fTemplateManager.getUserTemplates().remove(o);
                    for (ITemplateGroup group : fTemplateManager.getUserTemplateGroups()) {
                        group.removeTemplate((ITemplate) o);
                    }
                }
            }
            fTableViewer.refresh();
            fTreeViewer.refresh();
        }
        // Tree
        else if (fSelectedControl == fTreeViewer) {
            // Do it this way because we can't get template parents
            for (TreeItem item : fTreeViewer.getTree().getSelection()) {
                if (item.getData() instanceof ITemplate) {
                    ITemplate template = (ITemplate) item.getData();
                    TreeItem parent = item.getParentItem();
                    if (parent.getData() instanceof ITemplateGroup) {
                        ((ITemplateGroup) parent.getData()).removeTemplate(template);
                    }
                } else if (item.getData() instanceof ITemplateGroup) {
                    fTemplateManager.getUserTemplateGroups().remove(item.getData());
                }
            }
            fTreeViewer.refresh();
        }
    }

    protected void updateControls(Object o) {
        fIsSettingFields = true;

        // Labels
        fNameLabel.setEnabled(o instanceof ITemplate || o instanceof ITemplateGroup);
        fDescriptionLabel.setEnabled(o instanceof ITemplate);
        fFileLabel.setEnabled(o instanceof ITemplate);

        // Fields
        fNameTextField.setText(""); //$NON-NLS-1$
        fDescriptionTextField.setText(""); //$NON-NLS-1$
        fFileTextField.setText(""); //$NON-NLS-1$

        fNameTextField.setEnabled(o instanceof ITemplate || o instanceof ITemplateGroup);
        fDescriptionTextField.setEnabled(o instanceof ITemplate);

        // Buttons
        fButtonRemove.setEnabled(o instanceof ITemplate || o instanceof ITemplateGroup);

        if (o instanceof ITemplate) {
            fSelectedTemplate = (ITemplate) o;
            fSelectedTemplateGroup = null;
            fNameTextField.setText(StringUtils.safeString(fSelectedTemplate.getName()));
            fDescriptionTextField.setText(StringUtils.safeString(fSelectedTemplate.getDescription()));
            fFileTextField.setText(StringUtils.safeString(fSelectedTemplate.getFile().getAbsolutePath()));
        } else if (o instanceof ITemplateGroup) {
            fSelectedTemplate = null;
            fSelectedTemplateGroup = (ITemplateGroup) o;
            fNameTextField.setText(StringUtils.safeString(fSelectedTemplateGroup.getName()));
        }

        fIsSettingFields = false;
    }

    /**
     * @return true if there is already a user template with file
     */
    protected boolean hasUserTemplate(File file) {
        if (file == null) {
            return false;
        }

        for (ITemplate template : fTemplateManager.getUserTemplates()) {
            if (file.equals(template.getFile())) {
                return true;
            }
        }

        return false;
    }

    protected String getHelpID() {
        return HELP_ID;
    }
}