# Selection nur jedes zweite Mal aktiv?



## SegFault (30. Dez 2009)

Ich habe eine View in der, in einer Tabelle, Daten angezeigt werden. Beim Doppelklick auf einen Datensatz wird ein Editor mit diesen DAtensatz geöffnet. Klicke ich erneut Doppelt auf einen Datensatz kommt eine meldung das der Command nicht gefunden werden kann (Es wird nicht erkannt das eine Selection aktiv ist), Klicke ich wieder doppelt klappt es wieder. Das ganze kann ich beliebig oft wiederholen. Immer nur jeden zweiten (doppel)klick wird die selection erkannt. Es könnte mit den öffnen des Editors zusammenhängen aber ich weiss nicht wie ich das ganze lösen soll.

PS.: Ich hab rausgefunden dass es daran liegt das der Editor aktiv ist, jedoch ist immer noch das Table von der View mit seiner Selection aktiviert. Wie kann ich also beim öffnen des Editors die Selection in der View vergessen lassen? Bzw grundsätzlich wenn der Editor aktiv wird, die Selection deaktivieren (GEnauso wie es der fall ist wenn ein anderes Steuerelement aktiv ist).


----------



## Gast2 (31. Dez 2009)

Zeig mal ein bischen code wie du das ganze machst


----------



## SegFault (31. Dez 2009)

Ich mach das nicht viel anders als es in den tutorials beschrieben wird.
Hier der Code für den Command

```
@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
		IWorkbenchPage page = window.getActivePage();
		UserView view = (UserView) page.findView(UserView.ID);
		ISelection selection = view.getSite().getSelectionProvider().getSelection();
		if (selection != null && selection instanceof IStructuredSelection) 
		{
			Object obj = ((IStructuredSelection) selection).getFirstElement();
			// If we had a selection lets open the editor
			if (obj != null) 
			{
				TONutzer nutzer = (TONutzer) obj;
				UserEditorInput input = new UserEditorInput(nutzer);
				try 
				{
					page.openEditor(input, UserEditor.ID);
				} 
				catch (PartInitException e) 
				{
					e.printStackTrace();
				}
			}
		}
		return null;
	}
```

Und hier der Doppelklickhandler auf einen Eintrag in der Tabelle der den Command ausführt


```
// New
	private void hookDoubleClickCommand() 
	{
		viewer.addDoubleClickListener(new IDoubleClickListener() 
		{
			public void doubleClick(DoubleClickEvent event) 
			{
				IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class);
				try 
				{
					handlerService.executeCommand("de.weiss.werkstatt-client.EditNutzer", null);
				} 
				catch (Exception ex) 
				{
					ex.printStackTrace();
					throw new RuntimeException("de.weiss.werkstatt-client.EditNutzer not found");
				}
			}
		});
	}
```

und natürlich melde ich viewer als Selectionprovider an wenn die View erstellt wird.


----------



## Gast2 (31. Dez 2009)

klappt bei mir aber wunderbar

EDIT: versuch doch mal du debuggen wie weit du kommst.


----------



## SegFault (31. Dez 2009)

Der Usereditor ist beim mir ein EditorPart bestehend aus einzelnen Dialogelementen. Beim öffnen des Editors ist der Editor zwar aktiv aber der Fokus ist noch beim View, was wohl den fehler auslöst. Ich müsste wohl den Fokus direkt in den neuen Editor setzen. 
Hier noch der code zum aufbau des Editors, ggf fehlt dort noch etwas.:

```
@Override
	public void createPartControl(Composite parent) {
		this.shell = parent.getShell();
		int BASEWIDTH = 70;
		
		GridLayout layout = new GridLayout();
		GridData gridData = null;
		layout.numColumns = 4;
		parent.setLayout(layout);
		Label label = null;
		label = new Label(parent, SWT.NONE | SWT.RIGHT);
		//Nutzername Label
		label.setText("Nutzername:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		gridData.grabExcessHorizontalSpace = false;
		gridData.horizontalAlignment = GridData.FILL;
		label.setLayoutData(gridData);
		//Nutzername Textfeld
		nutzername = new Text(parent, SWT.BORDER);
		nutzername.setText(nutzer.getNutzername());
		nutzername.addModifyListener(ml);
		gridData = new GridData();
		gridData.horizontalSpan=3;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		nutzername.setLayoutData(gridData);
		//Namen Zeile
		label = new Label(parent, SWT.NONE | SWT.RIGHT);
		label.setText("Vorname:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		gridData.grabExcessHorizontalSpace = false;
		gridData.horizontalAlignment = GridData.FILL;
		label.setLayoutData(gridData);
		//Namen textfeld
		vorname = new Text(parent, SWT.BORDER);
		vorname.setText(nutzer.getVorname());
		vorname.addModifyListener(ml);
		gridData = new GridData();
		gridData.horizontalSpan=3;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		vorname.setLayoutData(gridData);
		//nachname textfeld
		label = new Label(parent, SWT.NONE | SWT.RIGHT);
		label.setText("Nachname:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		gridData.grabExcessHorizontalSpace = false;
		gridData.horizontalAlignment = GridData.FILL;
		label.setLayoutData(gridData);
		//nachname textfeld
		nachname = new Text(parent, SWT.BORDER);
		nachname.setText(nutzer.getNachname());
		nachname.addModifyListener(ml);
		gridData = new GridData();
		gridData.horizontalSpan=3;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		nachname.setLayoutData(gridData);
		//Passwortfeld
		Group border = new Group(parent, SWT.SHADOW_ETCHED_IN);
		border.setText("Passwort");
		//Layout setzen
		layout = new GridLayout();
		layout.numColumns = 2;
		border.setLayout(layout);
		label = new Label(border, SWT.NONE | SWT.RIGHT);
		label.setText("Passwort:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		label.setLayoutData(gridData);
		password[0] = new Text(border, SWT.BORDER);
		password[0].setEchoChar('*');
		gridData = new GridData();
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		password[0].setLayoutData(gridData);
		password[0].addModifyListener(ml);
		label = new Label(border, SWT.NONE | SWT.RIGHT);
		label.setText("wiederholen:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		label.setLayoutData(gridData);
		password[1] = new Text(border, SWT.BORDER);
		password[1].setEchoChar('*');
		password[1].addModifyListener(ml);
		gridData = new GridData();
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		password[1].setLayoutData(gridData);
		//ins parent setzen
		gridData = new GridData();
		gridData.horizontalSpan=4;
		gridData.verticalSpan=3;
		gridData.heightHint=BASEWIDTH;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.FILL;
		border.setLayoutData(gridData);
		


	}
```


----------



## Gast2 (31. Dez 2009)

da gibts doch eine methode die du überschreiben musst setFocus oder sowas...
setz da doch mal dein 1. Control auf setFocus damit immer ein textfeld den focus bekommt...
z.B. nutzername.setFocus();


----------



## SegFault (31. Dez 2009)

besten dank, super, genau das hats gebracht.


----------

