/*******************************************************************************
* Copyright (c) 2010, 2010 Andrew Gvozdev (Quoin Inc.) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrew Gvozdev (Quoin Inc.) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.newui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.cdt.internal.ui.newui.Messages;
/**
* Local UI control for multiple configurations string list mode redirecting to
* Preference page "Multiple Configurations Edit".
*
* @since 5.3
*/
public class StringListModeControl {
private static final String STRING_LIST_MODE_PREFERENCE_PAGE = "org.eclipse.cdt.managedbuilder.ui.preferences.PrefPage_MultiConfig"; //$NON-NLS-1$
private ICPropertyProvider page;
private Link linkStringListMode;
private List<Listener> listeners = new ArrayList<Listener>();
/**
* Constructor.
*
* @param page - preference page.
* @param parent - parent {@code Composite} control.
* @param span - horizontal span for the control
*/
public StringListModeControl(ICPropertyProvider page, final Composite parent, int span) {
this.page = page;
linkStringListMode = new Link(parent, SWT.NONE);
updateStringListModeLink(linkStringListMode);
linkStringListMode.setToolTipText(Messages.AbstractLangsListTab_MultiConfigStringListModeLinkHint);
linkStringListMode.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
// Use event.text to tell which link was used
int result = PreferencesUtil.createPreferenceDialogOn(parent.getShell(), STRING_LIST_MODE_PREFERENCE_PAGE, null, null).open();
if (result!=Window.CANCEL) {
updateStringListModeControl();
for (Listener listener : listeners) {
listener.handleEvent(event);
}
}
}
});
GridData gridData = new GridData(SWT.RIGHT, SWT.NONE, true, false);
gridData.horizontalSpan = span;
linkStringListMode.setLayoutData(gridData);
}
/**
* Add a listener suitable for {@link org.eclipse.swt.widgets.Widget#addListener(int, Listener)}.
*
* @param eventType - the type of event to listen for, currently not used.
* @param listener - the listener which should be notified when the event occurs.
*/
public void addListener(int eventType, final Listener listener) {
listeners.add(listener);
}
/**
* Removes the listener from the collection of listeners.
*
* @param eventType the type of event to listen for, currently not used.
* @param listener the listener which should no longer be notified.
*/
protected void removeListener (int eventType, Listener listener) {
listeners.remove(listener);
}
/**
* Use to update the control when one of the string list modes gets modified .
*/
public void updateStringListModeControl() {
updateStringListModeLink(linkStringListMode);
}
/**
* Updates the message of the link presented to the user.
*
* @param link - {@code Link} object to update.
*/
private void updateStringListModeLink(Link link) {
boolean isMultiCfg = page.isMultiCfg();
linkStringListMode.setVisible(isMultiCfg);
if (isMultiCfg) {
String modeUnknown = Messages.AbstractLangsListTab_UnknownMode;
String modeDisplay = modeUnknown;
switch (CDTPrefUtil.getMultiCfgStringListDisplayMode()) {
case CDTPrefUtil.DMODE_CONJUNCTION:
modeDisplay = Messages.AbstractLangsListTab_Conjunction;
break;
case CDTPrefUtil.DMODE_DISJUNCTION:
modeDisplay = Messages.AbstractLangsListTab_Disjunction;
break;
}
String modeWrite = modeUnknown;
switch (CDTPrefUtil.getMultiCfgStringListWriteMode()) {
case CDTPrefUtil.WMODE_MODIFY:
modeWrite = Messages.AbstractLangsListTab_Modify;
break;
case CDTPrefUtil.WMODE_REPLACE:
modeWrite = Messages.AbstractLangsListTab_Replace;
break;
}
linkStringListMode.setText(Messages.AbstractLangsListTab_StringListMode +
" <a href=\"workspace-settings\">"+modeDisplay+"</a> + <a href=\"workspace-settings\">"+modeWrite+"</a>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
linkStringListMode.getParent().layout();
}
}