2010-03-25 3 views
2

Je veux construire une interface utilisateur similaire à l'esquisse ci-dessous: « ! Terrain »Eclipse RCP: vues Génération de la forme des valeurs

sketch http://i39.tinypic.com/288uvz8.png

Lorsque l'utilisateur remplit le formulaire à droite et clique sur le bouton, un nouvel onglet fermable s'ouvre sur la gauche avec un graphique. Je suis nouveau à RCP et ai suivi this tutorial. Je suis capable d'afficher des onglets avec des graphiques déclenchés à partir d'un élément de menu. Comment dois-je procéder:

  1. créer l'onglet (? Vue) avec la forme
  2. ouvrir un nouvel onglet graphique lorsque l'utilisateur clique sur le bouton

Modifier

ici est mon code actuel. Il répond aux exigences de base décrites dans cette question, mais je ne suis pas sûr que ce soit la meilleure approche. Je serais ravi si quelqu'un ici pouvait me guider dans la bonne direction.

Une vue avec le formulaire; l'écouteur du bouton invoque une commande.

public class FormView extends ViewPart { 
    public static final String ID = 
     FormView.class.getPackage().getName() + ".Form"; 

    private FormToolkit toolkit; 
    private Form form; 
    public Text text; 

    @Override 
    public void createPartControl(Composite parent) { 
     toolkit = new FormToolkit(parent.getDisplay()); 
     form = toolkit.createForm(parent); 
     form.setText("Pie Chucker"); 
     GridLayout layout = new GridLayout(); 
     form.getBody().setLayout(layout); 
     layout.numColumns = 2; 
     GridData gd = new GridData(); 
     gd.horizontalSpan = 2; 
     Label label = new Label(form.getBody(), SWT.NULL); 
     label.setText("Chart Title:"); 
     text = new Text(form.getBody(), SWT.BORDER); 
     text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 
     Button button = new Button(form.getBody(), SWT.PUSH); 
     button.setText("Plot"); 
     gd = new GridData(); 
     gd.horizontalSpan = 2; 
     button.setLayoutData(gd); 
     button.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseDown(MouseEvent e) { 
       IHandlerService handlerService = (IHandlerService) getSite() 
        .getService(IHandlerService.class); 
       try { 
        handlerService.executeCommand(ShowChartHandler.ID, null); 
       } catch (Exception ex) { 
        throw new RuntimeException(ShowChartHandler.ID + 
         " not found"); 
       } 
      } 
     }); 

    } 

    @Override 
    public void setFocus() { 
    } 
} 

La commande invoquée par le bouton à partir du formulaire. Cela ouvre une nouvelle vue avec un graphique.

