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

SWT/JFace Java Discussion :

[Swt/Jface] Menu contextuel permettant de copier une cellule ou une ligne d'un tableViewer


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut [Swt/Jface] Menu contextuel permettant de copier une cellule ou une ligne d'un tableViewer
    Bonjour à tous,

    j'aurais besoin de pouvoir créer un menu contextuel dans un tableViewer (présent dans une vue d'une appli RCP). Ce menu aura plusieurs item qui me permetrons notement de copier le ligne ou la cellule courante.

    Pour l'instant, j'arrive à créer mon menu et ses items, mais je bloque un peu dans la manière dont je vais leur ajouter des actions et quel sera le contenu de ces actions. Ci dessous, le createPartControl de ma vue :
    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
    public void createPartControl(final Composite parent) {			
    	final Menu menu = new Menu(parent);
    	final MenuItem menuItemCopyCell = new MenuItem(menu, SWT.PUSH);
    	menuItemCopyCell.setText("Copy Cell");
    	menuItemCopyCell.addSelectionListener(new SelectionListener(){
    		public void widgetDefaultSelected(SelectionEvent e) {}		
    		public void widgetSelected(SelectionEvent e) {}			
    	});
     
    	final MenuItem menuItemCopyLine = new MenuItem(menu, SWT.PUSH);
    	menuItemCopyLine.setText("Copy Line");
    	menuItemCopyLine.addSelectionListener(new SelectionListener(){
    		public void widgetDefaultSelected(SelectionEvent e) {}
    		public void widgetSelected(SelectionEvent e) {}			
    	});		
     
    	GridLayout layout = new GridLayout(2, false);
    	parent.setLayout(layout);
     
    	// méthode me permettant de créer mon viewer
    	// (ses colonnes, ses providers et son input)
    	viewer = createTableViewer(parent);
     
    	viewer.getTable().addMouseListener(new MouseListener(){
    		public void mouseDoubleClick(MouseEvent e) {}
    		public void mouseDown(MouseEvent e) {}
     
    		public void mouseUp(MouseEvent e) {
    			if (e.button == 3){					
    				menu.setVisible(true);
    			}
    		}			
    	});
     
    	createActions(); // actions utilisées dans le toolBar de la vue
    	createToolbar();		
    }
    Merci de votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Bonjour à tous,

    je reviens à la charge avec un petit coup de "up". Y'aurait il une idée de solution pour moi?

    Merci à tous!

  3. #3
    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 papaetoo,

    Pour répondre à tes interrogations, dans une Vue d'une application RCP, pour créer un menu contextuel, tout est déjà "préparé". Il te suffit de faire :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            MenuManager menuMgr = 
                    new MenuManager("#PopupMenu","id.de.ton.menu.contextuel"));
            menuMgr.setRemoveAllWhenShown(true);
            menuMgr.addMenuListener(new IMenuListener() {
     
                public void menuAboutToShow(final IMenuManager mgr) {
                    // Ici, tu peux ajouter des Actions à ton menu.
                    mgr.add(myAction);
                }
            });
            final Menu menu = menuMgr.createContextMenu(viewer.getControl());
            viewer.getControl().setMenu(menu);
            getSite().registerContextMenu(menuMgr, viewer);
    Sache qu'ensuite, tu pourras faire référence à ce menu contextuel dans ton plugin.xml (pour mettre des Commands par exemple...).

    Voilà, à+
    Gueritarish

  4. #4
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Bjr Gueritarish, et une fois de plus, merci pour ta réponse.

    Je vais tester la méthode que tu me propose pour les menus contextuels, mais comment te prendrais tu pour implémenter l'action de copier une ligne ou une cellulle?

    Merci

  5. #5
    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
    Pour copier une ligne, c'est facile, il te suffit de récupérer la sélection sur ton TableViewer.

    Pour copier une cellule, tu as 2 choix. Soit tes cellules sont éditables et à ce moment là, l'utilisateur fais un banal copier-coller de la cellule quand il l'édite.
    Soit, tes cellules ne sont pas éditables et à ce moment là, il te faut stocker la cellule sélectionné par l'utilisateur quelque part :
    Code Java : 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
        table.addListener(SWT.MouseDown, new Listener() {
          public void handleEvent(Event event) {
            Rectangle clientArea = table.getClientArea();
            Point pt = new Point(event.x, event.y);
            int index = table.getTopIndex();
            while (index < table.getItemCount()) {
              boolean visible = false;
              TableItem item = table.getItem(index);
              for (int i = 0; i < columnCount; i++) {
                Rectangle rect = item.getBounds(i);
                if (rect.contains(pt)) {
                  // myCell est la Cellule stockée.
                  myCell = item;
                }
                if (!visible && rect.intersects(clientArea)) {
                  visible = true;
                }
              }
              if (!visible)
                return;
              index++;
            }
          }
        });

    (tu trouveras l'exemple complet à cet endroit)

    Voilà, à+
    Gueritarish

  6. #6
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Bonjour à toi, ooohh noble Gueritarish,

    Je suis en train d'appliquer ce que tu me préconise, mais je du mal à associer mon action à un item de mon menu contextuel. Le code de l'action est le suivant :
    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
    table.addListener(SWT.MouseUp, new Listener(){
    	public void handleEvent(Event event) {
    		Rectangle clientArea = table.getClientArea();
    		Point pt = new Point(event.x, event.y);
    		int index = table.getTopIndex();
    		while (index < table.getItemCount()) {
    			boolean visible = false;
    			TableItem item = table.getItem(index);
     
    			for (int i = 0; i < columnCount; i++) {
    				Rectangle rect = item.getBounds(i);
    				if (rect.contains(pt)) {
    					TableItem myCell = item;
    					System.out.println("myCell = " + myCell.getText(i));
    				}
     
    				if (!visible && rect.intersects(clientArea)) {
    					visible = true;
    				}
    			}
    			if (!visible)
    				return;
    			index++;
    		}
    	}
    });
    Celui de la création du menu est le suivant :
    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
    public void createPartControl(final Composite parent) {			
    	// pour avoir le même style d'onglets que ceux d'eclipse
    	PlatformUI.getPreferenceStore().setValue(IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS, false);
    	GridLayout layout = new GridLayout(2, false);
    	parent.setLayout(layout);
     
    	viewer = createTableViewer(parent);
     
    	createActions(); // mon action est crée là dedans		
    	hookContextMenu();
     
    }
     
    private void hookContextMenu() {
    	MenuManager menuMgr = new MenuManager("#PopupMenu");
    	menuMgr.setRemoveAllWhenShown(true);
    	menuMgr.addMenuListener(new IMenuListener() {
    		public void menuAboutToShow(IMenuManager manager) {
    			ResultView.this.fillContextMenu(manager);
    		}
    	});
    	Menu menu = menuMgr.createContextMenu(viewer.getControl());
    	viewer.getControl().setMenu(menu);
    	getSite().registerContextMenu(menuMgr, viewer);
    }
     
    private void fillContextMenu(IMenuManager manager) {
    	manager.add(setAsFilter);
    	manager.add(addToFilter);
    	// Other plug-ins can contribute there actions here
    	manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }
    Quand j'effectue un click droit, j'ai bien mon menu contextuel qui apparait. Par contre, quand je clique sur le sous menu correspondant à mon action, le comportement attendu (simple affichage de la cellulle) n'est pas effectué. Par la suite, il me suffit de cliquer sur la cellulle pour avoir mon affichage.

    As tu une idée du problème?

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 12h17
  2. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 18h37
  3. [XL-2007] problème de codage en vba ("copie d'une partie d'une cellule dans une cellule vide")
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/10/2010, 18h01
  4. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 13h59
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 14h48

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