IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Drag and Drop vers un éditeur


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut Drag and Drop vers un éditeur
    Bonjour !

    Petit souci dans le développement de mon appli avec Eclipse RCP.
    J'ai donc une vue à gauche contenant mon arborescence, et mon éditeur à droite.
    J'ai implémenté le glisser déposer à l'intérieur de l'arborescence, et un double clic sur un élément feuille de mon arbre ouvre l'éditeur voulu.

    Maintenant, la prochaine étape que je veux mettre en place est la possibilité de faire glisser un élément de l'arbre vers la zone d'éditeur pour qu'un éditeur s'ouvre lorsqu'un drop est fait au dessus de la zone (comme les fichiers dans Eclipse quoi)

    Seulement, là, quand je passe sur la zone des éditeurs, le curseur devient un panneau d'interdiction, j'imagine qu'il faut activer le drop sur la zone d'éditeur quelque part, mais où...

    Pour le drag voici mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    private void addDrag() {
        int ops = DND.DROP_MOVE;
        final LocalSelectionTransfer transfert = LocalSelectionTransfer.getTransfer();
        this.treeViewer.addDragSupport(ops, new Transfer[] {transfert}, new DragSourceListener() {
            @Override
            public void dragStart(DragSourceEvent event) {
                try{
                    ISelection selection = ViewRaccourci.this.treeViewer.getSelection();
     
                    if (selection == null){
                        event.doit = false;
                        System.out.println("Le drag ne peut pas se faire car la sélection est nulle");
                    }else{
                        ElementArborescence elementArborescence = (ElementArborescence)((IStructuredSelection)selection).getFirstElement();
                        Menu parent = elementArborescence.getParent();
                        if(parent.getParent() == null){
                            event.doit = false;
                            System.out.println("Impossible de faire un drag sur la racine");
                        }else{
                            ViewRaccourci.this.draggedElement = elementArborescence;
                            System.out.println("Début du drag sur "+elementArborescence.getClass().getSimpleName()+" : "+elementArborescence.getLibelle());
                        }
                    }
                }catch(RuntimeException e){
                    e.printStackTrace();
                    throw e;
                }
            }
     
            @Override
            public void dragSetData(DragSourceEvent event) {
                try{
     
                    ISelection selection = ViewRaccourci.this.treeViewer.getSelection();
     
                    Object object = ((IStructuredSelection)selection).getFirstElement();
     
                    event.data = object;
                    System.out.println("dragSetData : l'objet du drag est "+object);
                    LocalSelectionTransfer.getTransfer().setSelection(selection);
                }catch(RuntimeException e){
                    e.printStackTrace();
                    throw e;
                }
            }
     
            @Override
            public void dragFinished(DragSourceEvent event) {
                // rien à faire
            }
        });
    }
    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut,

    A moins que ton Editor ne contienne qu'un composant JFace, je pense que tu vas devoir passer par le drag'n drop de SWT. Pour ce faire, tu créés une DropTarget sur ton composant de plus haut niveau (cf ce tutoriel).
    Par contre, une ombre au tableau, je ne sais pas si les drag'n drop SWT et JFace peuvent coexister... A tester.

    Voilà, à+
    Gueritarish

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci mais j'avais déjà vu ce tuto !

    Le problème c'est que je ne sais pas comment accéder à l'editor Area !
    J'accède sans problème aux editors une fois qu'ils sont ouvert, mais sur eclipse par exemple, on peut dropper une classe sur l'editor area même si aucun editor n'est ouvert.
    Du coup avant toute chose, il faudrait que j'arrive à accéder à l'editor Area pour pouvoir y appliquer un drop target.
    Du coup je me disais que c'était peut être pas la bonne marche à suivre et je me suis mis à chercher un truc particulier pour ces drag & drop à destination de cette zone.

    Merci quand même pour cette réponse, si tu sais comment accéder à l'éditor Area, je suis peneur : )

  4. #4
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    C'est déjà implémenté
    Citation Envoyé par article Drag and Drop
    Finally, the editor area supports dropping of editor inputs (EditorInputTransfer), resources, or markers. Dragging these objects to the editor will cause it to locate and open an appropriate editor for the given resource, editor input or marker. In the case of markers, it will also jump to that marker location in the editor.
    A partir de l'article Drag and Drop.
    Ce qu'il te faut faire c'est rajouter un EditorInputTransfer dans les transfer supporté par ton drag.

    Voilà, à+
    Gueritarish

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci je vais essayer ça !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    re !
    Bon j'ai un peu de mal avec cette histoire de drag and drop
    J'ai d'abord essayé, en m'aidant de l'article, d'utiliser le drop directement (j'ai commenté tout ce qui servait au drag n drop à l'intérieur de l'arbre, pour être sûr de rien "parasiter", et laisser que le drag and drop arbre->editeur.

    ma fonction pour ajouter le drag à ma vue est devenue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    private void addDrag() {
    		int ops = DND.DROP_COPY | DND.DROP_DEFAULT;
    		final EditorInputTransfer transfertEditor = EditorInputTransfer.getInstance();
     
    		this.treeViewer.addDragSupport(ops, new Transfer[] {transfertEditor}, new DragSourceListener() {
    			@Override
    			public void dragStart(DragSourceEvent event) {
    				try{
    					ISelection selection = ViewRaccourci.this.treeViewer.getSelection();
     
    					if (selection == null){
    						event.doit = false;
    						System.out.println("Le drag ne peut pas se faire car la sélection est nulle");
    					}else{
    						ElementArborescence elementArborescence = (ElementArborescence)((IStructuredSelection)selection).getFirstElement();
    						Menu parent = elementArborescence.getParent();
    						if(parent.getParent() == null){
    							event.doit = false;
    							System.out.println("Impossible de faire un drag sur la racine");
    						}else{
    							ViewRaccourci.this.draggedElement = elementArborescence;
    							System.out.println("Début du drag sur "+elementArborescence.getClass().getSimpleName()+" : "+elementArborescence.getLibelle());
    						}
    					}
    				}catch(RuntimeException e){
    					e.printStackTrace();
    					throw e;
    				}
    			}
     
    			@Override
    			public void dragSetData(DragSourceEvent event) {
    				try{
     
    					ISelection selection = ViewRaccourci.this.treeViewer.getSelection();
     
    					Object object = ((IStructuredSelection)selection).getFirstElement();
     
    					System.out.println("dragSetData : l'objet du drag est "+object);
    					LocalSelectionTransfer.getTransfer().setSelection(selection);
    					EditorInputData createEditorInputData = EditorInputTransfer.createEditorInputData(RaccourciEditor.ID, new RaccourciEditorInput((ElementArborescence)object));
    					event.data = new EditorInputTransfer.EditorInputData [] {createEditorInputData};
    				}catch(RuntimeException e){
    					e.printStackTrace();
    					throw e;
    				}
    				event.doit = false;
    			}
     
    			@Override
    			public void dragFinished(DragSourceEvent event) {
    				// rien à faire
    			}
    		});
    	}
    Mais le résultat est toujours le même : quand je passe sur l'éditor area, le curseur devient un symbole d'interdiction...

    Puis je suis tombé sur cet article, qui fait un peu mieux, mais qui me donne l'impression de recoder la roue...

    Les différentes modifs que j'ai apportées sont :
    - Dans l'ApplicationWorkbenchWindowAdvisor.preWindowOpen :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    configurer.addEditorAreaTransfer(EditorInputTransfer.getInstance());
    		configurer.configureEditorAreaDropListener(new EditorDropAdapter(configurer.getWindow()));
    -Et j'ai créé la classe EditorDropAdapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    public class EditorDropAdapter implements DropTargetListener {
     
    	IWorkbenchWindow window;
     
    	public EditorDropAdapter(IWorkbenchWindow window) {
    		this.window = window;
    	}
     
    	@Override
    	public void dragEnter(DropTargetEvent event) {
    		// DND.DROP_DEFAULT allows drop target to set default operation.
    		if (event.detail == DND.DROP_DEFAULT) {
    			if ((event.operations & DND.DROP_COPY) != 0) {
    				event.detail = DND.DROP_COPY;
    			} else {
    				event.detail = DND.DROP_NONE;
    			}
    		}
     
    	}
     
    	@Override
    	public void dragLeave(DropTargetEvent event) {
    		// Free resources allocated in dragEnter().
     
    	}
     
    	@Override
    	public void dragOperationChanged(DropTargetEvent event) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void dragOver(DropTargetEvent event) {
    		event.feedback = DND.FEEDBACK_NONE;
     
    	}
     
    	@Override
    	public void drop(DropTargetEvent event) {
    		System.out.println("Drop");
    		if (EditorInputTransfer.getInstance().isSupportedType(event.currentDataType)) {
    			EditorInputTransfer.EditorInputData[] editorInputs = (EditorInputTransfer.EditorInputData[]) event.data;
    			for (int i = 0; i < editorInputs.length; i++) {
    				if (editorInputs[i] != null) {
    					IEditorInput input = editorInputs[i].input;
    					String editorId = editorInputs[i].editorId;
    					try {
    						this.window.getActivePage().openEditor(input, editorId);
    					} catch (PartInitException e) {
    						System.out.println(e.getMessage());
    					}
    				}
    			}
    			event.detail = DND.DROP_COPY;
    		}
     
    	}
     
    	@Override
    	public void dropAccept(DropTargetEvent event) {
    		System.out.println("Drop accept !");
     
    	}
     
    }
    Là, y a un peu de mieux, quand je passe sur la zone d'éditeur, le symbole est celui d'un DND qui fonctionne, je pose mon objet, et là...
    Dans la méthode drop, event.data = null....
    Et du coup rien ne se passe
    As tu une idée de ce qui peut se passer?
    Est ce obligatoire de coder son propre DropTargetListener, alors qu'aucun autre site n'en parle?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD17] Drag and Drop vers outlook
    Par cassandra dans le forum WinDev
    Réponses: 0
    Dernier message: 21/05/2013, 15h27
  2. Drag and Drop vers un JTextPane
    Par FredericB dans le forum Général Java
    Réponses: 1
    Dernier message: 09/07/2012, 15h14
  3. [WD14] Drag and drop vers Explorateur windows
    Par whypyd dans le forum WinDev
    Réponses: 1
    Dernier message: 15/03/2012, 08h13
  4. Drag and drop vers Explorateur
    Par JustMe dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 04/12/2007, 18h56
  5. Drag and Drop vers plusieurs Edit
    Par greg778 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/05/2005, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo