2013-01-07 3 views
1

Je suis nouveau sur RCP et j'essaie de créer une nouvelle vue ou un nouvel éditeur. À l'état actuel, je suis en train d'étendre ViewPart.Utilisation d'une partie éditeur dans un composite

La mise en page que je veux réaliser est une SashForm où les deux côtés ont un CTabFolder. Un des côtés de SashForm est fondamentalement un MultiPageEditorPart. L'un de ses onglets devrait être un éditeur pour un langage spécifique avec la coloration syntaxique et des fonctionnalités similaires. D'après ce que je comprends, je pourrais étendre AbstractTextEditor pour cela (et peut-être l'utiliser comme un onglet d'un MultiPageEditorPart).

Si je tente de réaliser cette mise en page avec un ViewPart comme conteneur de niveau supérieur qui contient une SashForm, je ne peux pas ajouter un EditorPart à l'un des côtés de la SashForm. Bien sûr, je pourrais mettre en œuvre cet éditeur à partir de zéro comme Composite mais je veux éviter cela.

Je suis également prêt à utiliser un EditorPart ou MultiPageEditorPart comme conteneur de niveau supérieur, mais alors je devrais trouver un moyen de faire fonctionner la mise en page SashForm. L'éditeur entier devrait être divisé en premier et chaque côté devrait avoir des onglets.

Est-ce que quelqu'un a une idée pour résoudre ce problème?

Si quelque chose n'est pas clair s'il vous plaît demander. J'ai l'impression d'avoir mis cela en mots un peu compliqué.

+0

Qu'est-ce qui détermine votre décision de coller les deux "faces" principales de votre vue avec le 'SashForm'? Je suis sûr que vous avez une raison, mais peut-être pourriez-vous vous en dissuader? Compte tenu des complexités que vous achetez, je me demande s'il ne vaudrait pas mieux laisser chacun de ces deux côtés vivre dans son propre 'ViewPart'. L'un pourrait être un 'MultiPageEditorPart' et l'autre' CTabFolder'. Cela donnerait à vos utilisateurs plus de liberté pour positionner les deux pièces sur leurs écrans. – stracka

+0

J'ai réfléchi à ça. La vue est une interface de recherche. L'un des côtés est pour la formulation de la requête l'autre pour les résultats. De cette façon, je veux soutenir le processus cyclique de validation des résultats et de raffinement des requêtes par l'utilisateur. Si je le divise en deux vues, cela peut fonctionner avec une recherche ouverte à la fois. Avec plus d'un (ce qui est une exigence), l'utilisateur aurait du mal à attribuer une vue de résultat à sa requête. –

+0

Garder ces deux pièces collées semble une bonne idée. Je pense que vous devriez juste faire un 'ViewPart' qui a un composant d'édition de texte de quelque sorte sur la gauche, au lieu d'un' EditorPart'. Tout ce que 'EditorPart' est vraiment en train de vous acheter est la gestion de drapeau sale et Save support; coloration syntaxique et ainsi de suite, vous pouvez obtenir à partir d'une variété de différents contrôles de texte là-bas. – stracka

Répondre

1

Je pense que vous devriez juste faire un ViewPart qui a un composant d'édition de texte d'une sorte sur la gauche, au lieu d'essayer de trouver un moyen d'utiliser un EditorPart. Tout ce que EditorPart vous achète vraiment est la gestion de drapeau sale et sauvez le support; Synchronisation de la syntaxe et ainsi de suite vous pouvez ajouter vous-même au composant d'édition de texte (j'ai été surpris par le peu de composants de texte que j'ai trouvés en cherchant sur internet, je pensais trouver "quelques" aucun").

Vous pouvez voir une façon de faire une syntaxe très rudimentaire mettant en évidence avec un composant StyledText ici: JavaSourceCodeViewer

Pour voir une implémentation plus robuste des choses comme la coloration syntaxique et saisie semi-automatique, jetez un oeil à la classe Eclipse utilise pour l'édition du code source Java: CompilationUnitEditor

+0

Le premier prototype fonctionne bien avec la coloration syntaxique. Si j'obtiens aussi l'achèvement automatique fonctionnant ceci sera la solution en faveur. –

1

Je pense que ce que vous essayez d'accomplir est assez compliqué et pourrait nécessiter beaucoup de travail supplémentaire. Voir un éditeur n'est pas seulement des contrôles différents disposés dans un certain ordre, mais il a beaucoup de fonctionnalités supplémentaires que toute classe d'éditeur s'attend à travailler. Ceux-ci incluent des choses comme le service de sélection et les barres d'actions, etc., que vous devrez brancher pour assurer le bon fonctionnement.

Cela dit, il devrait être possible de réaliser ce que vous espérez. Vous pouvez regarder le code source du MultiPageEditorPart lui-même pour voir comment il convertit un seul éditeur en un éditeur de plusieurs pages, capable d'héberger un éditeur complètement indépendant sur chacune de ses pages. Vous devrez réaliser quelque chose de similaire si vous voulez que votre éditeur héberge deux MultiPageEditorPart s séparés par un châssis. Si vous voulez continuer, vous devriez commencer à mettre en œuvre certaines choses et si vous rencontrez des problèmes, publiez-les ici. Vous seriez en mesure d'obtenir une meilleure aide alors.

+0

J'apprécie votre contribution. Il faudra du temps pour l'examiner. Si cela fonctionne et que personne ne trouve quelque chose de plus facile, j'accepterai votre réponse. –

+0

Voici comment je prévois mettre en œuvre cela. Vous étendez 'MultiPageEditorPart' car, en plus du fait que vous aurez des pages divisées par un cadre, votre éditeur a encore plusieurs pages. La partie ouvrant est seulement visuelle et vous pouvez considérer cela comme une technicité de l'implémentation. De cette façon, vous n'aurez pas à implémenter beaucoup de colle spécifique à l'éditeur. –

+1

Dans votre extension de 'MultiPageEditorPart', vous pouvez remplacer les méthodes' addPage' et utiliser l'instance de page pour déterminer le côté de la bande dont elles ont besoin. Remplacer également 'createPageContainer' pour créer un parent pour l'éditeur entier qui a une ceinture, et un dossier d'onglet sur chaque ceinture. Une approche similaire devrait également être possible pour un 'FormEditor'. –

0

Vous avez besoin de quelque chose comme MultiPageEditorSite. Utilisez-le pour vous inspirer lors de l'implémentation d'un EditorSiteDelegate. MultiPageEditorSite prend en charge des raccourcis clavier distincts entre les pages, par exemple.

class ChildEditorSite implements IEditorSite { 
    IEditorSite parent; 
    public Object method() { 
     return parent.method(); 
    } 
} 

En utilisant cette classe, vous pouvez facilement effectuer les opérations suivantes dans votre principale EditorPart:

class MyCoolPart extends EditorPart { 
    public void createControl(Composite parent) { 
     EditorPart child1 = new MyChild(); 
     child1.init(new ChildEditorSite(getEditorSite()), myInput); 
     EditorPart child2 = new MyChild(); 
     child2.init(new ChildEditorSite(getEditorSite()), myInput); 

     child1.createPartControl(parent); 
     child2.createPartControl(parent); 
    } 
} 

Assurez-vous de disposer également de vos enfants correctement lorsque vous disposez de votre MyCoolPart. S'il vous plaît noter que cela ne fonctionne que dans les cas les plus élémentaires. Un EditorPart qui est un DocumentEditor ou qui repose sur IPersistablePart ou qui implémente des écouteurs/adaptateurs pour confirmer une sauvegarde nécessitera probablement beaucoup plus de gestion du cycle de vie ...

Questions connexes