| package org.eclipse.team.internal.ccvs.ui; |
| |
| /* |
| * (c) Copyright IBM Corp. 2000, 2002. |
| * All Rights Reserved. |
| */ |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jface.preference.PreferencePage; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| 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.Event; |
| import org.eclipse.swt.widgets.Group; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Listener; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.team.internal.ccvs.core.CVSException; |
| import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; |
| import org.eclipse.team.internal.ccvs.core.client.Command; |
| import org.eclipse.team.internal.ccvs.core.client.Command.KSubstOption; |
| import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.IWorkbenchPreferencePage; |
| import org.eclipse.ui.dialogs.ListSelectionDialog; |
| |
| public class CVSDecoratorPreferencesPage extends PreferencePage implements IWorkbenchPreferencePage { |
| |
| private Button imageShowDirty; |
| private Button imageShowHasRemote; |
| private Button imageShowAdded; |
| |
| private Text fileTextFormat; |
| private Text fileTextFormatExample; |
| |
| private Text folderTextFormat; |
| private Text folderTextFormatExample; |
| |
| private Text projectTextFormat; |
| private Text projectTextFormatExample; |
| |
| private Text dirtyFlag; |
| private Text addedFlag; |
| |
| private Button showDirty; |
| |
| class StringPair { |
| String s1; |
| String s2; |
| } |
| |
| class TextPair { |
| TextPair(Text t1, Text t2) { |
| this.t1 = t1; |
| this.t2 = t2; |
| } |
| Text t1; |
| Text t2; |
| } |
| |
| protected TextPair createFormatEditorControl(Composite composite, String title, String buttonText, final Map supportedBindings) { |
| createLabel(composite, title, 1); |
| Text format = new Text(composite, SWT.BORDER); |
| format.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| format.addModifyListener(new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| updateExamples(); |
| } |
| }); |
| Button b = new Button(composite, SWT.NONE); |
| b.setText(buttonText); |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| data.heightHint = convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT); |
| int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); |
| data.widthHint = Math.max(widthHint, b.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); |
| b.setLayoutData(data); |
| final Text formatToInsert = format; |
| b.addListener(SWT.Selection, new Listener() { |
| public void handleEvent (Event event) { |
| addVariables(formatToInsert, supportedBindings); |
| } |
| }); |
| |
| createLabel(composite, Policy.bind("Example__1"), 1); //$NON-NLS-1$ |
| Text example = new Text(composite, SWT.BORDER); |
| example.setEditable(false); |
| example.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| createLabel(composite, "", 1); // spacer //$NON-NLS-1$ |
| return new TextPair(format, example); |
| } |
| |
| protected void updateExamples() { |
| String example = ""; //$NON-NLS-1$ |
| Map bindings = new HashMap(); |
| try { |
| ICVSRepositoryLocation location = CVSRepositoryLocation.fromString(":pserver:username@host.acme.org:/home/cvsroot"); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.RESOURCE_TAG, "v2_0"); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.FILE_KEYWORD, |
| Command.KSUBST_TEXT.getShortDisplayText()); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.FILE_REVISION, "1.34"); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.DIRTY_FLAG, dirtyFlag.getText()); |
| bindings.put(CVSDecoratorConfiguration.ADDED_FLAG, addedFlag.getText()); |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_HOST, location.getHost()); |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_METHOD, location.getMethod().getName()); |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_USER, location.getUsername()); |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_ROOT, location.getRootDirectory()); |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_REPOSITORY, "org.eclipse.project1"); //$NON-NLS-1$ |
| } catch(CVSException e) { |
| example = e.getMessage(); |
| } |
| bindings.put(CVSDecoratorConfiguration.RESOURCE_NAME, "file.txt"); //$NON-NLS-1$ |
| setTextFormatExample(bindings); |
| bindings.remove(CVSDecoratorConfiguration.RESOURCE_NAME); |
| bindings.put(CVSDecoratorConfiguration.RESOURCE_NAME, "folder"); //$NON-NLS-1$ |
| setFolderFormatExample(bindings); |
| bindings.remove(CVSDecoratorConfiguration.RESOURCE_NAME); |
| bindings.put(CVSDecoratorConfiguration.RESOURCE_NAME, "Project"); //$NON-NLS-1$ |
| setProjectFormatExample(bindings); |
| } |
| |
| /** |
| * @see PreferencePage#createContents(Composite) |
| */ |
| protected Control createContents(Composite parent) { |
| Composite composite = new Composite(parent, SWT.NULL); |
| GridLayout layout= new GridLayout(); |
| layout.marginHeight = 0; |
| layout.marginWidth = 0; |
| composite.setLayout(layout); |
| composite.setLayoutData(new GridData()); |
| |
| // file text decoration options |
| |
| Group fileTextGroup = new Group(composite, SWT.NULL); |
| layout = new GridLayout(); |
| layout.numColumns = 3; |
| fileTextGroup.setLayout(layout); |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| fileTextGroup.setLayoutData(data); |
| fileTextGroup.setText(Policy.bind("Text_Labels_12")); //$NON-NLS-1$ |
| createLabel(fileTextGroup, Policy.bind("Select_the_format_for_file,_folders,_and_project_text_labels__13"), 3); //$NON-NLS-1$ |
| |
| TextPair format = createFormatEditorControl(fileTextGroup, Policy.bind("&File_Format__14"), Policy.bind("Add_&Variables_15"), getFileBindingDescriptions()); //$NON-NLS-1$ //$NON-NLS-2$ |
| fileTextFormat = format.t1; |
| fileTextFormatExample = format.t2; |
| format = createFormatEditorControl(fileTextGroup, Policy.bind("F&older_Format__16"), Policy.bind("Add_Varia&bles_17"), getFolderBindingDescriptions()); //$NON-NLS-1$ //$NON-NLS-2$ |
| folderTextFormat = format.t1; |
| folderTextFormatExample = format.t2; |
| format = createFormatEditorControl(fileTextGroup, Policy.bind("&Project_Format__18"), Policy.bind("Add_Variable&s_19"), getFolderBindingDescriptions()); //$NON-NLS-1$ //$NON-NLS-2$ |
| projectTextFormat = format.t1; |
| projectTextFormatExample = format.t2; |
| |
| createLabel(fileTextGroup, Policy.bind("&Label_decoration_for_outgoing__20"), 1); //$NON-NLS-1$ |
| dirtyFlag = new Text(fileTextGroup, SWT.BORDER); |
| dirtyFlag.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| dirtyFlag.addModifyListener(new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| updateExamples(); |
| } |
| }); |
| createLabel(fileTextGroup, "", 1); // spacer //$NON-NLS-1$ |
| |
| createLabel(fileTextGroup, Policy.bind("Label_decorat&ion_for_added__22"), 1); //$NON-NLS-1$ |
| addedFlag = new Text(fileTextGroup, SWT.BORDER); |
| addedFlag.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| addedFlag.addModifyListener(new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| updateExamples(); |
| } |
| }); |
| |
| createLabel(fileTextGroup, "", 1); // spacer //$NON-NLS-1$ |
| |
| // image decoration options |
| |
| Group imageGroup = new Group(composite, SWT.NULL); |
| layout = new GridLayout(); |
| imageGroup.setLayout(layout); |
| data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| imageGroup.setLayoutData(data); |
| imageGroup.setText(Policy.bind("Icon_Overlays_24")); //$NON-NLS-1$ |
| imageShowDirty = createCheckBox(imageGroup, Policy.bind("Sho&w_outgoing_25")); //$NON-NLS-1$ |
| imageShowHasRemote = createCheckBox(imageGroup, Policy.bind("Show_has_&remote_26")); //$NON-NLS-1$ |
| imageShowAdded = createCheckBox(imageGroup, Policy.bind("S&how_is_added_27")); //$NON-NLS-1$ |
| |
| showDirty = createCheckBox(composite, Policy.bind("&Compute_deep_outgoing_state_for_folders_(disabling_this_will_improve_decorator_performance)_28")); //$NON-NLS-1$ |
| |
| initializeValues(); |
| return composite; |
| } |
| |
| 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; |
| } |
| |
| private Button createCheckBox(Composite group, String label) { |
| Button button = new Button(group, SWT.CHECK); |
| button.setText(label); |
| return button; |
| } |
| |
| protected void setTextFormatExample(Map bindings) { |
| String example = CVSDecoratorConfiguration.bind(fileTextFormat.getText(), bindings); |
| fileTextFormatExample.setText(example); |
| } |
| |
| protected void setFolderFormatExample(Map bindings) { |
| String example = CVSDecoratorConfiguration.bind(folderTextFormat.getText(), bindings); |
| folderTextFormatExample.setText(example); |
| } |
| |
| protected void setProjectFormatExample(Map bindings) { |
| String example = CVSDecoratorConfiguration.bind(projectTextFormat.getText(), bindings); |
| projectTextFormatExample.setText(example); |
| } |
| |
| /** |
| * Initializes states of the controls from the preference store. |
| */ |
| private void initializeValues() { |
| IPreferenceStore store = getPreferenceStore(); |
| |
| fileTextFormat.setText(store.getString(ICVSUIConstants.PREF_FILETEXT_DECORATION)); |
| folderTextFormat.setText(store.getString(ICVSUIConstants.PREF_FOLDERTEXT_DECORATION)); |
| projectTextFormat.setText(store.getString(ICVSUIConstants.PREF_PROJECTTEXT_DECORATION)); |
| |
| addedFlag.setText(store.getString(ICVSUIConstants.PREF_ADDED_FLAG)); |
| dirtyFlag.setText(store.getString(ICVSUIConstants.PREF_DIRTY_FLAG)); |
| |
| imageShowDirty.setSelection(store.getBoolean(ICVSUIConstants.PREF_SHOW_DIRTY_DECORATION)); |
| imageShowAdded.setSelection(store.getBoolean(ICVSUIConstants.PREF_SHOW_ADDED_DECORATION)); |
| imageShowHasRemote.setSelection(store.getBoolean(ICVSUIConstants.PREF_SHOW_HASREMOTE_DECORATION)); |
| |
| showDirty.setSelection(store.getBoolean(ICVSUIConstants.PREF_CALCULATE_DIRTY)); |
| |
| setValid(true); |
| } |
| |
| /** |
| * @see IWorkbenchPreferencePage#init(IWorkbench) |
| */ |
| public void init(IWorkbench workbench) { |
| } |
| |
| /** |
| * OK was clicked. Store the CVS preferences. |
| * |
| * @return whether it is okay to close the preference page |
| */ |
| public boolean performOk() { |
| IPreferenceStore store = getPreferenceStore(); |
| store.setValue(ICVSUIConstants.PREF_FILETEXT_DECORATION, fileTextFormat.getText()); |
| store.setValue(ICVSUIConstants.PREF_FOLDERTEXT_DECORATION, folderTextFormat.getText()); |
| store.setValue(ICVSUIConstants.PREF_PROJECTTEXT_DECORATION, projectTextFormat.getText()); |
| |
| store.setValue(ICVSUIConstants.PREF_ADDED_FLAG, addedFlag.getText()); |
| store.setValue(ICVSUIConstants.PREF_DIRTY_FLAG, dirtyFlag.getText()); |
| |
| store.setValue(ICVSUIConstants.PREF_SHOW_DIRTY_DECORATION, imageShowDirty.getSelection()); |
| store.setValue(ICVSUIConstants.PREF_SHOW_ADDED_DECORATION, imageShowAdded.getSelection()); |
| store.setValue(ICVSUIConstants.PREF_SHOW_HASREMOTE_DECORATION, imageShowHasRemote.getSelection()); |
| |
| store.setValue(ICVSUIConstants.PREF_CALCULATE_DIRTY, showDirty.getSelection()); |
| |
| CVSDecorator.refresh(); |
| |
| CVSUIPlugin.getPlugin().savePluginPreferences(); |
| return true; |
| } |
| |
| /** |
| * Defaults was clicked. Restore the CVS preferences to |
| * their default values |
| */ |
| protected void performDefaults() { |
| super.performDefaults(); |
| IPreferenceStore store = getPreferenceStore(); |
| |
| fileTextFormat.setText(store.getDefaultString(ICVSUIConstants.PREF_FILETEXT_DECORATION)); |
| folderTextFormat.setText(store.getDefaultString(ICVSUIConstants.PREF_FOLDERTEXT_DECORATION)); |
| projectTextFormat.setText(store.getDefaultString(ICVSUIConstants.PREF_PROJECTTEXT_DECORATION)); |
| |
| addedFlag.setText(store.getDefaultString(ICVSUIConstants.PREF_ADDED_FLAG)); |
| dirtyFlag.setText(store.getDefaultString(ICVSUIConstants.PREF_DIRTY_FLAG)); |
| |
| imageShowDirty.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_SHOW_DIRTY_DECORATION)); |
| imageShowAdded.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_SHOW_ADDED_DECORATION)); |
| imageShowHasRemote.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_SHOW_HASREMOTE_DECORATION)); |
| |
| showDirty.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_CALCULATE_DIRTY)); |
| } |
| |
| /** |
| * Returns preference store that belongs to the our plugin. |
| * This is important because we want to store |
| * our preferences separately from the desktop. |
| * |
| * @return the preference store for this plugin |
| */ |
| protected IPreferenceStore doGetPreferenceStore() { |
| return CVSUIPlugin.getPlugin().getPreferenceStore(); |
| } |
| |
| /** |
| * Add another project to the list at the end. |
| */ |
| private void addVariables(Text target, Map bindings) { |
| |
| final List variables = new ArrayList(bindings.size()); |
| |
| ILabelProvider labelProvider = new LabelProvider() { |
| public String getText(Object element) { |
| return ((StringPair)element).s1 + " - " + ((StringPair)element).s2; //$NON-NLS-1$ |
| } |
| }; |
| |
| IStructuredContentProvider contentsProvider = new IStructuredContentProvider() { |
| public Object[] getElements(Object inputElement) { |
| return (Object[]) variables.toArray(new StringPair[variables.size()]); |
| } |
| public void dispose() {} |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {} |
| }; |
| |
| for (Iterator it = bindings.keySet().iterator(); it.hasNext();) { |
| StringPair variable = new StringPair(); |
| variable.s1 = (String) it.next(); // variable |
| variable.s2 = (String) bindings.get(variable.s1); // description |
| variables.add(variable); |
| } |
| |
| ListSelectionDialog dialog = |
| new ListSelectionDialog( |
| this.getShell(), |
| this, |
| contentsProvider, |
| labelProvider, |
| Policy.bind("Select_the_&variables_to_add_to_the_decoration_format__30")); //$NON-NLS-1$ |
| dialog.setTitle(Policy.bind("Add_Variables_31")); //$NON-NLS-1$ |
| if (dialog.open() != dialog.OK) |
| return; |
| |
| Object[] result = dialog.getResult(); |
| |
| for (int i = 0; i < result.length; i++) { |
| target.insert("{"+((StringPair)result[i]).s1 +"}"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| |
| private Map getFolderBindingDescriptions() { |
| Map bindings = new HashMap(); |
| bindings.put(CVSDecoratorConfiguration.RESOURCE_NAME, Policy.bind("name_of_the_resource_being_decorated_34")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.RESOURCE_TAG, Policy.bind("the_tag_applied_to_the_resource_(version,_branch,_or_date)_35")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_HOST, Policy.bind("the_repository_location__s_hostname_36")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_METHOD, Policy.bind("the_connection_method_(e.g._pserver,_ssh)_37")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_USER, Policy.bind("user_name_for_the_connection_38")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_ROOT, Policy.bind("repository_home_directory_on_server_39")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.REMOTELOCATION_REPOSITORY, Policy.bind("root_relative_directory_40")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.DIRTY_FLAG, Policy.bind("flag_indicating_that_the_folder_has_a_child_resource_with_outgoing_changes_41")); //$NON-NLS-1$ |
| return bindings; |
| } |
| |
| private Map getFileBindingDescriptions() { |
| Map bindings = new HashMap(); |
| bindings.put(CVSDecoratorConfiguration.RESOURCE_NAME, Policy.bind("name_of_the_resource_being_decorated_42")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.RESOURCE_TAG, Policy.bind("the_tag_applied_to_the_resource_43")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.FILE_KEYWORD, Policy.bind("keyword_subsitution_rule_for_the_resource_44")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.FILE_REVISION, Policy.bind("last_revision_loaded_into_workspace_45")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.DIRTY_FLAG, Policy.bind("flag_indicating_that_the_file_has_outgoing_changes_46")); //$NON-NLS-1$ |
| bindings.put(CVSDecoratorConfiguration.ADDED_FLAG, Policy.bind("flag_indicating_that_the_file_has_been_added_to_the_server_47")); //$NON-NLS-1$ |
| return bindings; |
| } |
| } |