org.eclipse.buckminster.p4.ui.prefs.ClientPane.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.buckminster.p4.ui.prefs.ClientPane.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2006
 * Thomas Hallgren, Kenneth Olwing, Mitch Sonies
 * Pontus Rydin, Nils Unden, Peer Torngren
 * The code, documentation and other materials contained herein have been
 * licensed under the Eclipse Public License - v 1.0 by the individual
 * copyright holders listed above, as Initial Contributors under such license.
 * The text of such license is available at www.eclipse.org.
 *******************************************************************************/

package org.eclipse.buckminster.p4.ui.prefs;

import java.io.File;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import org.eclipse.buckminster.core.helpers.TextUtils;
import org.eclipse.buckminster.p4.preferences.Client;
import org.eclipse.buckminster.p4.preferences.DepotMapping;
import org.eclipse.buckminster.p4.ui.Messages;
import org.eclipse.buckminster.runtime.Trivial;
import org.eclipse.buckminster.ui.UiUtils;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Text;
import org.osgi.service.prefs.BackingStoreException;

/**
 * @author Thomas Hallgren
 */
public class ClientPane extends NodeListPrefPane {
    private Client m_client;

    private DepotMapping m_depotMapping;

    private Text m_clientName;

    private Text m_localRoot;

    private Button m_browse;

    private Button m_defaultClient;

    private Text m_depotMappingName;

    private Text m_depotPattern;

    private Text m_localReplacement;

    public ClientPane(PreferencePage prefPage, Composite parent) {
        super(prefPage, parent, 2);
    }

