Java tutorial
/* * 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.mapper.editors.reveng; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeSet; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.forms.DetailsPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.MasterDetailsBlock; import org.eclipse.ui.forms.SectionPart; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.hibernate.console.ConsoleConfiguration; import org.hibernate.console.KnownConfigurations; import org.hibernate.eclipse.console.model.IRevEngColumn; import org.hibernate.eclipse.console.model.IRevEngGenerator; import org.hibernate.eclipse.console.model.IRevEngParameter; import org.hibernate.eclipse.console.model.IRevEngPrimaryKey; import org.hibernate.eclipse.console.model.IRevEngTable; import org.hibernate.eclipse.console.model.IReverseEngineeringDefinition; import org.hibernate.eclipse.console.workbench.DeferredContentProvider; import org.hibernate.eclipse.console.workbench.LazyDatabaseSchema; import org.hibernate.eclipse.console.workbench.xpl.AnyAdaptableLabelProvider; import org.hibernate.eclipse.mapper.MapperMessages; import org.hibernate.eclipse.mapper.editors.ReverseEngineeringEditor; import org.hibernate.eclipse.mapper.editors.reveng.xpl.CheckedTreeSelectionDialog; import org.hibernate.eclipse.mapper.model.RevEngColumnAdapter; import org.hibernate.eclipse.mapper.model.RevEngGeneratorAdapter; import org.hibernate.eclipse.mapper.model.RevEngParamAdapter; import org.hibernate.eclipse.mapper.model.RevEngPrimaryKeyAdapter; import org.hibernate.eclipse.mapper.model.RevEngTableAdapter; import org.jboss.tools.hibernate.runtime.spi.IColumn; import org.jboss.tools.hibernate.runtime.spi.IPrimaryKey; import org.jboss.tools.hibernate.runtime.spi.IService; import org.jboss.tools.hibernate.runtime.spi.ITable; import org.jboss.tools.hibernate.runtime.spi.ITableIdentifier; public class TablePropertiesBlock extends MasterDetailsBlock { private TreeViewer viewer; private final ReverseEngineeringEditor editor; public TablePropertiesBlock(ReverseEngineeringEditor editor) { this.editor = editor; } public SashForm getComposite() { return sashForm; } protected void createMasterPart(final IManagedForm managedForm, Composite parent) { sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); FormToolkit toolkit = managedForm.getToolkit(); Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.FOCUS_TITLE | Section.TWISTIE | Section.EXPANDED); section.setText(MapperMessages.TablePropertiesBlock_tables_columns); section.setDescription(MapperMessages.TablePropertiesBlock_explicitly_control_settings_for_table_columns); section.marginWidth = 10; section.marginHeight = 5; toolkit.createCompositeSeparator(section); Composite client = toolkit.createComposite(section, SWT.WRAP); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginWidth = 0; layout.marginHeight = 0; client.setLayout(layout); Tree t = toolkit.createTree(client, SWT.NULL); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 20; gd.widthHint = 100; gd.verticalSpan = 2; t.setLayoutData(gd); toolkit.paintBordersFor(client); Button btnAdd = toolkit.createButton(client, MapperMessages.TablePropertiesBlock_add, SWT.PUSH); btnAdd.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { doAdd(); } }); gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); btnAdd.setLayoutData(gd); Button btnDel = toolkit.createButton(client, MapperMessages.TablePropertiesBlock_delete, SWT.PUSH); btnDel.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { doDelete(); } }); gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); btnDel.setLayoutData(gd); section.setClient(client); final SectionPart spart = new SectionPart(section) { public boolean setFormInput(Object input) { if (input instanceof IReverseEngineeringDefinition) { viewer.setInput(input); return true; } return false; } }; managedForm.addPart(spart); viewer = new TreeViewer(t); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { managedForm.fireSelectionChanged(spart, event.getSelection()); } }); viewer.setLabelProvider(new TablePropertiesLabelProvider()); TablePropertiesContentProvider tablePropertiesContentProvider = new TablePropertiesContentProvider(); viewer.setContentProvider(tablePropertiesContentProvider); } protected void doAdd() { CheckedTreeSelectionDialog dialog = createTreeSelectionDialog(); LazyDatabaseSchema lds = editor.getLazyDatabaseSchema(); Map<ITableIdentifier, ITable> tables = new HashMap<ITableIdentifier, ITable>(); Map<ITableIdentifier, List<IColumn>> columns = new HashMap<ITableIdentifier, List<IColumn>>(); if (lds == null) { String tableName = "", namePrefix = "TABLE_"; //$NON-NLS-1$ //$NON-NLS-2$ IRevEngTable retable = editor.getReverseEngineeringDefinition().createTable(); retable.setCatalog(""); //$NON-NLS-1$ retable.setSchema(""); //$NON-NLS-1$ TreeSet<String> ts = new TreeSet<String>(); IRevEngTable[] retables = editor.getReverseEngineeringDefinition().getTables(); char separartor = '%'; for (int i = 0; i < retables.length; i++) { ts.add(retables[i].getCatalog() + separartor + retables[i].getSchema() + separartor + retables[i].getName()); } String strCatalogSchema = retable.getCatalog() + separartor + retable.getSchema() + separartor; int i = 0; do { tableName = namePrefix + (i++); } while (ts.contains(strCatalogSchema + tableName)); retable.setName(tableName); editor.getReverseEngineeringDefinition().addTable(retable); } else { dialog.setTitle(MapperMessages.TablePropertiesBlock_add_tables_columns); dialog.setMessage(MapperMessages.TablePropertiesBlock_select_tables_columns); dialog.setInput(lds); dialog.setContainerMode(true); dialog.open(); Object[] result = dialog.getResult(); ITableIdentifier lastTable = null; if (result != null) { for (int i = 0; i < result.length; i++) { Object object = result[i]; if (object instanceof ITable) { ITable table = (ITable) object; tables.put(getService().createTableIdentifier(table), table); lastTable = getService().createTableIdentifier(table); } else if (object instanceof IColumn) { IColumn column = (IColumn) object; List<IColumn> existing = columns.get(lastTable); if (existing == null) { existing = new ArrayList<IColumn>(); columns.put(lastTable, existing); } existing.add(column); } else if (object instanceof IPrimaryKey) { List<IColumn> existing = columns.get(lastTable); if (existing == null) { existing = new ArrayList<IColumn>(); columns.put(lastTable, existing); } existing.addAll(((IPrimaryKey) object).getColumns()); } } } Iterator<Map.Entry<ITableIdentifier, ITable>> iterator = tables.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<ITableIdentifier, ITable> element = iterator.next(); ITable table = (ITable) element.getValue(); IRevEngTable retable = null; // editor.getReverseEngineeringDefinition().findTable(TableIdentifier.create(table)); if (retable == null) { retable = editor.getReverseEngineeringDefinition().createTable(); retable.setCatalog(table.getCatalog()); retable.setSchema(table.getSchema()); retable.setName(table.getName()); editor.getReverseEngineeringDefinition().addTable(retable); } List<IColumn> columnList = columns.get(element.getKey()); if (columnList != null) { Iterator<IColumn> colIterator = columnList.iterator(); while (colIterator.hasNext()) { IColumn column = colIterator.next(); IRevEngColumn revCol = editor.getReverseEngineeringDefinition().createColumn(); revCol.setName(column.getName()); if (column.getSqlType() != null) { revCol.setJDBCType(column.getSqlType()); // TODO: should not be required } retable.addColumn(revCol); } } } //editor.getReverseEngineeringDefinition(); } } protected void doDelete() { ISelection sel = viewer.getSelection(); if (sel.isEmpty() || !(sel instanceof TreeSelection)) { return; } boolean updateSelection = false; TreeSelection ts = (TreeSelection) sel; List<?> list = ts.toList(); for (Iterator<?> it = list.iterator(); it.hasNext();) { Object obj = it.next(); if (obj instanceof IRevEngTable) { IRevEngTable retable = (IRevEngTable) obj; if (retable instanceof RevEngTableAdapter) { updateSelection = true; } editor.getReverseEngineeringDefinition().removeTable(retable); } else if (obj instanceof IRevEngColumn) { IRevEngColumn recolumn = (IRevEngColumn) obj; if (recolumn instanceof RevEngColumnAdapter) { updateSelection = true; } editor.getReverseEngineeringDefinition().removeColumn(recolumn); } else if (obj instanceof IRevEngPrimaryKey) { IRevEngPrimaryKey reprimaryKey = (IRevEngPrimaryKey) obj; if (reprimaryKey instanceof RevEngPrimaryKeyAdapter) { updateSelection = true; } editor.getReverseEngineeringDefinition().removePrimaryKey(reprimaryKey); } else if (obj instanceof IRevEngGenerator) { IRevEngGenerator regenerator = (IRevEngGenerator) obj; if (regenerator instanceof RevEngGeneratorAdapter) { updateSelection = true; } editor.getReverseEngineeringDefinition().removeGenerator(regenerator); } else if (obj instanceof IRevEngParameter) { IRevEngParameter reparam = (IRevEngParameter) obj; if (reparam instanceof RevEngParamAdapter) { updateSelection = true; } editor.getReverseEngineeringDefinition().removeParameter(reparam); } } if (updateSelection) { // if it possible select first item TreeItem[] treeItems = viewer.getTree().getItems(); if (treeItems.length > 0) { viewer.getTree().setSelection(treeItems[0]); } } } private CheckedTreeSelectionDialog createTreeSelectionDialog() { return new CheckedTreeSelectionDialog(getComposite().getShell(), new AnyAdaptableLabelProvider(), new DeferredContentProvider()) { protected Composite createSelectionButtons(Composite composite) { Composite buttonComposite = new Composite(composite, SWT.RIGHT); GridLayout layout = new GridLayout(); layout.numColumns = 2; buttonComposite.setLayout(layout); buttonComposite.setFont(composite.getFont()); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL); data.grabExcessHorizontalSpace = true; composite.setData(data); Button selectButton = createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, MapperMessages.TablePropertiesBlock_select_all_children, false); SelectionListener listener = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IStructuredSelection viewerElements = (IStructuredSelection) getTreeViewer().getSelection(); Iterator<?> iterator = viewerElements.iterator(); while (iterator.hasNext()) { getTreeViewer().setSubtreeChecked(iterator.next(), true); } updateOKStatus(); } }; selectButton.addSelectionListener(listener); Button deselectButton = createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, MapperMessages.TablePropertiesBlock_deselect_all, false); listener = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { getTreeViewer().setCheckedElements(new Object[0]); updateOKStatus(); } }; deselectButton.addSelectionListener(listener); return buttonComposite; } protected boolean evaluateIfTreeEmpty(Object input) { return false; } }; } protected void createToolBarActions(IManagedForm managedForm) { final ScrolledForm form = managedForm.getForm(); Action haction = new Action("hor", IAction.AS_RADIO_BUTTON) { //$NON-NLS-1$ public void run() { sashForm.setOrientation(SWT.HORIZONTAL); form.reflow(true); } }; haction.setChecked(true); haction.setToolTipText(MapperMessages.TablePropertiesBlock_horizontal_orientation); Action vaction = new Action("ver", IAction.AS_RADIO_BUTTON) { //$NON-NLS-1$ public void run() { sashForm.setOrientation(SWT.VERTICAL); form.reflow(true); } }; vaction.setChecked(false); vaction.setToolTipText(MapperMessages.TablePropertiesBlock_vertical_orientation); form.getToolBarManager().add(haction); form.getToolBarManager().add(vaction); } protected void registerPages(DetailsPart dp) { dp.registerPage(RevEngColumnAdapter.class, new ColumnDetailsPage()); dp.registerPage(RevEngTableAdapter.class, new TableDetailsPage()); dp.registerPage(RevEngGeneratorAdapter.class, new GeneratorDetailsPage()); dp.registerPage(RevEngParamAdapter.class, new ParamDetailsPage()); dp.registerPage(RevEngPrimaryKeyAdapter.class, new PrimaryKeyDetailsPage()); //dp.registerPage( org.hibernate.mapping.Table.class, new TypeOneDetailsPage() ); } private IService getService() { String consoleConfigurationName = editor.getConsoleConfigurationName(); ConsoleConfiguration consoleConfiguration = KnownConfigurations.getInstance() .find(consoleConfigurationName); return consoleConfiguration.getHibernateExtension().getHibernateService(); } }