1 /*******************************************************************************
2  * Copyright (c) 2000, 2009 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.team.internal.ccvs.ui;
15 
16 import org.eclipse.jface.dialogs.Dialog;
17 import org.eclipse.jface.dialogs.IDialogConstants;
18 import org.eclipse.jface.preference.IPreferenceStore;
19 import org.eclipse.jface.preference.PreferencePage;
20 import org.eclipse.swt.SWT;
21 import org.eclipse.swt.events.SelectionAdapter;
22 import org.eclipse.swt.events.SelectionEvent;
23 import org.eclipse.swt.layout.*;
24 import org.eclipse.swt.widgets.*;
25 import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
26 import org.eclipse.team.internal.ccvs.core.IConnectionMethod;
27 import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;
28 import org.eclipse.team.internal.ui.SWTUtils;
29 import org.eclipse.ui.*;
30 import org.eclipse.ui.dialogs.PreferenceLinkArea;
31 import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
32 
33 public class ExtMethodPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
34 
35 	Text cvsRsh;
36 	Text cvsServer;
37 	Text cvsRshParameters;
38 	private Button useExternal;
39 	private Button useInternal;
40 	private Combo methodType;
41 	private Control internal, external;
42 
43 	@Override
createContents(Composite parent)44 	protected Control createContents(Composite parent) {
45 		Composite composite = new Composite(parent, SWT.NULL);
46 
47 		SelectionAdapter selectionListener = new SelectionAdapter() {
48 			@Override
49 			public void widgetSelected(SelectionEvent e) {
50 				updateEnablements();
51 			}
52 		};
53 
54 		// create radio buttons in a consecutive manner (see bug 282032)
55 		useExternal = createRadioButton(composite, CVSUIMessages.ExtMethodPreferencePage_0, 1);
56 		useExternal.addSelectionListener(selectionListener);
57 		useInternal = createRadioButton(composite, CVSUIMessages.ExtMethodPreferencePage_1, 1);
58 		useInternal.addSelectionListener(selectionListener);
59 
60 		external = createExternalArea(composite);
61 		internal = createInternalArea(composite);
62 
63 		PreferenceLinkArea proxyLink = SWTUtils.createPreferenceLink((IWorkbenchPreferenceContainer) getContainer(), composite, CVSUIMessages.CVSPreferencesPage_52, CVSUIMessages.CVSPreferencesPage_53);
64 
65 		PreferenceLinkArea ssh2Link = SWTUtils.createPreferenceLink((IWorkbenchPreferenceContainer) getContainer(), composite, CVSUIMessages.CVSPreferencesPage_54, CVSUIMessages.CVSPreferencesPage_55);
66 
67 		// lay out controls in a different order than they were created in
68 		FormLayout formLayout = new FormLayout();
69 		composite.setLayout(formLayout);
70 
71 		FormData data = new FormData();
72 		data.top = new FormAttachment(0, SWT.DEFAULT);
73 		data.left = new FormAttachment(0, 0);
74 		data.right = new FormAttachment(100, 0);
75 		useExternal.setLayoutData(data);
76 
77 		data = new FormData();
78 		data.top = new FormAttachment(useExternal, 5, SWT.DEFAULT);
79 		data.left = new FormAttachment(0, 0);
80 		data.right = new FormAttachment(100, 0);
81 		external.setLayoutData(data);
82 
83 		data = new FormData();
84 		data.top = new FormAttachment(external, 5, SWT.DEFAULT);
85 		data.left = new FormAttachment(0, 0);
86 		data.right = new FormAttachment(100, 0);
87 		useInternal.setLayoutData(data);
88 
89 		data = new FormData();
90 		data.top = new FormAttachment(useInternal, 5, SWT.DEFAULT);
91 		data.left = new FormAttachment(0, 0);
92 		data.right = new FormAttachment(100, 0);
93 		internal.setLayoutData(data);
94 
95 		data = new FormData();
96 		data.top = new FormAttachment(internal, 5, SWT.DEFAULT);
97 		data.left = new FormAttachment(0, 0);
98 		data.right = new FormAttachment(100, 0);
99 		proxyLink.getControl().setLayoutData(data);
100 
101 		data = new FormData();
102 		data.top = new FormAttachment(proxyLink.getControl(), 5, SWT.DEFAULT);
103 		data.left = new FormAttachment(0, 0);
104 		data.right = new FormAttachment(100, 0);
105 		ssh2Link.getControl().setLayoutData(data);
106 
107 		initializeDefaults();
108 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IHelpContextIds.EXT_PREFERENCE_PAGE);
109 		Dialog.applyDialogFont(parent);
110 		return composite;
111 	}
112 
updateEnablements()113 	private void updateEnablements() {
114 		external.setEnabled(useExternal.getSelection());
115 		cvsRsh.setEnabled(useExternal.getSelection());
116 		cvsRshParameters.setEnabled(useExternal.getSelection());
117 		cvsServer.setEnabled(useExternal.getSelection());
118 		internal.setEnabled(!useExternal.getSelection());
119 		methodType.setEnabled(!useExternal.getSelection());
120 	}
121 
createInternalArea(Composite parent)122 	private Control createInternalArea(Composite parent) {
123 		Composite composite = new Composite(parent, SWT.NULL);
124 		GridLayout layout = new GridLayout();
125 		layout.marginWidth = 5;
126 		layout.marginHeight = 5;
127 		layout.numColumns = 2;
128 		composite.setLayout(layout);
129 		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
130 
131 		Label intro = new Label(composite, SWT.LEFT | SWT.WRAP);
132 		intro.setText(CVSUIMessages.ExtMethodPreferencePage_2);
133 		GridData data = new GridData();
134 		data.horizontalSpan = 2;
135 		data.horizontalAlignment = GridData.FILL;
136 		data.widthHint = 300;
137 		intro.setLayoutData(data);
138 
139 		createLabel(composite, CVSUIMessages.CVSPropertiesPage_connectionType, 1);
140 		methodType = createCombo(composite);
141 
142 		return composite;
143 	}
createExternalArea(Composite parent)144 	protected Control createExternalArea(Composite parent) {
145 		Composite composite = new Composite(parent, SWT.NULL);
146 		GridLayout layout = new GridLayout();
147 		layout.marginWidth = 5;
148 		layout.marginHeight = 5;
149 		layout.numColumns = 3;
150 		composite.setLayout(layout);
151 		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
152 
153 		Label intro = new Label(composite, SWT.LEFT | SWT.WRAP);
154 		intro.setText(CVSUIMessages.ExtMethodPreferencePage_message);
155 		GridData data = new GridData();
156 		data.horizontalSpan = 3;
157 		data.horizontalAlignment = GridData.FILL;
158 		data.widthHint = 300;
159 		intro.setLayoutData(data);
160 
161 		new Label(composite, SWT.LEFT).setText(CVSUIMessages.ExtMethodPreferencePage_CVS_RSH);
162 		cvsRsh = new Text(composite, SWT.BORDER);
163 		cvsRsh.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
164 
165 		final Button b = new Button(composite, SWT.NONE);
166 		b.setText(CVSUIMessages.ExtMethodPreferencePage_Browse);
167 		data = new GridData();
168 		data.horizontalAlignment = GridData.FILL;
169 		int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
170 		data.widthHint = Math.max(widthHint, b.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
171 		b.setLayoutData(data);
172 		b.addListener(SWT.MouseDown, event -> {
173 			FileDialog d = new FileDialog(getShell());
174 			d.setText(CVSUIMessages.ExtMethodPreferencePage_Details);
175 			String file = d.open();
176 			if (file != null) {
177 				setCvsRshText(file);
178 			}
179 		});
180 
181 		new Label(composite, SWT.LEFT).setText(CVSUIMessages.ExtMethodPreferencePage_CVS_RSH_Parameters);
182 		cvsRshParameters = new Text(composite, SWT.BORDER);
183 		data = new GridData();
184 		data.horizontalSpan = 2;
185 		data.horizontalAlignment = GridData.FILL;
186 		cvsRshParameters.setLayoutData(data);
187 
188 		new Label(composite, SWT.LEFT).setText(CVSUIMessages.ExtMethodPreferencePage_CVS_SERVER__7);
189 		cvsServer = new Text(composite, SWT.BORDER);
190 		data = new GridData();
191 		data.horizontalSpan = 2;
192 		data.horizontalAlignment = GridData.FILL;
193 		cvsServer.setLayoutData(data);
194 
195 		PlatformUI.getWorkbench().getHelpSystem().setHelp(cvsRsh, IHelpContextIds.EXT_PREFERENCE_RSH);
196 		PlatformUI.getWorkbench().getHelpSystem().setHelp(cvsRshParameters, IHelpContextIds.EXT_PREFERENCE_PARAM);
197 		PlatformUI.getWorkbench().getHelpSystem().setHelp(cvsServer, IHelpContextIds.EXT_PREFERENCE_SERVER);
198 		return composite;
199 	}
200 
initializeDefaults()201 	private void initializeDefaults() {
202 		IPreferenceStore store = getPreferenceStore();
203 		String rsh = store.getString(ICVSUIConstants.PREF_CVS_RSH);
204 		String parameter = store.getString(ICVSUIConstants.PREF_CVS_RSH_PARAMETERS);
205 		String server = store.getString(ICVSUIConstants.PREF_CVS_SERVER);
206 		String method = store.getString(ICVSUIConstants.PREF_EXT_CONNECTION_METHOD_PROXY);
207 		initializeDefaults(rsh, parameter, server, method);
208 	}
209 
210 	/*
211 	 * Set CVS_RSH program
212 	 */
setCvsRshText(String s)213 	protected void setCvsRshText(String s) {
214 		cvsRsh.setText(s);
215 	}
216 
217 	@Override
init(IWorkbench workbench)218 	public void init(IWorkbench workbench) {
219 	}
220 
221 	@Override
performOk()222 	public boolean performOk() {
223 		IPreferenceStore store = getPreferenceStore();
224 		String method;
225 		if (useExternal.getSelection()) {
226 			method = "ext"; //$NON-NLS-1$
227 			store.setValue(ICVSUIConstants.PREF_CVS_RSH, cvsRsh.getText());
228 			store.setValue(ICVSUIConstants.PREF_CVS_RSH_PARAMETERS, cvsRshParameters.getText());
229 			store.setValue(ICVSUIConstants.PREF_CVS_SERVER, cvsServer.getText());
230 			CVSProviderPlugin.getPlugin().setCvsRshCommand(cvsRsh.getText());
231 			CVSProviderPlugin.getPlugin().setCvsRshParameters(cvsRshParameters.getText());
232 			CVSProviderPlugin.getPlugin().setCvsServer(cvsServer.getText());
233 		} else {
234 			method = methodType.getText();
235 		}
236 		store.setValue(ICVSUIConstants.PREF_EXT_CONNECTION_METHOD_PROXY, method);
237 		CVSRepositoryLocation.setExtConnectionMethodProxy(method);
238 		CVSUIPlugin.getPlugin().savePluginPreferences();
239 		return super.performOk();
240 	}
241 
242 	@Override
performDefaults()243 	protected void performDefaults() {
244 		IPreferenceStore store = getPreferenceStore();
245 		String rsh = store.getDefaultString(ICVSUIConstants.PREF_CVS_RSH);
246 		String parameter = store.getDefaultString(ICVSUIConstants.PREF_CVS_RSH_PARAMETERS);
247 		String server = store.getDefaultString(ICVSUIConstants.PREF_CVS_SERVER);
248 		String method = store.getDefaultString(ICVSUIConstants.PREF_EXT_CONNECTION_METHOD_PROXY);
249 		initializeDefaults(rsh, parameter, server, method);
250 		super.performDefaults();
251 	}
252 
initializeDefaults(String rsh, String parameters, String server, String method)253 	private void initializeDefaults(String rsh, String parameters, String server, String method) {
254 		cvsRsh.setText(rsh);
255 		cvsRshParameters.setText(parameters);
256 		cvsServer.setText(server);
257 		IConnectionMethod[] methods = CVSRepositoryLocation.getPluggedInConnectionMethods();
258 		for (IConnectionMethod m : methods) {
259 			String name = m.getName();
260 			if (!name.equals("ext")) { //$NON-NLS-1$
261 				methodType.add(name);
262 			}
263 		}
264 		if (method.equals("ext")) { //$NON-NLS-1$
265 			methodType.select(0);
266 		} else {
267 			methodType.select(methodType.indexOf(method));
268 		}
269 		useExternal.setSelection(method.equals("ext")); //$NON-NLS-1$
270 		useInternal.setSelection(!method.equals("ext")); //$NON-NLS-1$
271 		updateEnablements();
272 	}
273 
274 	@Override
doGetPreferenceStore()275 	protected IPreferenceStore doGetPreferenceStore() {
276 		return CVSUIPlugin.getPlugin().getPreferenceStore();
277 	}
278 
createRadioButton(Composite parent, String label, int span)279 	protected Button createRadioButton(Composite parent, String label, int span) {
280 		Button button = new Button(parent, SWT.RADIO);
281 		button.setText(label);
282 		GridData data = new GridData();
283 		data.horizontalSpan = span;
284 		button.setLayoutData(data);
285 		return button;
286 	}
287 
createLabel(Composite parent, String text, int span)288 	protected Label createLabel(Composite parent, String text, int span) {
289 		Label label = new Label(parent, SWT.LEFT);
290 		label.setText(text);
291 		GridData data = new GridData();
292 		data.horizontalSpan = span;
293 		data.horizontalAlignment = GridData.FILL;
294 		label.setLayoutData(data);
295 		return label;
296 	}
createCombo(Composite parent)297 	protected Combo createCombo(Composite parent) {
298 		Combo combo = new Combo(parent, SWT.READ_ONLY);
299 		GridData data = new GridData(GridData.FILL_HORIZONTAL);
300 		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
301 		data.horizontalSpan = 1;
302 		combo.setLayoutData(data);
303 		return combo;
304 	}
305 }
306