/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.datatools.ui.actions;
import org.eclipse.datatools.connectivity.IConnectionProfile;
import org.eclipse.datatools.connectivity.IManagedConnection;
import org.eclipse.datatools.connectivity.internal.repository.IConnectionProfileRepository;
import org.eclipse.datatools.connectivity.internal.repository.IConnectionProfileRepositoryConstants;
import org.eclipse.datatools.connectivity.internal.ui.ConnectivityUIPlugin;
import org.eclipse.datatools.connectivity.internal.ui.ProfileUIManager;
import org.eclipse.datatools.connectivity.ui.wizards.ConnectionProfileDetailsPage;
import org.eclipse.datatools.connectivity.ui.wizards.ProfileDetailsPropertyPage;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.ui.dialogs.PropertyPage;
import org.teiid.designer.ui.actions.IConnectionAction;
/**
* This action provides "Edit Connection Profile" functionality.
*
* It contains code from DTP's ViewPropertyAction because it handled the complex nature of the property contributions for connection
* profiles.
*
* @since 8.0
*/
public class EditConnectionProfileAction extends Action implements IConnectionAction {
// for stashing the size of the dialog for consistency
public final static String MEMENTO_ROOT = "Connectivity_Property_Dialog_Root";//$NON-NLS-1$
public final static String MEMENTO_DIALOG_SIZE_HEIGHT = "Dialog_Size_Height";//$NON-NLS-1$
public final static String MEMENTO_DIALOG_SIZE_WIDTH = "Dialog_Size_Width";//$NON-NLS-1$
private int mShellWidth = 0;
private int mShellHeight = 0;
private IConnectionProfile profile;
private Shell mShell;
private boolean wasFinished = false;
/**
* Constructor
*/
public EditConnectionProfileAction(Shell shell, IConnectionProfile profile) {
this.profile = profile;
this.mShell = shell;
setText(ConnectivityUIPlugin.getDefault().getResourceString(
"ServersView.action.showproperties")); //$NON-NLS-1$
}
/*
* Facility method added in here so that dependency to eclipse internal api
* is kept to a minimum
*/
public static boolean hasContributors(Object selected) {
return ProfileUIManager.hasContributors( selected );
}
/*
* @see org.eclipse.ui.IAction#run()
*/
@Override
public void run() {
PreferenceDialog propertyDialog =
ProfileUIManager.createPreferenceDialog( mShell,
this.profile );
if( propertyDialog == null )
return;
// check for size settings
IDialogSettings dset = ConnectivityUIPlugin.getDefault()
.getDialogSettings();
boolean foundSettings = false;
if (dset != null) {
IDialogSettings dSection = dset.getSection(MEMENTO_ROOT);
if (dSection != null) {
if (dSection.get(MEMENTO_DIALOG_SIZE_HEIGHT) != null
&& dSection.get(MEMENTO_DIALOG_SIZE_HEIGHT).trim()
.length() > 0) {
mShellHeight = dSection.getInt(MEMENTO_DIALOG_SIZE_HEIGHT);
mShellWidth = dSection.getInt(MEMENTO_DIALOG_SIZE_WIDTH);
foundSettings = true;
}
}
}
// if we found them, set it to the old values
if (foundSettings) {
propertyDialog.getShell().setSize(mShellWidth, mShellHeight);
propertyDialog.getShell().layout();
// if not, initialize 'mShellWidth' and 'mShellHeigth'
}else{
mShellHeight = propertyDialog.getShell().getSize().y;
mShellWidth = propertyDialog.getShell().getSize().x;
}
String title = ConnectivityUIPlugin.getDefault().getResourceString(
"properties.dialog"); //$NON-NLS-1$
title = ConnectivityUIPlugin.getDefault().
getResourceString("ConnectAction.title", //$NON-NLS-1$
new String[] {profile.getName()});
propertyDialog.getShell().setText(title);
// add a listener to make sure we get any resizes of the dialog
// to store for the next time
this.mShell.addControlListener(new ControlListener(){
@Override
public void controlMoved(ControlEvent e) {
}
@Override
public void controlResized(ControlEvent e) {
if (e.getSource() instanceof Shell) {
Shell shell = (Shell) e.getSource();
EditConnectionProfileAction.this.mShellHeight = shell.getSize().y;
EditConnectionProfileAction.this.mShellWidth = shell.getSize().x;
}
}
});
// check to see if the profile is in a read-only repository
// and if so, disable the controls on each page selected
boolean inReadOnlyRepository = false;
if (profile.getParentProfile() != null) {
IManagedConnection imc = profile.getParentProfile()
.getManagedConnection(IConnectionProfileRepositoryConstants.REPOSITORY_CONNECTION_FACTORY_ID);
if (imc != null && imc.isConnected()) {
IConnectionProfileRepository repo = (IConnectionProfileRepository) imc
.getConnection().getRawConnection();
inReadOnlyRepository = repo.isReadOnly();
}
}
// handle the initial page selected in the dialog for the
// read only repository page disabling...
propertyDialog.addPageChangedListener( new PropertyPageChangeListener(inReadOnlyRepository) );
if (inReadOnlyRepository && propertyDialog.getSelectedPage() != null) {
PropertyPage page = (PropertyPage) propertyDialog.getSelectedPage();
if (propertyDialog.getSelectedPage() instanceof ConnectionProfileDetailsPage ||
propertyDialog.getSelectedPage() instanceof ProfileDetailsPropertyPage) {
if (page.getControl() instanceof Composite) {
Composite composite = (Composite) page.getControl();
if (inReadOnlyRepository)
disableControls(composite, !inReadOnlyRepository, true);
}
}
else if (propertyDialog.getSelectedPage() instanceof PropertyPage) {
if (page.getControl() instanceof Composite) {
Composite composite = (Composite) page.getControl();
disableControls(composite, !inReadOnlyRepository);
}
}
}
int rtn_val = propertyDialog.open();
if (rtn_val == Window.OK) {
wasFinished = true;
saveState();
}
}
/*
* Page change listener to disable controls for profiles
* in a read-only repository.
*
* @author brianf
*
*/
private class PropertyPageChangeListener implements IPageChangedListener {
private boolean inReadOnlyRepository = false;
/*
* Constructor
* @param flag
*/
public PropertyPageChangeListener( boolean flag ) {
inReadOnlyRepository = flag;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IPageChangedListener#pageChanged(org.eclipse.jface.dialogs.PageChangedEvent)
*/
@Override
public void pageChanged(PageChangedEvent event) {
if (event.getSelectedPage() instanceof ConnectionProfileDetailsPage ||
event.getSelectedPage() instanceof ProfileDetailsPropertyPage) {
PropertyPage page = (PropertyPage) event.getSelectedPage();
if (page.getControl() instanceof Composite) {
Composite composite = (Composite) page.getControl();
if (inReadOnlyRepository)
disableControls(composite, !inReadOnlyRepository, true);
}
}
else if (event.getSelectedPage() instanceof PropertyPage) {
PropertyPage page = (PropertyPage) event.getSelectedPage();
if (page.getControl() instanceof Composite) {
Composite composite = (Composite) page.getControl();
if (inReadOnlyRepository)
disableControls(composite, !inReadOnlyRepository);
}
}
}
}
/*
* Disable controls on a composite
* @param parent
* @param enabled
*/
private void disableControls ( Composite parent, boolean enabled ) {
disableControls(parent, enabled, false);
}
/*
* Disable controls on a composite, but have a special case
* for the Test Connection (Ping) button
* @param parent
* @param enabled
* @param checkForPing
*/
private void disableControls ( Composite parent, boolean enabled, boolean checkForPing ) {
for (int i = 0; i < parent.getChildren().length; i++) {
if (parent.getChildren()[i] instanceof TabFolder) {
Control[] tabList = ((TabFolder) parent.getChildren()[i]).getTabList();
for (int j = 0; j < tabList.length; j++) {
if (tabList[j] instanceof Composite) {
disableControls((Composite) tabList[j], enabled, checkForPing);
}
tabList[j].setEnabled(false);
}
}
else if (parent.getChildren()[i] instanceof Composite) {
disableControls((Composite) parent.getChildren()[i], enabled, checkForPing);
if (parentHasCombo((Composite)parent.getChildren()[i], enabled)) {
parent.getChildren()[i].setEnabled(enabled);
}
}
else {
if (parent.getChildren()[i] instanceof Label) {
// ignore
}
else if (parent.getChildren()[i] instanceof List) {
Color bg = Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
((List)parent.getChildren()[i]).setBackground(bg);
((List)parent.getChildren()[i]).setEnabled(enabled);
}
else if (parent.getChildren()[i] instanceof TabFolder) {
//ignore
}
else if (parent.getChildren()[i] instanceof Button) {
if (checkForPing) {
String pingLabel = ConnectivityUIPlugin.getDefault().getResourceString(
"ConnectionProfileDetailsPage.Button.TestConnection"); //$NON-NLS-1$
Button btn = (Button) parent.getChildren()[i];
if (!btn.isDisposed() && btn.getText().equals(pingLabel)) {
btn.setEnabled(true);
}
else {
btn.setEnabled(enabled);
}
}
else {
parent.getChildren()[i].setEnabled(enabled);
}
}
else {
parent.getChildren()[i].setEnabled(enabled);
}
}
}
}
/*
* See if the composite has a combo on it. If so, set the background
* so it looks disabled.
* @param parent
* @param enabled
* @return
*/
private boolean parentHasCombo ( Composite parent, boolean enabled ) {
if (parent.getChildren().length > 0) {
Control[] controls = parent.getChildren();
for (int i = 0; i < controls.length; i++) {
if (controls[i] instanceof Combo) {
if (!enabled) {
Color bg = Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
((Combo)controls[i]).setBackground(bg);
}
return true;
}
}
}
return false;
}
/*
* Save the dialog settings
*/
private void saveState() {
IDialogSettings dset = ConnectivityUIPlugin.getDefault()
.getDialogSettings();
if (dset != null && this.mShell != null ) {
IDialogSettings dSection = dset.getSection(MEMENTO_ROOT);
if (dSection == null)
dSection = dset.addNewSection(MEMENTO_ROOT);
if (dSection != null) {
dSection.put(MEMENTO_DIALOG_SIZE_HEIGHT, mShellHeight);
dSection.put(MEMENTO_DIALOG_SIZE_WIDTH, mShellWidth);
}
}
}
public boolean wasFinished() {
return wasFinished;
}
}