    public void init() {
        Composite clientFields = new Composite(this, SWT.NONE);
        clientFields.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        clientFields.setLayout(layout);
        m_clientName = UiUtils.createLabeledText(clientFields, Messages.name, SWT.READ_ONLY, s_tooltipRefresh);
        m_clientName.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));

        m_localRoot = UiUtils.createLabeledText(clientFields, Messages.local_root_with_colon, SWT.NONE,
                s_tooltipRefresh);
        m_localRoot.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                boolean valid = true;
                String errMsg = null;
                String dirName = ((Text) e.getSource()).getText().trim();
                if (dirName.length() > 0) {
                    File file = new File(dirName);
                    valid = file.exists();
                    if (!valid && !dirName.contains("${")) //$NON-NLS-1$
                        errMsg = dirName + Messages._does_not_exist;
                }

                PreferencePage prefPage = getPreferencePage();
                prefPage.setValid(errMsg == null);
                prefPage.setErrorMessage(errMsg);
            }
        });
        m_browse = new Button(clientFields, SWT.PUSH);
        m_browse.setText(Messages.browse_with_dots);
        m_browse.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                browseButtonPressed();
            }
        });

        m_defaultClient = new Button(clientFields, SWT.CHECK);
        m_defaultClient.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 3, 1));
        m_defaultClient.setText(Messages.this_is_the_default_client);
        m_defaultClient.setEnabled(false);
        this.createListContents(Messages.depot_mappings);

        Composite depotMappingFields = new Composite(this, SWT.NONE);
        depotMappingFields.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
        layout = new GridLayout(2, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        depotMappingFields.setLayout(layout);

        m_depotMappingName = UiUtils.createLabeledText(depotMappingFields, Messages.name, SWT.READ_ONLY, null);
        m_depotPattern = UiUtils.createLabeledText(depotMappingFields, Messages.depot_pattern_with_colon, SWT.NONE,
                new ModifyListener() {
                    public void modifyText(ModifyEvent ev) {
                        String errMsg = null;
                        String lpe = ((Text) ev.getSource()).getText().trim();
                        if (lpe.length() > 0) {
                            try {
                                Pattern.compile(lpe);
                            } catch (PatternSyntaxException e) {
                                errMsg = e.getMessage();
                            }
                        }
                        PreferencePage prefPage = getPreferencePage();
                        prefPage.setValid(errMsg == null);
                        prefPage.setErrorMessage(errMsg);
                    }
                });

        m_depotPattern.setToolTipText(
                Messages.a_regular_expression_used_when_creating_a_client_root_relative_path_that_will_be_used_for_component_materialization_based_on_the_full_depot_path_of_a_component);

        m_localReplacement = UiUtils.createLabeledText(depotMappingFields, Messages.local_replacement_with_colon,
                SWT.NONE, null);
        m_localReplacement.setToolTipText(
                Messages.the_replacement_string_used_when_creating_the_client_root_relative_path_that_will_be_used_for_component_materialization_based_on_the_full_depot_path_of_a_component);
    }

    protected void clearClient() {
        m_client = null;
        m_clientName.setText(""); //$NON-NLS-1$
        m_localRoot.setText(""); //$NON-NLS-1$
        m_defaultClient.setSelection(false);
    }

    protected void clearDepotMapping() {
        m_depotMapping = null;
        m_depotMappingName.setText(""); //$NON-NLS-1$
        m_depotPattern.setText(""); //$NON-NLS-1$
        m_localReplacement.setText(""); //$NON-NLS-1$
    }

    @Override
    protected void editNode(String node) {
        if (!this.assignClientValues())
            return;

        this.setErrorMessage(null);
        this.getPreferencePage().setValid(true);
        if (node == null)
            this.setDepotMapping(null);
        else {
            try {
                this.setDepotMapping(m_client.getDepotMapping(node));
            } catch (BackingStoreException e) {
                displayException(this.getShell(), e);
            }
        }
    }

    @Override
    protected String[] getListContents() {
        if (m_client != null) {
            try {
                return m_client.getDepotMappingNames();
            } catch (BackingStoreException e) {
                displayException(this.getShell(), e);
            }
        }
        return Trivial.EMPTY_STRING_ARRAY;
    }

    @Override
    protected boolean isNewEnabled() {
        return m_client != null;
    }

    @Override
    protected void newNode() {
        if (!this.assignClientValues())
            return;

        String depotMappingName = this.queryNodeName(Messages.add_client_depot_mapping, Messages.depot_mapping_name,
                null);
        if (depotMappingName == null)
            return;

        try {
            m_client.addDepotMapping(depotMappingName);
            this.addAndSelect(depotMappingName);
        } catch (BackingStoreException e) {
            displayException(this.getShell(), e);
            return;
        }
    }

    @Override
    protected void removeNode(String item) {
        try {
            DepotMapping depotMapping = m_client.getDepotMapping(item);
            if (depotMapping != null) {
                this.clearDepotMapping();
                depotMapping.remove();
            }
        } catch (BackingStoreException e) {
            displayException(this.getShell(), e);
        }
    }

    @Override
    protected void renameNode() {
        if (!this.assignClientValues())
            return;

        DepotMapping depotMapping = m_depotMapping;
        String oldName = depotMapping.getName();
        String newName = this.queryNodeName(Messages.rename_client_depot_mapping, Messages.depot_mapping_name,
                oldName);
        if (newName == null || newName.equals(oldName))
            return;

        try {
            this.assignRenamedDepotMapping(depotMapping.createCopy(newName));
            depotMapping.remove();
            this.updateAndSelect();
        } catch (BackingStoreException e) {
            displayException(this.getShell(), e);
            return;
        }
    }

    void assignRenamedClient(Client client) {
        m_client = client;
        if (client != null)
            m_clientName.setText(client.getName());
        this.assignRenamedDepotMapping(null);
    }

    void assignRenamedDepotMapping(DepotMapping depotMapping) {
        m_depotMapping = depotMapping;
        m_depotMappingName.setText(depotMapping == null ? "" : depotMapping.getName()); //$NON-NLS-1$
    }

    void browseButtonPressed() {
        DirectoryDialog dialog = new DirectoryDialog(this.getShell());
        dialog.setMessage(Messages.P4_client_root);

        String dirName = m_localRoot.getText();
        if (!dirName.equals("")) //$NON-NLS-1$
        {
            File path = new File(dirName);
            if (path.exists())
                dialog.setFilterPath(new Path(dirName).toOSString());
        }

        String selectedDirectory = dialog.open();
        if (selectedDirectory != null)
            m_localRoot.setText(selectedDirectory);
    }

    Client getClient() {
        return m_client;
    }

    boolean performOk() {
        if (m_depotMapping != null)
            if (!this.assignDepotMappingValues())
                return false;

        if (m_client != null)
            if (!this.assignClientValues())
                return false;

        return true;
    }

    boolean setClient(Client client) {
        boolean hasClient = (client != null);

        m_localRoot.setEnabled(hasClient);
        m_browse.setEnabled(hasClient);
        m_defaultClient.setEnabled(hasClient);

        if (hasClient) {
            if (client.equals(m_client))
                return true;
            if (!this.assignClientValues())
                return false;
            m_client = client;
            m_clientName.setText(TextUtils.notNullString(client.getName()));
            m_localRoot.setText(TextUtils.notNullString(client.getLocalRoot()));
            m_defaultClient.setSelection(client.isDefaultClient());
        } else {
            if (m_client == null)
                return true;
            this.clearClient();
        }

        this.updateList();
        return true;
    }

    boolean setDepotMapping(DepotMapping depotMapping) {
        boolean hasDepotMapping = (depotMapping != null);
        m_depotPattern.setEnabled(hasDepotMapping);
        m_localReplacement.setEnabled(hasDepotMapping);

        if (hasDepotMapping) {
            if (depotMapping.equals(m_depotMapping))
                return true;
            if (!this.assignDepotMappingValues())
                return false;
            m_depotMapping = depotMapping;
            m_depotMappingName.setText(depotMapping.getName());
            m_depotPattern.setText(TextUtils.notNullString(depotMapping.getDepotPattern()));
            m_localReplacement.setText(TextUtils.notNullString(depotMapping.getLocalReplacement()));
        } else {
            if (m_depotMapping == null)
                return true;
            this.clearDepotMapping();
        }
        this.selectionChanged();
        return true;
    }

    private boolean assignClientValues() {
        if (m_client == null)
            return true;

        m_client.setLocalRoot(UiUtils.trimmedValue(m_localRoot));
        if (m_defaultClient.getSelection())
            m_client.setAsDefault();
        return true;
    }

    private boolean assignDepotMappingValues() {
        if (m_depotMapping == null)
            return true;

        String tmp = UiUtils.trimmedValue(m_depotPattern);
        if (tmp != null) {
            if (tmp.charAt(0) != '^')
                tmp = '^' + tmp;
            if (tmp.charAt(tmp.length() - 1) != '$')
                tmp = tmp + '$';
            m_depotMapping.setDepotPattern(Pattern.compile(tmp));
        } else
            m_depotMapping.setDepotPattern(null);

        m_depotMapping.setLocalReplacement(UiUtils.trimmedValue(m_localReplacement));
        return true;
    }
}