Comment créer une vue avec des paramètres (objets) ?
Bonjour,
Je débute dans le développement d'application RCP et j'ai une question sans doute simple, mais qui me pause beaucoup de problèmes.
Pour faire simple :
A gauche j'ai un TreeViewer, à droite j'ai des onglets (ViewPart).
Depuis l’arbre, l'utilisateur peut créer un nouvel onglet, lequel a besoin d'informations qui lui seront données par la sélection de l'utilisateur.
Le TreeViewer est créé avec des TreeObject qui représentent des fichiers et des TreeParent qui représentent des dossiers.
L'utilisateur peur sélectionner un TreeParent dans le TreeViewer et créer un onglet grâce aux informations contenues dans ce TreeParent.
J'ai une classe Dialog qui étend ViewPart, c'est la vue de l'onglet.
J'ai une classe NouvelOngletAction qui étend Action et me permet de créer un onglet, là je crée une instance de NouvelOngletAction :
Code:
1 2 3 4 5 6 7 8
| Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
ongletAction = new NouvelOngletAction(window, label, Detail.ID);
//
// Quand je veux créer un nouvel onglet :
//
ongletAction.setTreeParent(treeParent);
ongletAction.run(); |
La méthode run de NouvelOngletAction :
Code:
1 2 3 4 5 6 7 8 9 10 11
| public void run() {
if(window != null) {
try {
IViewPart part = window.getActivePage().showView(Detail.ID, Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE);
((Detail)part).setTreeParent(treeParent);
((Detail)part).setInput();
} catch (PartInitException e) {
MessageDialog.openError(window.getShell(), "Error", "Error opening view:" + e.getMessage());
}
}
} |
Donc j'envoie à mon action un objet TreeParent, quand j’exécute l'action une View est créé avec l'objet TreeParent.
Dans ma classe qui étend ViewPart (la vue de l'onglet) dans createPartControl, je ne fais pas de treeViewer.setInput.
Code:
1 2 3
| treeViewer = new TreeViewer(composite, SWT.BORDER);
treeViewer.setContentProvider(new ViewContentProvider());
treeViewer.setLabelProvider(new ViewLabelProvider()); |
Ensuite en récupérant le IViewPart que retourne le showView, j'appelle la méthode setTreeParent en envoyant le TreeParent nécessaire pour créer l'onglet.
Code:
1 2 3 4
| public void setTreeParent(TreeParent treeParent){
setPartName(treeParent.getName());
this.treeParent = treeParent;
} |
Et ensuite j'appelle la méthode setInput :
Code:
1 2 3
| public void setInput(){
treeViewer.setInput(treeParent);
} |
Ça fonctionne bien.
Le problème intervient quand je quitte puis redémarre l'application.
Les onglets sont vides.
Ils ont pourtant gardé le nom qui leur avait été donné dans setTreeParent.
Bien que le nom change quand je clique sur un onglet.
Quelqu'un saurait-il me dire si ma méthode est bonne pour créer une vue avec un Object ?
Et comment puis-je faire pour que le TreeParent de chaque instance de la classe qui étend ViewPart soit sauvegardé et que les onglets puissent être recréés lors du démarrage ?
Merci d'avance pour votre aide.
Les onglets ne sont pas créé là où il faut
Bonsoir.
Maintenant j'arrive à créer un onglet (ViewPart avec un Brower à l'intérieur) avec un objet que je donne dans le constructeur de ma classe qui implémente IEditorInput.
Par contre quand je redémarre l'application, les onglets ne sont plus là.
Code:
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
| public class TestInput implements IEditorInput {
private TreeObject treeObject;
public TestInput(TreeObject treeObject){
this.treeObject = treeObject;
}
public TreeObject getTreeObject(){
return treeObject;
}
@Override
public Object getAdapter(Class adapter) {
return null;
}
@Override
public boolean exists() {
return true;
}
@Override
public ImageDescriptor getImageDescriptor() {
return null;
}
@Override
public String getName() {
return null;
}
@Override
public IPersistableElement getPersistable() {
return null;
}
@Override
public String getToolTipText() {
return null;
}
} |
Code:
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 68 69 70 71 72
| public class TestEditorPart extends EditorPart {
public static final String ID = "ProjetRCP.testEditorPart";
private String path;
private TestInput input;
@Override
public void doSave(IProgressMonitor monitor) {
}
@Override
public void doSaveAs() {
}
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
this.input = (TestInput) input;
TreeObject obj = this.input.getTreeObject();
setSite(site);
setInput(input);
path = obj.getPath();
setPartName("Person ID: " + obj.getName() );
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
public void createPartControl(Composite parent) {
Browser browser = new Browser(parent, SWT.NONE);
File file = new File(path);
String buffer = "";
String html = "";
System.out.println("filepath : "+path);
try {
FileInputStream nomLogique;
nomLogique = new FileInputStream (file);
InputStreamReader ligne = new InputStreamReader (nomLogique);
BufferedReader bufferLigne = new BufferedReader (ligne);
while ((buffer = bufferLigne.readLine()) != null) {
html += buffer;
}
buffer += bufferLigne.readLine();
bufferLigne.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
browser.setText(html);
}
@Override
public void setFocus() {
}
} |
J'image que je dois utiliser les méthodes :
Code:
1 2
| public void doSave(IProgressMonitor monitor)
public boolean isSaveAsAllowed() |
Ou quelque chose dans le genre, mais pour l'instant j'ai rien trouvé.
En tout cas c'est chouette, la méthode init est appelé avant createPartControl.
S'il vous plait, pourriez-vous me donner quelques indications ?
Merci d'avance.
Au revoir.
========== EDIT ==========
Avant je faisais :
Code:
window.getActivePage().showView(viewId, viewId+instanceNum++, IWorkbenchPage.VIEW_ACTIVATE);
Et les onglets apparaissaient à l'endroit prévu.
Maintenant je fais :
Code:
window.getActivePage().openEditor(input, TestEditorPart.ID);
Et les onglets sont au mauvais endroit.
Dans Perspective :
Code:
1 2
| folder.addPlaceholder(DetailEditorPart.ID + ":*");
folder.addPlaceholder(TestEditorPart.ID + ":*"); |
J'ai également fais des views :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <view
name=""
allowMultiple="true"
icon="icons/sample2.gif"
class="projetrcp.DetailEditorPart"
id="ProjetRCP.detailEditorPart">
</view>
<view
name="HTML"
allowMultiple="true"
icon="icons/html.png"
class="projetrcp.TestEditorPart"
id="ProjetRCP.testEditorPart">
</view> |
Mais je sais pas showView et openEditor ne font pas la même chose.