public class ShowChartHandler extends AbstractHandler implements IHandler { 
    public static final String ID = 
     ShowChartHandler.class.getPackage().getName() + ".ShowChart"; 
    private int count = 0; 

    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
     IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event); 
     try { 
      window.getActivePage().showView(ChartView.ID, 
       String.valueOf(++count), IWorkbenchPage.VIEW_ACTIVATE); 
     } catch (PartInitException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

La vue avec le graphique. Il regarde la vue forme et lit une valeur d'un champ de texte sous la forme (?!):

public class ChartView extends ViewPart { 
    public static final String ID = 
     ChartView.class.getPackage().getName() + ".Chart"; 

    private static final Random random = new Random(); 

    public ChartView() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void createPartControl(Composite parent) { 
     FormView form = 
      (FormView) Workbench.getInstance() 
           .getActiveWorkbenchWindow() 
           .getActivePage() 
           .findView(FormView.ID); 
     String title = form == null? null : form.text.getText(); 
     if (title == null || title.trim().length() == 0) { 
      title = "Pie Chart"; 
     } 
     setPartName(title); 
     JFreeChart chart = createChart(createDataset(), title); 
     new ChartComposite(parent, SWT.NONE, chart, true); 
    } 

    @Override 
    public void setFocus() { 
     // TODO Auto-generated method stub 
    } 

    /** 
    * Creates the Dataset for the Pie chart 
    */ 
    private PieDataset createDataset() { 
     Double[] nums = getRandomNumbers(); 
     DefaultPieDataset dataset = new DefaultPieDataset(); 
     dataset.setValue("One", nums[0]); 
     dataset.setValue("Two", nums[1]); 
     dataset.setValue("Three", nums[2]); 
     dataset.setValue("Four", nums[3]); 
     dataset.setValue("Five", nums[4]); 
     dataset.setValue("Six", nums[5]); 
     return dataset; 
    } 

    private Double[] getRandomNumbers() { 
     Double[] nums = new Double[6]; 
     int sum = 0; 
     for (int i = 0; i < 5; i++) { 
      int r = random.nextInt(20); 
      nums[i] = new Double(r); 
      sum += r; 
     } 
     nums[5] = new Double(100 - sum); 
     return nums; 
    } 

    /** 
    * Creates the Chart based on a dataset 
    */ 
    private JFreeChart createChart(PieDataset dataset, String title) { 

     JFreeChart chart = ChartFactory.createPieChart(title, // chart title 
       dataset, // data 
       true, // include legend 
       true, false); 

     PiePlot plot = (PiePlot) chart.getPlot(); 
     plot.setSectionOutlinesVisible(false); 
     plot.setLabelFont(new Font("SansSerif", Font.PLAIN, 12)); 
     plot.setNoDataMessage("No data available"); 
     plot.setCircular(false); 
     plot.setLabelGap(0.02); 
     return chart; 

    } 

} 

La perspective qui lie tous ensemble:

public class Perspective implements IPerspectiveFactory { 

    public void createInitialLayout(IPageLayout layout) { 
     layout.setEditorAreaVisible(false); 
     layout.addStandaloneView(FormView.ID, false, 
       IPageLayout.RIGHT, 0.3f, 
       IPageLayout.ID_EDITOR_AREA); 
     IFolderLayout charts = layout.createFolder("Charts", 
       IPageLayout.LEFT, 0.7f, FormView.ID); 
     charts.addPlaceholder(ChartView.ID + ":*"); 
    } 
} 
+0

Les onglets des vues Eclipse complètes à gauche ou bien sont-ils tous les onglets et le formulaire dans une seule vue Eclipse? Si elles sont dans une vue unique, quelle classe utilisez-vous actuellement pour créer les onglets sur la gauche? – Yanamon

+0

Je voudrais que tous les onglets soient des vues séparées. En utilisant RCP, j'espère échapper à l'écriture de code pour implémenter les fonctionnalités que les gens attendent dans une application de bureau décent - comme les onglets d'accostage, être capable de les coller côte à côte, etc –

Répondre

3

je recommanderais un autre aproche . Eclipse a des vues (vues) et des éditeurs. Il est facile d'ouvrir plusieurs éditeurs. Les vues ne sont pas tellement pour les multiples ouverts. Donc, ma suggestion est, que vous implémentez la partie que vous appelez "FormView" en tant que StandAloneView et implémentez le "ChartView" en tant qu'éditeur.

Je recommande également d'utiliser un autre écouteur pour le bouton, de sorte que le code sera également exécuté lorsque vous utilisez le clavier pour cliquer sur le bouton.

Ma proposition:

public class FormView extends ViewPart { 
... 
button.addSelectionListener(new SelectionAdapter() { 
@Override 
public void widgetSelected(SelectionEvent e) { 
    // this below can also be called by a command but you need to take care about the data, which the user put into the fields in different way. 
    Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); 
    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 
    IWorkbenchPage page = window.getActivePage(); 

    ChartEditorInput input = new ChartEditorInput(text.getText(),...<other data you need to pass>); 
    try { 
    page.openEditor(input, ChartEditor.ID); 
    } catch (PartInitException e) { 
     e.printStackTrace(); 
    } 

} 
}); 

ChartView doit être changé pour ChartEditor. Voir ici http://www.vogella.de/articles/RichClientPlatform/article.html#editor_editorinput comment cela est fait.
ChartEditorInput est une classe que vous devez implémenter en dehors de la classe editor, qui contient les données.

Dans votre perspective que vous appelez:

public void createInitialLayout(IPageLayout layout) { 
    String editorArea = layout.getEditorArea(); 
    layout.setFixed(false); 
    layout.setEditorAreaVisible(true); 

    layout.addStandaloneView("your.domain.and.FormView", true,IPageLayout.RIGHT, 0.15f, editorArea); 

Hope this helps!

+0

Merci @Raven, j'ai modifié la question avec le code que j'ai jusqu'ici. –

+0

De rien. J'ai un peu changé de poste, mais la situation est, comme je l'avais prévu. Vous devriez changer ChartView en éditeur. Vous n'avez pas besoin d'implémenter toutes les sauvegardes, les sauvegardes, mais vous obtenez beaucoup de trucs de gestion de fenêtres "gratuitement". – Raven

+0

Si vous aimez ma réponse, s'il vous plaît noter et vérifier. Merci :-)) – Raven

Questions connexes