/*******************************************************************************
* Copyright (c) 2007-2008 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.hibernate.eclipse.launch;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.eclipse.datatools.connectivity.ConnectionProfileException;
import org.eclipse.datatools.connectivity.IConnectionProfile;
import org.eclipse.datatools.connectivity.IProfileListener;
import org.eclipse.datatools.connectivity.ProfileManager;
import org.eclipse.datatools.connectivity.internal.ui.wizards.NewCPWizard;
import org.eclipse.datatools.connectivity.internal.ui.wizards.NewCPWizardCategoryFilter;
import org.eclipse.datatools.connectivity.ui.wizards.NewConnectionProfileWizard;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.internal.dialogs.PropertyDialog;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.util.xpl.StringHelper;
/**
*
*
* @author Vitali Yemialyanchyk
*/
public class ConnectionProfileCtrl {
protected ComboViewer comboControl;
protected Button buttonNew;
protected Button buttonEdit;
private boolean useSynteticValues = true;
static final String NO_CONNECTIN_NAME = HibernateConsoleMessages.ConnectionProfileCtrl_HibernateConfiguredConnection;
static final String JPA_CONNECTIN_NAME = HibernateConsoleMessages.ConnectionProfileCtrl_JPAConfiguredConnection;
static final protected ConnectionWrapper NO_CONNECTION_PLACEHOLDER = new ConnectionWrapper(NO_CONNECTIN_NAME, null);
static final protected ConnectionWrapper JPA_CONNECTION_PLACEHOLDER = new ConnectionWrapper(JPA_CONNECTIN_NAME, null);
private static class ConnectionWrapper {
final private String id;
final private IConnectionProfile profile;
public ConnectionWrapper(String id, IConnectionProfile profile) {
this.id = id;
this.profile = profile;
}
public String getId() {
return id;
}
public IConnectionProfile getProfile() {
return profile;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof ConnectionWrapper)) {
return false;
}
ConnectionWrapper cw = (ConnectionWrapper) obj;
return this.getId().equals(cw.getId());
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
}
protected ArrayList<ModifyListener> modifyListeners = new ArrayList<ModifyListener>();
public ConnectionProfileCtrl(Composite comp, int hspan, String defaultValue) {
createComboWithTwoButtons(comp, hspan, defaultValue,
new NewConnectionProfileAction(), new EditConnectionProfileAction());
}
public void setUseSynteticValue(boolean value){
this.useSynteticValues = value;
this.updateInput();
}
public class ButtonPressedAction extends Action implements SelectionListener {
public ButtonPressedAction(String label) {
super(label);
}
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
run();
}
}
public class ConnectionProfileChangeListener implements IProfileListener {
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.IProfileListener#profileAdded(org.eclipse.datatools.connectivity.IConnectionProfile)
*/
public void profileAdded(final IConnectionProfile profile) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
updateInput();
selectValue(profile.getName());
validate();
}
});
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.IProfileListener#profileChanged(org.eclipse.datatools.connectivity.IConnectionProfile)
*/
public void profileChanged(IConnectionProfile profile) {
profileAdded(profile);
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.IProfileListener#profileDeleted(org.eclipse.datatools.connectivity.IConnectionProfile)
*/
public void profileDeleted(IConnectionProfile profile) {
// this event never happens
}
}
public class NewConnectionProfileAction extends ButtonPressedAction {
/**
* @param label
*/
public NewConnectionProfileAction() {
super(HibernateConsoleMessages.ConnectionProfileCtrl_New);
}
@Override
public void run() {
IProfileListener listener = new ConnectionProfileChangeListener();
ProfileManager.getInstance().addProfileListener(listener);
NewCPWizardCategoryFilter filter = new NewCPWizardCategoryFilter("org.eclipse.datatools.connectivity.db.category"); //$NON-NLS-1$
NewCPWizard wizard = new NewCPWizard(filter, null);
new NewConnectionProfileWizard() {
public boolean performFinish() {
// create profile only
try {
ProfileManager.getInstance().createProfile(
getProfileName() == null ? "" //$NON-NLS-1$
: getProfileName(),
getProfileDescription() == null ? "" //$NON-NLS-1$
: getProfileDescription(),
mProviderID,
getProfileProperties(),
mProfilePage.getRepository() == null ? "" //$NON-NLS-1$
: mProfilePage.getRepository()
.getName(), false);
} catch (ConnectionProfileException e) {
HibernateConsolePlugin.getDefault().log(e);
}
return true;
}
@Override
public void addCustomPages() {
}
@Override
public Properties getProfileProperties() {
return null;
}
};
WizardDialog wizardDialog = new WizardDialog(Display.getCurrent()
.getActiveShell(), wizard);
wizardDialog.open();
ProfileManager.getInstance().removeProfileListener(listener);
}
}
/**
*
*/
public class EditConnectionProfileAction extends ButtonPressedAction {
/**
* @param label
*/
public EditConnectionProfileAction() {
super(HibernateConsoleMessages.ConnectionProfileCtrl_Edit);
}
/**
*
*/
@Override
public void run() {
ConnectionWrapper currentConnection = getSelectedConnection();
if (null == currentConnection || currentConnection.getProfile()==null) {
return;
}
IConnectionProfile selectedProfile = currentConnection.getProfile();
PropertyDialog.createDialogOn(
Display.getCurrent().getActiveShell(),
"org.eclipse.datatools.connectivity.db.generic.profileProperties", //$NON-NLS-1$
selectedProfile).open();
if (!currentConnection.getId().equals(selectedProfile.getName())) {
updateInput();
selectValue(selectedProfile.getName());
}
validate();
}
};
public Composite createComboWithTwoButtons(Composite container, int hspan,
String defaultValue, ButtonPressedAction action1, ButtonPressedAction action2) {
Composite comp = SWTFactory.createComposite(container, container.getFont(), 3, 1, GridData.FILL_HORIZONTAL, 0, 0);
Combo combo;
combo = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY);
combo.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
comboControl = new ComboViewer(combo);
comboControl.setContentProvider(new IStructuredContentProvider() {
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
public Object[] getElements(Object inputElement) {
return getProfileNameList().toArray();
}
});
comboControl.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
ConnectionWrapper cw = (ConnectionWrapper) element;
return cw.getId();
}
});
comboControl.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
buttonEdit.setEnabled(getSelectedConnection().getProfile()!=null);
notifyModifyListeners();
}
});
combo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
buttonNew = new Button(comp, SWT.PUSH);
buttonNew.setText(HibernateConsoleMessages.ConnectionProfileCtrl_New);
buttonNew.addSelectionListener(action1);
buttonEdit = new Button(comp, SWT.PUSH);
buttonEdit.setText(HibernateConsoleMessages.ConnectionProfileCtrl_Edit);
buttonEdit.addSelectionListener(action2);
updateInput();
return comp;
}
public void updateInput() {
comboControl.setInput(getProfileNameList());
}
//TODO: handle if the connection profile does not exist
// Require that we make the combobox editable
protected ConnectionWrapper findMatchingConnection(String name) {
if(StringHelper.isEmpty(name)) {
return NO_CONNECTION_PLACEHOLDER;
}
List<ConnectionWrapper> list = getProfileNameList();
for (Iterator<ConnectionWrapper> iterator = list.iterator(); iterator.hasNext();) {
ConnectionWrapper object = iterator.next();
if(name.equals(object.getId())) {
return object;
}
}
return NO_CONNECTION_PLACEHOLDER;
}
public void selectValue(String name) {
ConnectionWrapper connection = findMatchingConnection(name);
comboControl.setSelection(new StructuredSelection(connection), true);
comboControl.refresh();
notifyModifyListeners();
}
/**
*
* @return current selected connection wrapper, will always return non-null.
*/
private ConnectionWrapper getSelectedConnection() {
StructuredSelection selection = (StructuredSelection)comboControl.getSelection();
if (null == selection || selection.isEmpty()) {
return NO_CONNECTION_PLACEHOLDER;
}
ConnectionWrapper cw = (ConnectionWrapper) selection.getFirstElement();
return cw;
}
private String getSelectedId() {
ConnectionWrapper cw = getSelectedConnection();
return cw.getId();
}
protected void validate() {
}
private List<ConnectionWrapper> getProfileNameList() {
IConnectionProfile[] profiles = ProfileManager.getInstance()
.getProfilesByCategory("org.eclipse.datatools.connectivity.db.category"); //$NON-NLS-1$
List<ConnectionWrapper> names = new ArrayList<ConnectionWrapper>();
if (useSynteticValues){
names.add(JPA_CONNECTION_PLACEHOLDER);
names.add(NO_CONNECTION_PLACEHOLDER);
}
for (IConnectionProfile connectionProfile : profiles) {
names.add(new ConnectionWrapper(connectionProfile.getName(), connectionProfile));
}
return names;
}
public void setEnabled(boolean enabled) {
comboControl.getControl().setEnabled(enabled);
buttonNew.setEnabled(enabled);
buttonEdit.setEnabled(enabled);
}
protected void notifyModifyListeners() {
for (int i = 0; i < modifyListeners.size(); i++) {
modifyListeners.get(i).modifyText(null);
}
}
public void addModifyListener(ModifyListener listener) {
modifyListeners.add(listener);
}
public void removeModifyListener(ModifyListener listener) {
modifyListeners.remove(listener);
}
public String getSelectedConnectionName() {
return getSelectedConnection().getId();
}
public boolean hasConnectionProfileSelected() {
return getSelectedConnection().getProfile()!=null;
}
}