Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java?rev=426358&r1=426357&r2=426358&view=diff ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java (original) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java Thu Jul 27 19:18:00 2006 @@ -19,10 +19,12 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.cayenne.ropbrowser.commands.HideElementCommand; +import org.apache.cayenne.ropbrowser.figures.ElementFigure; import org.apache.cayenne.ropbrowser.layout.DelegatingLayoutManager; import org.apache.cayenne.ropbrowser.model.ElementDiagram; import org.apache.cayenne.ropbrowser.model.ModelElement; @@ -32,6 +34,7 @@ import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.MarginBorder; +import org.eclipse.draw2d.PolylineConnection; import org.eclipse.draw2d.ShortestPathConnectionRouter; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; @@ -137,7 +140,11 @@ hideNullObjects(); } else if (ElementDiagram.PROP_ROLLBACK.equals(prop)) { - refreshVisuals(); + // TODO deal with undone new elements, changes etc + for (Object o : getChildren()) { + ElementFigure figure = (ElementFigure) ((ElementEditPart) o).getFigure(); + figure.refresh(); + } } }
Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementEditPart.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementEditPart.java?rev=426358&r1=426357&r2=426358&view=diff ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementEditPart.java (original) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementEditPart.java Thu Jul 27 19:18:00 2006 @@ -20,12 +20,15 @@ import java.beans.PropertyChangeListener; import java.util.List; -import org.apache.cayenne.ropbrowser.actions.DeleteAction; import org.apache.cayenne.ropbrowser.actions.HideAction; import org.apache.cayenne.ropbrowser.actions.InsertAction; +import org.apache.cayenne.ropbrowser.actions.RemoveAction; +import org.apache.cayenne.ropbrowser.commands.ExistingObjectCommand; +import org.apache.cayenne.ropbrowser.commands.ExistingObjectRequest; import org.apache.cayenne.ropbrowser.commands.HideElementCommand; -import org.apache.cayenne.ropbrowser.commands.DeleteObjectCommand; import org.apache.cayenne.ropbrowser.commands.ObjectInsertCommand; +import org.apache.cayenne.ropbrowser.commands.RemoveObjectCommand; +import org.apache.cayenne.ropbrowser.figures.ElementFigure; import org.apache.cayenne.ropbrowser.model.ModelElement; import org.apache.cayenne.ropbrowser.policies.ElementEditPolicy; import org.eclipse.draw2d.ChopboxAnchor; @@ -35,12 +38,14 @@ import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.EditPolicy; -import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; +import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy; +import org.eclipse.gef.requests.CreateConnectionRequest; +import org.eclipse.gef.requests.ReconnectRequest; /** * Base abstract EditPart class corresponding to org.apache.cayenne.ropbrowser.model.ModelElement. @@ -80,6 +85,7 @@ protected void createEditPolicies() { // allow removal of the associated model element installEditPolicy(EditPolicy.COMPONENT_ROLE, new ElementEditPolicy()); + installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ElementNodeEditPolicy()); } /** @@ -96,10 +102,16 @@ } else if (ModelElement.PROP_SOURCE_CONN.equals(prop)) { refreshSourceConnections(); + // in case relationship button states have changed + ((ElementFigure) getFigure()).refresh(); } else if (ModelElement.PROP_TARGET_CONN.equals(prop)) { refreshTargetConnections(); } + else { + // for any other kind of property change, refresh the figure + ((ElementFigure) getFigure()).refresh(); + } } /** @@ -192,10 +204,41 @@ if (request.getType().equals(InsertAction.INSERT_REQUEST)) { return new ObjectInsertCommand(this.getModelCast()); } + if (request.getType().equals(RemoveAction.REMOVE_REQUEST)) { + return new RemoveObjectCommand(this.getModelCast()); + } + if (request.getType().equals(ExistingObjectRequest.EXISTING_REQUEST)) { + return new ExistingObjectCommand(this.getModelCast(), ((ExistingObjectRequest) request).getSelectedObject()); + } return super.getCommand(request); } public boolean isRoot() { return getModelCast().isRoot(); + } + + // TODO allow reconnections? + class ElementNodeEditPolicy extends GraphicalNodeEditPolicy { + + @Override + protected Command getConnectionCompleteCommand(CreateConnectionRequest request) { + return null; + } + + @Override + protected Command getConnectionCreateCommand(CreateConnectionRequest request) { + return null; + } + + @Override + protected Command getReconnectSourceCommand(ReconnectRequest request) { + return null; + } + + @Override + protected Command getReconnectTargetCommand(ReconnectRequest request) { + return null; + } + } } Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/SingleEditPart.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/SingleEditPart.java?rev=426358&r1=426357&r2=426358&view=diff ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/SingleEditPart.java (original) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/SingleEditPart.java Thu Jul 27 19:18:00 2006 @@ -20,6 +20,8 @@ import org.apache.cayenne.ropbrowser.actions.DeleteAction; import org.apache.cayenne.ropbrowser.commands.ContractRelationshipCommand; +import org.apache.cayenne.ropbrowser.commands.ExistingObjectCommand; +import org.apache.cayenne.ropbrowser.commands.ExistingObjectRequest; import org.apache.cayenne.ropbrowser.commands.HideElementCommand; import org.apache.cayenne.ropbrowser.commands.ExpandRelationshipCommand; import org.apache.cayenne.ropbrowser.commands.DeleteObjectCommand; @@ -71,19 +73,6 @@ SingleFigure figure = new SingleFigure(this); return figure; - } - - /** - * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent evt) { - super.propertyChange(evt); - - String prop = evt.getPropertyName(); - - if (!ModelElement.PROP_BOUNDS.equals(prop) && !ModelElement.PROP_TARGET_CONN.equals(prop)) { - ((ElementFigure) getFigure()).refresh(); - } } private SingleModelElement getModelCast() { Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementXYLayoutEditPolicy.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementXYLayoutEditPolicy.java?rev=426358&r1=426357&r2=426358&view=diff ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementXYLayoutEditPolicy.java (original) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementXYLayoutEditPolicy.java Thu Jul 27 19:18:00 2006 @@ -39,10 +39,6 @@ */ public class ElementXYLayoutEditPolicy extends XYLayoutEditPolicy { - protected Command createAddCommand(EditPart child, Object constraint) { - return null; - } - /** * @see ConstrainedLayoutEditPolicy#createChangeConstraintCommand(ChangeBoundsRequest, EditPart, Object) */ @@ -104,5 +100,4 @@ protected Command getDeleteDependantCommand(Request request) { return null; } - } Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SelectionHandlesEditPolicy.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SelectionHandlesEditPolicy.java?rev=426358&r1=426357&r2=426358&view=diff ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SelectionHandlesEditPolicy.java (original) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SelectionHandlesEditPolicy.java Thu Jul 27 19:18:00 2006 @@ -49,4 +49,6 @@ protected Command getMoveChildrenCommand(Request request) { return null; } + + } Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/views/ControlPanelView.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/views/ControlPanelView.java?rev=426358&r1=426357&r2=426358&view=diff ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/views/ControlPanelView.java (original) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/views/ControlPanelView.java Thu Jul 27 19:18:00 2006 @@ -16,12 +16,15 @@ */ package org.apache.cayenne.ropbrowser.views; +import java.util.HashMap; import java.util.Iterator; import org.apache.cayenne.ropbrowser.ConnectionManager; import org.apache.cayenne.ropbrowser.ObjectEditor; import org.apache.cayenne.ropbrowser.ObjectEditorInput; import org.apache.cayenne.ropbrowser.ROPBrowserPlugin; +import org.apache.cayenne.ropbrowser.wizards.SelectQueryWizard; +import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.SelectionEvent; @@ -30,14 +33,24 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PartInitException; +import org.eclipse.ui.forms.widgets.ColumnLayout; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.part.ViewPart; import org.objectstyle.cayenne.ObjectContext; +import org.objectstyle.cayenne.exp.Expression; +import org.objectstyle.cayenne.exp.ExpressionFactory; import org.objectstyle.cayenne.map.EntityResolver; +import org.objectstyle.cayenne.map.ObjEntity; +import org.objectstyle.cayenne.query.NamedQuery; import org.objectstyle.cayenne.query.Query; +import org.objectstyle.cayenne.query.SelectQuery; +import org.objectstyle.cayenne.util.Util; /** * An Eclipse view for connecting to the Cayenne web service and launching queries. @@ -56,18 +69,27 @@ private FormToolkit toolkit; private Form form; /** server to connect to */ - private CCombo serverText; + private CCombo serverCombo; /** button initiates connection */ private Button connectButton; + /** dropdown for selecting a query to run */ - private CCombo queryCombo; + private CCombo namedQueryCombo; /** button to launch query editor */ - private Button runQueryButton; - - private Button xmppEnabledButton; + private Button runNamedQueryButton; + + private CCombo selectQueryCombo; + private Button parametersButton; + private Button runSelectQueryButton; + + private Button newDiagramButton; /** manages connections to the server */ private ConnectionManager connectionManager; + + private ObjectEditor lastEditor; + + private SelectQueryWizard selectWizard; public ControlPanelView() { connectionManager = ConnectionManager.getInstance(); @@ -80,34 +102,77 @@ toolkit = new FormToolkit(parent.getDisplay()); form = toolkit.createForm(parent); - GridLayout layout = new GridLayout(3, false); - layout.horizontalSpacing = 10; - layout.verticalSpacing = 10; + ColumnLayout layout = new ColumnLayout(); + layout.maxNumColumns = 4; form.getBody().setLayout(layout); - - toolkit.createLabel(form.getBody(), "Server"); - serverText = new CCombo(form.getBody(), SWT.FLAT); - serverText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + + // Create the server section + Section serverSection = toolkit.createSection(form.getBody(), Section.TITLE_BAR | Section.EXPANDED); + serverSection.setText("Server"); + Composite serverComposite = toolkit.createComposite(serverSection); + serverComposite.setLayout(new GridLayout()); + + serverCombo = new CCombo(serverComposite, SWT.FLAT); + serverCombo.setLayoutData(new GridData(SWT.FILL, SWT.NULL, true, false)); String defaultServer = ROPBrowserPlugin.getDefault().getPluginPreferences().getString(PREF_SERVER); if (defaultServer != null) { - serverText.add(defaultServer); - serverText.setText(defaultServer); + serverCombo.add(defaultServer); + serverCombo.setText(defaultServer); } - - connectButton = toolkit.createButton(form.getBody(), "Connect", SWT.PUSH); + connectButton = toolkit.createButton(serverComposite, "Connect", SWT.PUSH); connectButton.addSelectionListener(this); - queryCombo = new CCombo(form.getBody(), SWT.READ_ONLY | SWT.FLAT); - GridData data = new GridData(SWT.FILL, SWT.NULL, true, false); - data.horizontalSpan = 2; - queryCombo.setLayoutData(data); - queryCombo.addSelectionListener(this); + serverSection.setClient(serverComposite); + + // create the named query section + Section namedQuerySection = toolkit.createSection(form.getBody(), Section.TITLE_BAR | Section.EXPANDED); + namedQuerySection.setText("Named Query"); + Composite namedQueryComposite = toolkit.createComposite(namedQuerySection); + namedQueryComposite.setLayout(new GridLayout()); + + namedQueryCombo = new CCombo(namedQueryComposite, SWT.READ_ONLY | SWT.FLAT); + namedQueryCombo.setLayoutData(new GridData(SWT.FILL, SWT.NULL, true, false)); + + runNamedQueryButton = toolkit.createButton(namedQueryComposite, "Run", SWT.PUSH); + runNamedQueryButton.addSelectionListener(this); + + namedQuerySection.setClient(namedQueryComposite); + + // create the select query section + Section selectQuerySection = toolkit.createSection(form.getBody(), Section.TITLE_BAR | Section.EXPANDED); + selectQuerySection.setText("Select Query"); + Composite selectQueryComposite = toolkit.createComposite(selectQuerySection); + selectQueryComposite.setLayout(new GridLayout()); + + selectQueryCombo = new CCombo(selectQueryComposite, SWT.READ_ONLY | SWT.FLAT); + selectQueryCombo.setLayoutData(new GridData(SWT.FILL, SWT.NULL, true, false)); + + parametersButton = toolkit.createButton(selectQueryComposite, "Parameters...", SWT.PUSH); + parametersButton.addSelectionListener(this); + + runSelectQueryButton = toolkit.createButton(selectQueryComposite, "Run", SWT.PUSH); + runSelectQueryButton.addSelectionListener(this); + + selectQuerySection.setClient(selectQueryComposite); + + // create the misc section + Section miscSection = toolkit.createSection(form.getBody(), Section.TITLE_BAR | Section.EXPANDED); + miscSection.setText("Other Settings"); + Composite miscComposite = toolkit.createComposite(miscSection); + miscComposite.setLayout(new GridLayout()); - runQueryButton = toolkit.createButton(form.getBody(), "Run", SWT.PUSH); - runQueryButton.addSelectionListener(this); + newDiagramButton = toolkit.createButton(miscComposite, "Display in new editor", SWT.CHECK); + newDiagramButton.setSelection(true); + + miscSection.setClient(miscComposite); toolkit.paintBordersFor(form.getBody()); - form.getBody().pack(); + toolkit.paintBordersFor(serverComposite); + toolkit.paintBordersFor(namedQueryComposite); + toolkit.paintBordersFor(selectQueryComposite); + toolkit.paintBordersFor(miscComposite); + + form.getBody().pack(); } @Override @@ -120,29 +185,88 @@ */ public void widgetSelected(SelectionEvent e) { if (e.getSource() == connectButton) { - queryCombo.removeAll(); + namedQueryCombo.removeAll(); - if (serverText.indexOf(serverText.getText()) == -1) { - serverText.add(serverText.getText()); + if (serverCombo.indexOf(serverCombo.getText()) == -1) { + serverCombo.add(serverCombo.getText()); } - ROPBrowserPlugin.getDefault().getPluginPreferences().setValue(PREF_SERVER, serverText.getText()); + ROPBrowserPlugin.getDefault().getPluginPreferences().setValue(PREF_SERVER, serverCombo.getText()); - ObjectContext currentContext = connectionManager.getObjectContext(serverText.getText()); + ObjectContext currentContext = connectionManager.getNewObjectContext(serverCombo.getText()); // get all the queries for this connection EntityResolver entityResolver = currentContext.getEntityResolver(); Iterator i = entityResolver.getQueries().iterator(); while (i.hasNext()) { - queryCombo.add(((Query)i.next()).getName()); + namedQueryCombo.add(((Query)i.next()).getName()); + } + + i = entityResolver.getObjEntities().iterator(); + while (i.hasNext()) { + selectQueryCombo.add(((ObjEntity)i.next()).getName()); + } + } + else if (e.getSource() == runNamedQueryButton) { + if (namedQueryCombo.indexOf(namedQueryCombo.getText()) != -1) { + ObjectContext context = getObjectContext(); + NamedQuery select = new NamedQuery(namedQueryCombo.getText()); + Object matches = context.performQuery(select); + + displayInEditor(context, matches); + } + } + else if (e.getSource() == parametersButton && selectQueryCombo.indexOf(selectQueryCombo.getText()) != -1) { + if (selectWizard == null) { + selectWizard = new SelectQueryWizard(connectionManager.getNewObjectContext(serverCombo.getText()), selectQueryCombo.getText(), SelectQueryWizard.RETURN_PARAMS); } + WizardDialog dialog = new WizardDialog(getViewSite().getShell(), selectWizard); + dialog.create(); + dialog.open(); } - else if (e.getSource() == runQueryButton) { - try { - getViewSite().getPage().openEditor(new ObjectEditorInput(this.connectionManager.getObjectContext(serverText.getText()), queryCombo.getText()), ObjectEditor.ID, true); - } catch (PartInitException ex) { - System.out.println(ex.getMessage()); + else if (e.getSource() == runSelectQueryButton) { + if (selectQueryCombo.indexOf(selectQueryCombo.getText()) != -1) { + ObjectContext context = getObjectContext(); + Object matches; // TODO allow initialisation of wizard values + if (selectWizard != null && selectWizard.getEntityName().equals(selectQueryCombo.getText())) { + String [] paramNames = selectWizard.getParameterNames(); + Object [] paramValues = selectWizard.getParameterValues(); + + matches = context.performQuery(new SelectQuery(selectQueryCombo.getText(), ExpressionFactory.matchAllExp(Util.toMap(paramNames, paramValues), Expression.EQUAL_TO))); + } + else { + matches = context.performQuery(new SelectQuery(selectQueryCombo.getText())); + } + + displayInEditor(context, matches); + } + } + } + + private ObjectContext getObjectContext() { + // TODO more efficient method? + ObjectContext context; + if (newDiagramButton.getSelection()) { + context = this.connectionManager.getNewObjectContext(serverCombo.getText()); + } + else { + context = lastEditor.getDiagram().getObjectContext(); + } + return context; + } + + private void displayInEditor(ObjectContext context, Object matches) { + // TODO what if the editor has been shut? + // TODO can only open in same window if same server + // TODO new context option + // TODO XMPP on/off option + try { + if (lastEditor == null || newDiagramButton.getSelection()) { + lastEditor = (ObjectEditor) getViewSite().getPage().openEditor(new ObjectEditorInput(context), ObjectEditor.ID, true); } + lastEditor.getDiagram().addRootElement(matches); + } catch (PartInitException ex) { + System.out.println(ex.getMessage()); } } Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectObjectPage.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectObjectPage.java?rev=426358&view=auto ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectObjectPage.java (added) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectObjectPage.java Thu Jul 27 19:18:00 2006 @@ -0,0 +1,191 @@ +/* + * Copyright 2006 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cayenne.ropbrowser.wizards; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import org.apache.cayenne.ropbrowser.model.AbstractObject; +import org.eclipse.draw2d.ColorConstants; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CCombo; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.ControlListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +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.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; +import org.objectstyle.cayenne.ObjectContext; +import org.objectstyle.cayenne.exp.Expression; +import org.objectstyle.cayenne.exp.ExpressionFactory; +import org.objectstyle.cayenne.map.EntityResolver; +import org.objectstyle.cayenne.map.ObjAttribute; +import org.objectstyle.cayenne.map.ObjEntity; +import org.objectstyle.cayenne.query.NamedQuery; +import org.objectstyle.cayenne.query.Query; +import org.objectstyle.cayenne.query.SelectQuery; +import org.objectstyle.cayenne.util.Util; + +public class SelectObjectPage extends WizardPage implements SelectionListener, ControlListener { + + private ObjectContext context; + + private String entityName; + + private Table objectTable; + + private String[] paramNames; + private Object[] paramValues; + + public SelectObjectPage(String pageName, ObjectContext context, String entityName) { + super(pageName); + this.context = context; + this.entityName = entityName; + } + + public void createControl(Composite parent) { + setTitle("Select object"); + setMessage("Select the desired object from the list"); + + Composite base = new Composite(parent, SWT.NULL); + + setControl(base); + + GridLayout layout = new GridLayout(); + layout.horizontalSpacing = 20; + layout.verticalSpacing = 10; + GridData fillGrab = new GridData(SWT.FILL, SWT.FILL, true, true); + + objectTable = new Table(base, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL); + objectTable.setHeaderVisible(true); + objectTable.setLinesVisible(true); + objectTable.setLayoutData(fillGrab); + objectTable.addSelectionListener(this); + objectTable.addControlListener(this); + + // get the attributes for this entity + EntityResolver entityResolver = context.getEntityResolver(); + ObjEntity entity = entityResolver.getObjEntity(entityName); + Iterator i = entity.getAttributes().iterator(); + while (i.hasNext()) { + TableColumn column = new TableColumn(objectTable, SWT.NULL); + ObjAttribute attribute = (ObjAttribute) i.next(); + column.setText(attribute.getName()); + } + + base.setLayout(layout); + + setPageComplete(true); + } + + public void widgetDefaultSelected(SelectionEvent e) { + } + + public void widgetSelected(SelectionEvent e) { + TableItem[] selection = objectTable.getSelection(); + if (selection != null && selection.length > 0) { + ((SelectQueryWizard) getWizard()).setSelectedObject((AbstractObject) selection[0].getData()); + } + } + + public void controlResized(ControlEvent e) { + // handle the sizing of the table columns + Point size = objectTable.getSize(); + size.x -= objectTable.getBorderWidth(); + if (objectTable.getVerticalBar() != null) { + size.x -= objectTable.getVerticalBar().getSize().x; + } + + for (TableColumn col : objectTable.getColumns()) { + col.setWidth((int) size.x/3); + } + } + + public void controlMoved(ControlEvent e) { + } + + public void onEnterPage() { + if (getNewValues()) { + objectTable.removeAll(); + + EntityResolver entityResolver = context.getEntityResolver(); + ObjEntity entity = entityResolver.getObjEntity(entityName); + + Expression qual = ExpressionFactory.matchAllExp(Util.toMap(paramNames, paramValues), Expression.EQUAL_TO); + SelectQuery query = new SelectQuery(entity.getJavaClass(), qual); + + Object matches = this.context.performQuery(query); + + if (matches instanceof List) { + for (Object o : (List) matches) { + AbstractObject abstractObject = (AbstractObject) o; + TableItem item = new TableItem(objectTable, SWT.NULL); + int i = 0; + for (TableColumn col : objectTable.getColumns()) { + item.setText(i++, abstractObject.getPropertyValue(col.getText()).toString()); + item.setData(abstractObject); + } + } + } + if (matches instanceof AbstractObject) { + AbstractObject abstractObject = (AbstractObject) matches; + TableItem item = new TableItem(objectTable, SWT.NULL); + int i = 0; + for (TableColumn col : objectTable.getColumns()) { + item.setText(i++, abstractObject.getPropertyValue(col.getText()).toString()); + item.setData(abstractObject); + } + } + controlResized(null); + if (objectTable.getItemCount() > 0) { + objectTable.select(0); + objectTable.setFocus(); + widgetSelected(null); + } + } + } + + private boolean getNewValues() { + SelectQueryWizard wizard = (SelectQueryWizard) getWizard(); + String [] newParamNames = wizard.getParameterNames(); + Object [] newParamValues = wizard.getParameterValues(); + + if (Arrays.equals(paramNames, newParamNames) + && Arrays.equals(paramValues, newParamValues)) { + return false; + } + + paramNames = newParamNames; + paramValues = newParamValues; + + return true; + } +} Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectParametersPage.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectParametersPage.java?rev=426358&view=auto ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectParametersPage.java (added) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectParametersPage.java Thu Jul 27 19:18:00 2006 @@ -0,0 +1,220 @@ +/* + * Copyright 2006 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cayenne.ropbrowser.wizards; + +import java.util.ArrayList; +import java.util.Iterator; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.wizard.IWizardPage; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CCombo; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.ControlListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +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.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; +import org.objectstyle.cayenne.ObjectContext; +import org.objectstyle.cayenne.map.EntityResolver; +import org.objectstyle.cayenne.map.ObjAttribute; +import org.objectstyle.cayenne.map.ObjEntity; +import org.objectstyle.cayenne.query.NamedQuery; +import org.objectstyle.cayenne.query.Query; + +public class SelectParametersPage extends WizardPage implements SelectionListener, ControlListener { + + private ObjectContext context; + + private String entityName; + + private Table attributeTable; + private TableColumn attributeName; + private TableColumn attributeType; + + private Button setButton; + + private Text parameterValue; + + private Label errorLabel; + + public SelectParametersPage(String pageName, ObjectContext context, String entityName) { + super(pageName); + this.context = context; + this.entityName = entityName; + } + + public void createControl(Composite parent) { + setTitle("Enter parameters"); + setMessage("Select the parameters to use to retrieve a list of objects"); + + Composite base = new Composite(parent, SWT.NULL); + + setControl(base); + + GridLayout layout = new GridLayout(); + layout.horizontalSpacing = 20; + layout.verticalSpacing = 10; + layout.numColumns = 2; + GridData fillSpan = new GridData(SWT.FILL, SWT.NULL, false, false); + fillSpan.horizontalSpan = 2; + GridData fillGrab = new GridData(SWT.FILL, SWT.NULL, true, false); + + attributeTable = new Table(base, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL); + attributeTable.setHeaderVisible(true); + attributeTable.setLinesVisible(true); + attributeTable.setLayoutData(fillSpan); + attributeTable.addSelectionListener(this); + attributeTable.addControlListener(this); + + attributeName = new TableColumn(attributeTable, SWT.NULL); + attributeName.setText("Attribute Name"); + attributeType = new TableColumn(attributeTable, SWT.NULL); + attributeType.setText("Attribute Type"); + + // get the attributes for this entity + EntityResolver entityResolver = context.getEntityResolver(); + ObjEntity entity = entityResolver.getObjEntity(entityName); + Iterator i = entity.getAttributes().iterator(); + while (i.hasNext()) { + TableItem item = new TableItem(attributeTable, SWT.NULL); + ObjAttribute attribute = (ObjAttribute) i.next(); + item.setText(new String[] {attribute.getName(), attribute.getType()}); + } + + parameterValue = new Text(base, SWT.SINGLE | SWT.BORDER); + parameterValue.setLayoutData(fillGrab); + parameterValue.addSelectionListener(this); + + setButton = new Button(base, SWT.PUSH | SWT.BORDER); + setButton.setText("Set"); + setButton.addSelectionListener(this); + + errorLabel = new Label(base, SWT.NULL); + errorLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); + errorLabel.setLayoutData(fillSpan); + + base.setLayout(layout); + + setPageComplete(true); + } + + public IWizardPage getNextPage() { + SelectObjectPage page2 = ((SelectQueryWizard) getWizard()).getPage2(); + page2.onEnterPage(); + return page2; + } + + // override to avoid getNextPage being called + public boolean canFlipToNextPage() { + return isPageComplete() && isNextPage(); + } + + private boolean isNextPage() { + return (super.getNextPage() == null); + } + + public void widgetDefaultSelected(SelectionEvent e) { + if (e.getSource() == parameterValue) { + setParameterValue(); + } + } + + public void widgetSelected(SelectionEvent e) { + errorLabel.setText(""); + if (e.getSource() == attributeTable) { + TableItem [] selection = attributeTable.getSelection(); + if (selection[0].getData() != null) { + parameterValue.setText(selection[0].getData().toString()); + } + parameterValue.setFocus(); + } + else if (e.getSource() == setButton) { + setParameterValue(); + } + } + + private void setParameterValue() { + TableItem [] selection = attributeTable.getSelection(); + if (selection != null && selection.length != 0) { + if (parameterValue.getText() != null && parameterValue.getText().trim().length() != 0) { + try { + Class typeClass = Class.forName(selection[0].getText(1)); + Object value = typeClass.getConstructor(Class.forName("java.lang.String")).newInstance(parameterValue.getText()); + selection[0].setData(value); + selection[0].setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)); + } + catch (Exception ex) { + errorLabel.setText("Error setting parameter value: could not be converted from String"); + } + } + else { + selection[0].setData(null); + selection[0].setBackground(attributeTable.getBackground()); + } + } + } + + public void controlResized(ControlEvent e) { + if (e.getSource() == attributeTable) { + Point size; + + // handle the sizing of the table columns + size = attributeTable.getSize(); + size.x -= attributeTable.getBorderWidth(); + if (attributeTable.getVerticalBar() != null) { + size.x -= attributeTable.getVerticalBar().getSize().x; + } + + attributeName.setWidth((int) (size.x/2)); + attributeType.setWidth((int) (size.x/2)); + } + } + + public void controlMoved(ControlEvent e) { + } + + public String[] getParameterNames() { + ArrayList<String> names = new ArrayList<String>(); + for (TableItem item : attributeTable.getItems()) { + if (item.getData() != null) { + names.add(item.getText(0)); + } + } + return names.toArray(new String[names.size()]); + } + + public Object[] getParameterValues() { + ArrayList<Object> values = new ArrayList<Object>(); + for (TableItem item : attributeTable.getItems()) { + if (item.getData() != null) { + values.add(item.getData()); + } + } + return values.toArray(new Object[values.size()]); + } +} Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectQueryWizard.java URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectQueryWizard.java?rev=426358&view=auto ============================================================================== --- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectQueryWizard.java (added) +++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/wizards/SelectQueryWizard.java Thu Jul 27 19:18:00 2006 @@ -0,0 +1,116 @@ +/* + * Copyright 2006 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cayenne.ropbrowser.wizards; + +import org.apache.cayenne.ropbrowser.model.AbstractObject; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardPage; +import org.objectstyle.cayenne.ObjectContext; +import org.objectstyle.cayenne.query.NamedQuery; + +public class SelectQueryWizard extends Wizard { + + private SelectParametersPage page1; // select a query and enter parameters + private SelectObjectPage page2; // select an object + + private AbstractObject selectedObject; + + private ObjectContext context; + private String entityName; + + private int mode; + private Object[] paramValues; + private String[] paramNames; + + public static final int RETURN_OBJECT = 1; + public static final int RETURN_PARAMS = 2; + + public SelectQueryWizard(ObjectContext context, String entityName, int mode) { + this.context = context; + this.entityName = entityName; + this.mode = mode; + } + + @Override + public boolean performFinish() { + if (mode == RETURN_OBJECT) { + return (selectedObject != null); + } + if (mode == RETURN_PARAMS) { + paramNames = page1.getParameterNames(); + paramValues = page1.getParameterValues(); + return true; + } + return true; + } + + public void addPages() { + setWindowTitle("Select Object"); + setHelpAvailable(false); + setNeedsProgressMonitor(false); + + page1 = new SelectParametersPage("Enter parameters", context, entityName); + addPage(page1); + + if (mode == RETURN_OBJECT) { + page2 = new SelectObjectPage("Select an object", context, entityName); + addPage(page2); + } + } + + public boolean canFinish() { + if (mode == RETURN_OBJECT) { + return (selectedObject != null); + } + if (mode == RETURN_PARAMS) { + return true; + } + return true; + } + + public AbstractObject getSelectedObject() { + return selectedObject; + } + + public String[] getParameterNames() { + // the page has been disposed, need to go to copy stored on finish + if (mode == RETURN_PARAMS) { + return paramNames; + } + return page1.getParameterNames(); + } + + public Object[] getParameterValues() { + // the page has been disposed, need to go to copy stored on finish + if (mode == RETURN_PARAMS) { + return paramValues; + } + return page1.getParameterValues(); + } + + public String getEntityName() { + return entityName; + } + + public SelectObjectPage getPage2() { + return page2; + } + + public void setSelectedObject(AbstractObject data) { + selectedObject = data; + getContainer().updateButtons(); + } +}
