/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.hibernate.eclipse.console.properties; import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jpt.jpa.core.JpaProject; import org.eclipse.jpt.jpa.core.JpaProject.Reference; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; 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.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.browser.IWebBrowser; import org.eclipse.ui.browser.IWorkbenchBrowserSupport; import org.eclipse.ui.dialogs.PropertyPage; import org.hibernate.console.ConsoleConfiguration; import org.hibernate.console.ImageConstants; import org.hibernate.console.KnownConfigurations; import org.hibernate.eclipse.console.HibernateConsoleMessages; import org.hibernate.eclipse.console.HibernateConsolePlugin; import org.hibernate.eclipse.console.actions.EditConsoleConfiguration; import org.hibernate.eclipse.console.utils.EclipseImages; import org.hibernate.eclipse.console.utils.LaunchHelper; import org.hibernate.eclipse.console.utils.ProjectUtils; import org.hibernate.eclipse.utils.HibernateEclipseUtils; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; public class HibernatePropertyPage extends PropertyPage { Control[] settings; private Button enableHibernate; private String initConsoleConfiguration; private Combo selectedConfiguration; private Link details; private Button enableNamingStrategy; private Label nsSeparator; private boolean initNamingStrategy, initEnableHibernate; private static final String NONE = "<None>"; //$NON-NLS-1$ /** * Constructor for SamplePropertyPage. */ public HibernatePropertyPage() { super(); } private void addLogoSection(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 2; composite.setLayout(layout); GridData data = new GridData(SWT.END,SWT.END, true, true); composite.setLayoutData(data); createLogoButtons(composite); } private void addFirstSection(Composite parent) { Composite composite = createDefaultComposite(parent,2); enableHibernate = new Button(composite, SWT.CHECK); enableHibernate.setText(HibernateConsoleMessages.HibernatePropertyPage_enable_hibernate3_support); enableHibernate.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { boolean selection = enableHibernate.getSelection(); enableSettings(selection); } }); } private void createLogoButtons(Composite composite) { Button hibernateLogoButton = new Button(composite, SWT.NULL); hibernateLogoButton.setImage(EclipseImages.getImage(ImageConstants.HIBERNATE_LOGO)); hibernateLogoButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { openBrowser("http://tools.hibernate.org"); //$NON-NLS-1$ } }); Button jbossLogoButton = new Button(composite, SWT.NULL); jbossLogoButton.setImage(EclipseImages.getImage(ImageConstants.JBOSS_LOGO)); jbossLogoButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { openBrowser("http://www.jboss.com/products/devstudio"); //$NON-NLS-1$ } }); } protected void openBrowser(String href) { IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport(); try { IWebBrowser browser = support.getExternalBrowser(); browser.openURL(new URL(urlEncode(href.toCharArray()))); } catch (MalformedURLException e) { openWebBrowserError(href, e); } catch (PartInitException e) { openWebBrowserError(href, e); } } private void openWebBrowserError(final String href, final Throwable t) { getShell().getDisplay().asyncExec(new Runnable() { public void run() { String title = HibernateConsoleMessages.HibernatePropertyPage_open_url; String msg = HibernateConsoleMessages.HibernatePropertyPage_unable_open_webbrowser_for_url + href; IStatus status = HibernateConsolePlugin.throwableToStatus(t); ErrorDialog.openError(getShell(), title, msg, status); } }); } private String urlEncode(char[] input) { StringBuffer retu = new StringBuffer(input.length); for (int i = 0; i < input.length; i++) { if (input[i] == ' ') retu.append("%20"); //$NON-NLS-1$ else retu.append(input[i]); } return retu.toString(); } private Label addSeparator(Composite parent) { Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.grabExcessHorizontalSpace = true; separator.setLayoutData(gridData); return separator; } private void addSecondSection(Composite parent) { // Label for owner field Label ownerLabel = new Label(parent, SWT.NONE); ownerLabel.setText(HibernateConsoleMessages.HibernatePropertyPage_default_hibernate_console_config); Composite settingsPart = createDefaultComposite(parent,2); selectedConfiguration = new Combo(settingsPart, SWT.DROP_DOWN | SWT.READ_ONLY); GridData gd = new GridData(); gd.widthHint = convertWidthInCharsToPixels(50); selectedConfiguration.setLayoutData(gd); selectedConfiguration.add(NONE); // Populate owner text field ConsoleConfiguration[] configurations = LaunchHelper.findFilteredSortedConsoleConfigs(); for (int i = 0; i < configurations.length; i++) { ConsoleConfiguration configuration = configurations[i]; selectedConfiguration.add(configuration.getName() ); } details = new Link(settingsPart, SWT.NONE); details.setText(HibernateConsoleMessages.HibernatePropertyPage_details); details.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { ConsoleConfiguration config = KnownConfigurations.getInstance().find(selectedConfiguration.getText()); if (config != null) { new EditConsoleConfiguration(config).run(); } } }); selectedConfiguration.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { details.setEnabled(selectedConfiguration.getSelectionIndex() != 0); } }); Composite settingsPart2 = createDefaultComposite(parent,2); enableNamingStrategy = new Button(settingsPart2, SWT.CHECK); enableNamingStrategy.setText(HibernateConsoleMessages.HibernatePropertyPage_use_naming_strategy); enableNamingStrategy.setSelection(initNamingStrategy); settings = new Control[] { ownerLabel, selectedConfiguration, details, enableNamingStrategy}; } /** * @see PreferencePage#createContents(Composite) */ protected Control createContents(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); composite.setLayout(layout); GridData data = new GridData(GridData.FILL); data.grabExcessHorizontalSpace = true; composite.setLayoutData(data); addFirstSection(composite); addSeparator(composite); addSecondSection(composite); addSeparator(composite); nsSeparator = addSeparator(composite); addLogoSection(composite); loadValues(); enableSettings(enableHibernate.getSelection() ); return composite; } private Composite createDefaultComposite(Composite parent, int numColumns) { Composite composite = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = numColumns; composite.setLayout(layout); GridData data = new GridData(); data.verticalAlignment = GridData.FILL; data.horizontalAlignment = GridData.FILL; composite.setLayoutData(data); return composite; } protected void performDefaults() { enableHibernate.setSelection(initEnableHibernate); enableNamingStrategy.setSelection(initNamingStrategy); selectedConfiguration.setText(initConsoleConfiguration); } private boolean isHibernateJpaProject(){ IProject project = getProject(); // if (!JpaFacet.isInstalled(project)) { /* Replaced previous line by next by Koen after Dali API changes */ if (!HibernateEclipseUtils.isJpaFacetInstalled(project)) { return false; } // String jpaPlatformId = JptJpaCorePlugin.getJpaPlatformId(project); /* Replaced previous line by next by Koen after Dali API changes */ String jpaPlatformId = HibernateEclipseUtils.getJpaPlatformID(project); return HibernatePropertiesConstants.HIBERNATE_JPA_PLATFORM_ID.equals(jpaPlatformId) || HibernatePropertiesConstants.HIBERNATE_JPA2_0_PLATFORM_ID.equals(jpaPlatformId) || HibernatePropertiesConstants.HIBERNATE_JPA2_1_PLATFORM_ID.equals(jpaPlatformId); } private IProject getProject() { IAdaptable adaptable= getElement(); if (adaptable != null) { IJavaElement elem= (IJavaElement) adaptable.getAdapter(IJavaElement.class); if (elem instanceof IJavaProject) { return ((IJavaProject) elem).getProject(); } } return null; } @Override public void setVisible(boolean visible) { //loadValues(); nsSeparator.setVisible(isHibernateJpaProject()); enableNamingStrategy.setVisible(isHibernateJpaProject()); super.setVisible(visible); } public void loadValues() { IProject project = getProject(); IScopeContext scope = new ProjectScope(project); Preferences node = scope.getNode(HibernatePropertiesConstants.HIBERNATE_CONSOLE_NODE); if(node!=null) { initEnableHibernate = node.getBoolean(HibernatePropertiesConstants.HIBERNATE3_ENABLED, false); enableHibernate.setSelection(initEnableHibernate); String cfg = node.get(HibernatePropertiesConstants.DEFAULT_CONFIGURATION, project.getName() ); ConsoleConfiguration configuration = KnownConfigurations.getInstance().find(cfg); if(configuration==null) { selectedConfiguration.select(0); details.setEnabled(false); } else { initConsoleConfiguration = cfg; selectedConfiguration.setText(cfg); } initNamingStrategy = node.getBoolean(HibernatePropertiesConstants.NAMING_STRATEGY_ENABLED, true); enableNamingStrategy.setSelection(initNamingStrategy); } } protected void rebildProjectIfJpa() { if (isHibernateJpaProject()){ final JpaProject.Reference reference = (Reference) getProject().getAdapter(Reference.class); final IWorkspaceRunnable wr = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { try { reference.rebuild(); } catch (InterruptedException e) { throw new CoreException(new Status(IStatus.CANCEL, HibernateConsolePlugin.ID, null, e)); } getProject().build(IncrementalProjectBuilder.FULL_BUILD, monitor); } }; IRunnableWithProgress op = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { IWorkspace ws = ResourcesPlugin.getWorkspace(); ws.run(wr, ws.getRoot(), IWorkspace.AVOID_UPDATE, monitor); } catch(CoreException e) { throw new InvocationTargetException(e); } } }; try{ new ProgressMonitorDialog(getShell()).run(true, false, op); } catch (InvocationTargetException e) { HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.HibernatePropertyPage_Error_updating_JpaProject, e); } catch (InterruptedException e) { HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.HibernatePropertyPage_Error_updating_JpaProject, e); } } } protected boolean saveNamigStrategyChanges(){ if (initNamingStrategy == enableNamingStrategy.getSelection()) return true; IScopeContext scope = new ProjectScope(getProject()); Preferences node = scope.getNode(HibernatePropertiesConstants.HIBERNATE_CONSOLE_NODE); if(node!=null) { node.putBoolean(HibernatePropertiesConstants.NAMING_STRATEGY_ENABLED, enableNamingStrategy.getSelection() ); try { node.flush(); return true; } catch (BackingStoreException e) { HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.ProjectUtils_could_not_save_changes_to_preferences, e); } } return false; } public boolean performOk() { ProjectUtils.toggleHibernateOnProject( getProject(), enableHibernate.getSelection(), selectedConfiguration.getSelectionIndex() != 0 ? selectedConfiguration.getText() : ""); //$NON-NLS-1$ saveNamigStrategyChanges(); if (enableHibernate.getSelection() != initEnableHibernate || initNamingStrategy != enableNamingStrategy.getSelection() || isConsoleConfigurationChanged()){ rebildProjectIfJpa(); } return true; } private void enableSettings(boolean selection) { for (int i = 0; i < settings.length; i++) { Control comp = settings[i]; comp.setEnabled(selection); } if (selection) { details.setEnabled(selectedConfiguration.getSelectionIndex() != 0); } } protected boolean isConsoleConfigurationChanged(){ if (initConsoleConfiguration == null ){ return selectedConfiguration.getSelectionIndex() == 0; } else { return !initConsoleConfiguration.equals(selectedConfiguration.getText()); } } }