net.sourceforge.eclipseccase.ui.preferences.DiffMergePreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.eclipseccase.ui.preferences.DiffMergePreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2012 eclipse-ccase.sourceforge.net.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 *
 * Contributors:
 *     eraonel - inital API and implementation
 *     IBM Corporation - concepts and ideas from Eclipse
 *******************************************************************************/
package net.sourceforge.eclipseccase.ui.preferences;

import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.util.IPropertyChangeListener;
import net.sourceforge.eclipseccase.ClearCasePreferences;
import org.eclipse.jface.dialogs.MessageDialog;
import net.sourceforge.eclipseccase.diff.PreferenceHelper;
import java.text.Collator;
import java.util.*;
import net.sourceforge.eclipseccase.ClearCasePlugin;
import net.sourceforge.eclipseccase.IClearCasePreferenceConstants;
import org.eclipse.jface.preference.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

/**
 * @author eraonel
 *
 */
/**
 * The main preference page for the Eclipse ClearCase integration.
 */
public class DiffMergePreferencePage extends PreferencePage
        implements IWorkbenchPreferencePage, IClearCasePreferenceConstants {
    private String selectedDiffTool = "";// Initial value.

    private String selectedMergeTool = "";

    private static Map<String, String> toolPathMap = new LinkedHashMap<String, String>();

    private static Map<String, String> mergeToolPathMap = new LinkedHashMap<String, String>();

    private BooleanFieldEditor useExternal;

    private BooleanFieldEditor useExternalMerge;

    private ComboViewer comboViewer;

    private ComboViewer mergeComboViewer;

    private Text execPath;

    private Text mergeExecPath;

    private static final int SPAN = 1;

    public static final String TOOL_IBM = "ibm";

    public static final String TOOL_KDIFF = "kdiff3";

    public static final String TOOL_BEYONDCOMPARE = "beyond compare";

    /**
     * Creates a new instance.
     */
    public DiffMergePreferencePage() {
        setDescription(PreferenceMessages.getString("DiffMergePreferencePage.Description")); //$NON-NLS-1$
        // Set the preference store for the preference page.
        setPreferenceStore(new ClearCasePreferenceStore());
    }

    @Override
    protected Control createContents(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        useExternal = new BooleanFieldEditor(COMPARE_EXTERNAL,
                PreferenceMessages.getString("Preferences.General.CompareWithExternalTool"), //$NON-NLS-1$
                composite);

        // Handle change diff ext&int
        useExternal.setPropertyChangeListener(new IPropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent event) {
                if ((Boolean) event.getNewValue() == true && selectedDiffTool.equals(TOOL_IBM)) {
                    execPath.setEnabled(false);
                } else if ((Boolean) event.getNewValue() == false) {
                    execPath.setEnabled(false);
                } else {
                    execPath.setEnabled(true);
                }
            }
        });
        addFieldEditor(useExternal);

        // Diff Group
        Group groupDiff = new Group(composite, SWT.NULL);
        GridLayout layoutDiff = new GridLayout();
        layoutDiff.numColumns = 1;
        groupDiff.setLayout(layoutDiff);
        GridData dataDiff = new GridData();
        dataDiff.horizontalAlignment = GridData.FILL;
        groupDiff.setLayoutData(dataDiff);
        groupDiff.setText("External Diff tool settings:");
        comboViewer = new ComboViewer(groupDiff);
        Combo combo = comboViewer.getCombo();
        combo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
        comboViewer.setContentProvider(new IStructuredContentProvider() {
            String[] vals;

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                vals = (String[]) newInput;
            }

            public Object[] getElements(Object inputElement) {
                return vals;
            }
        });
        // This is called when I select the page.
        comboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent evt) {
                ISelection selection = evt.getSelection();
                if (selection instanceof StructuredSelection) {
                    StructuredSelection sel = (StructuredSelection) selection;
                    if (!selection.isEmpty()) {
                        selectedDiffTool = sel.getFirstElement().toString();
                        if (selectedDiffTool.equals(TOOL_IBM)) {
                            // Sine we already have cleartool path no need to
                            // input.
                            execPath.setEnabled(false);
                        } else if (useExternal.getBooleanValue() == false) {
                            // When we use no
                            execPath.setEnabled(false);
                        } else {
                            execPath.setEnabled(true);
                        }

                    }

                    // set matching execPath
                    if (selectedDiffTool != null & execPath != null) {
                        toolPathMap = PreferenceHelper.strToMap(getPreferenceStore()
                                .getString(IClearCasePreferenceConstants.EXTERNAL_DIFF_TOOL_EXEC_PATH));
                        execPath.setText(PreferenceHelper.getExecPath(selectedDiffTool, toolPathMap));
                    }
                }
            }
        });
        createLabel(groupDiff, PreferenceMessages.getString("DiffMergePreferencePage.External.Diff.Tool.ExecPath"), //$NON-NLS-1$
                SPAN);
        execPath = new Text(groupDiff, SWT.BORDER);
        execPath.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        useExternalMerge = new BooleanFieldEditor(MERGE_EXTERNAL,
                PreferenceMessages.getString("Preferences.General.MergeWithExternalTool"), //$NON-NLS-1$
                composite);
        // Handle change diff ext&int
        useExternalMerge.setPropertyChangeListener(new IPropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent event) {
                if ((Boolean) event.getNewValue() == true && selectedMergeTool.equals(TOOL_IBM)) {
                    mergeExecPath.setEnabled(false);
                } else if ((Boolean) event.getNewValue() == false) {
                    mergeExecPath.setEnabled(false);
                } else {
                    mergeExecPath.setEnabled(true);
                }
            }
        });
        addFieldEditor(useExternalMerge);

        // Merge Group
        Group mergeGroup = new Group(composite, SWT.NULL);
        GridLayout diffLayout = new GridLayout();
        diffLayout.numColumns = 1;
        mergeGroup.setLayout(diffLayout);
        GridData mergeData = new GridData();
        dataDiff.horizontalAlignment = GridData.FILL;
        mergeGroup.setLayoutData(mergeData);
        mergeGroup.setText("External Merge Tool Settings:");
        mergeComboViewer = new ComboViewer(mergeGroup);
        Combo mergeCombo = mergeComboViewer.getCombo();
        mergeCombo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
        mergeComboViewer.setContentProvider(new IStructuredContentProvider() {
            String[] vals;

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                vals = (String[]) newInput;
            }

            public Object[] getElements(Object inputElement) {
                return vals;
            }
        });

        mergeComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent evt) {

                ISelection selection = evt.getSelection();
                if (selection instanceof StructuredSelection) {
                    StructuredSelection sel = (StructuredSelection) selection;
                    if (useExternalMerge.getBooleanValue() == false)
                        return;// this overrides
                    if (!selection.isEmpty()) {

                        selectedMergeTool = sel.getFirstElement().toString();

                        if (selectedMergeTool.equals(TOOL_IBM)) {
                            // Sine we already have cleartool path no need to
                            // input.
                            mergeExecPath.setEnabled(false);
                        } else if (useExternalMerge.getBooleanValue() == false) {
                            // When we use no
                            mergeExecPath.setEnabled(false);
                        } else {
                            mergeExecPath.setEnabled(true);
                        }
                    }

                    // set matching execPath
                    if (selectedMergeTool != null & mergeExecPath != null) {
                        mergeToolPathMap = PreferenceHelper.strToMap(getPreferenceStore()
                                .getString(IClearCasePreferenceConstants.EXTERNAL_MERGE_TOOL_EXEC_PATH));
                        mergeExecPath.setText(PreferenceHelper.getExecPath(selectedMergeTool, mergeToolPathMap));
                    }

                }
            }
        });

        createLabel(mergeGroup,
                PreferenceMessages.getString("DiffMergePreferencePage.External.Merge.Tool.ExecPath"), SPAN); //$NON-NLS-1$
        mergeExecPath = new Text(mergeGroup, SWT.BORDER);
        mergeExecPath.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        initializeValues();
        return parent;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    public void init(IWorkbench workbench) {
        // ignore
    }

    /**
     * Initializes values for non-FieldEditors.
     */
    private void initializeValues() {
        final IPreferenceStore store = getPreferenceStore();
        selectedDiffTool = store.getString(IClearCasePreferenceConstants.EXTERNAL_DIFF_TOOL);
        selectedMergeTool = store.getString(IClearCasePreferenceConstants.EXTERNAL_MERGE_TOOL);
        ArrayList<String> tools = new ArrayList<String>();
        tools.add(TOOL_IBM);
        tools.add(TOOL_KDIFF);
        tools.add(TOOL_BEYONDCOMPARE);
        Collator collator = Collator.getInstance();
        collator.setStrength(Collator.PRIMARY);
        Collections.sort(tools, collator);
        // Diff
        comboViewer.setInput(tools.toArray(new String[tools.size()]));
        comboViewer.reveal(selectedDiffTool);
        comboViewer.setSelection(new StructuredSelection(selectedDiffTool), true);

        if (useExternal.getBooleanValue() == false) {
            execPath.setEnabled(false);
        }

        // Merge
        mergeComboViewer.setInput(tools.toArray(new String[tools.size()]));
        mergeComboViewer.reveal(selectedMergeTool);
        mergeComboViewer.setSelection(new StructuredSelection(selectedMergeTool), true);

        if (useExternalMerge.getBooleanValue() == false) {
            mergeExecPath.setEnabled(false);
        }

    }

    // Needs to be done for each fieldeditor.
    private void addFieldEditor(FieldEditor fieldEditor) {
        fieldEditor.setPreferencePage(this);
        fieldEditor.setPreferenceStore(getPreferenceStore());
        fieldEditor.load();
    }

    /**
     * creates a label
     */
    private Label createLabel(Composite parent, String text, int span) {
        Label label = new Label(parent, SWT.LEFT);
        label.setText(text);
        GridData data = new GridData();
        data.horizontalSpan = span;
        data.horizontalAlignment = GridData.FILL;
        label.setLayoutData(data);
        return label;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.IPreferencePage#performOk()
     */
    @Override
    public boolean performOk() {
        /** Diff */
        useExternal.store();
        if (!selectedDiffTool.equals("")) {
            getPreferenceStore().setValue(IClearCasePreferenceConstants.EXTERNAL_DIFF_TOOL, selectedDiffTool);
            // check if
            if (isExecPathEmpty(execPath, selectedDiffTool)) {
                return false;
            }
            cache(execPath, selectedDiffTool, toolPathMap);
            // now store it.
            storePref(IClearCasePreferenceConstants.EXTERNAL_DIFF_TOOL_EXEC_PATH,
                    PreferenceHelper.mapToStr(toolPathMap));

        }

        /** Merge */
        useExternalMerge.store();

        if (!selectedMergeTool.equals("")) {
            getPreferenceStore().setValue(IClearCasePreferenceConstants.EXTERNAL_MERGE_TOOL, selectedMergeTool);
            // check if
            if (isExecPathEmpty(mergeExecPath, selectedMergeTool)) {
                return false;
            }
        }

        cache(mergeExecPath, selectedMergeTool, mergeToolPathMap);
        // now store it.
        storePref(IClearCasePreferenceConstants.EXTERNAL_MERGE_TOOL_EXEC_PATH,
                PreferenceHelper.mapToStr(mergeToolPathMap));

        if (super.performOk()) {
            ClearCasePlugin.getDefault().resetClearCase();
            return true;
        }
        return false;
    }

    private void storePref(String name, String value) {
        getPreferenceStore().setValue(name, value);
    }

    /**
     * Check if exec path is empty when a external tool is selected.
     * 
     * @param path
     * @param selected
     * @return true if empty
     */
    private boolean isExecPathEmpty(Text path, String selected) {
        if (path.getText().equals("") && !selected.equals(TOOL_IBM) && ClearCasePreferences.isCompareExternal()) {
            MessageDialog.openError(getShell(), PreferenceMessages.getString("DiffMergePreferencePage.error.title"), //$NON-NLS-1$
                    PreferenceMessages.getString(("DiffMergePreferencePage.error.noPath"))); //$NON-NLS-1$
            path.setFocus();
            return true;
        }

        return false;

    }

    /**
     * check if same values are already in cache map.
     * 
     * @param path
     * @param selected
     * @param map
     */
    private void cache(Text path, String selected, Map<String, String> map) {
        // check if same values are already in map.
        if (map.containsKey(selected)) {
            String storedPath = map.get(selected);
            // we have the key check value.
            if (!storedPath.equals(path.getText())) {
                // value is not the same. Update it.
                map.put(selected, path.getText());
            }
        } else {
            // No key value at all. Add it!
            map.put(selected, path.getText());
        }
    }

}