2010-11-05 47 views
7

Je veux ajouter l'éditeur HTML WYSIWYG à mon programme Java.
mon idée est de faire quelque chose comme this mais pas avec python - avec Java.Éditeur HTML avec Java et Et webkit - Navigateur SWT

Je sais que sur les deux options et leurs problèmes:

  • HTMLEditorKit - pas assez sophistiqués.
  • JWebpane - conte de fées.
  • QtWebKit - source non ouverte.
  • JWebEngine - source non ouverte.
  • métaphaseeditor - à simple.
  • Le projet Lobo - ne prend pas en charge l'attribut contenteditable.
  • JavaXPCOM - Je ne réussis pas à l'utiliser sur mon Mac OS X 10.6.
    De toute façon, je préfère ne pas l'utiliser car Gecko est plus lent que webkit.

C'est ainsi que j'ai choisi de travailler avec Browser Object de org.eclipse.swt.browser Package.

Pour l'instant, j'ai le code ci-dessous:
Le code, d'abord créer une instance de l'objet du navigateur.
Après cela, il charge la page HTML avec les attributs contenteditable='true' sur l'étiquette du corps.
Si son charger une page est censé ajouter des attributs contenteditable='true' à l'étiquette du corps, et quand c'est enregistrer la page, il est supposé le supprimer.

Mes questions sont les suivantes:

  • Comment puis-je attraper le code HTML édité?
  • Comment savoir si le curseur est activé?
  • Comment savoir si du texte est en surbrillance?

Ou, en général:

  • Comment puis-je construire un possesseur de mot avec le navigateur d'objets et ontenteditable = 'true' attributs?
  • est-ce possible?
  • est-ce la bonne façon pour l'éditeur HTML WYSIWYG en Java?
  • Des exemples là-bas? Je vérifie déjà le SWT Snippets - ne aide pas beaucoup.

Merci beaucoup.

import org.eclipse.swt.SWT; 
import org.eclipse.swt.SWTError; 
import org.eclipse.swt.browser.Browser; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

public class editor { 
public static void main(String [] args) { 
    String html = "<html><title>Editor</title>" 
     + "<body contenteditable='true'>" 
     + " <h2>All the Page is ditable!!!!!</h2>" 
     + "<p>Heres a typical paragraph element</p>" 
     + "<ol><li>and now a list</li>" 
     + "<li>with only</li>" 
     + "<li>three items</li>" 
     + "</ol></body></html>"; 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 
    final Browser browser; 
    try { 
    browser = new Browser(shell, SWT.BORDER); 
    } 
    catch (SWTError e) { 
    System.out.println(e.getMessage()); 
    display.dispose(); 
    return; 
    } 
    Composite comp = new Composite(shell, SWT.NONE); 
    comp.setLayout(new FillLayout(SWT.ALL)); 

    browser.setText(html); 
    shell.open(); 
    while (!shell.isDisposed()) { 
    if (!display.readAndDispatch()) 
    display.sleep(); 
    } 
    display.dispose(); 
} 
} 

Répondre

1

J'aime que vous posiez des questions très précises! Bon travail de remue-méninges avant de vous salir les mains. Heureusement, il existe une solution relativement générique à votre problème: juste run JavaScript in the browser.

Par exemple:

Browser browser = new Browser(parent, SWT.NONE); 
// Just to be sure we can use JavaScript 
browser.setJavascriptEnabled(true); 
boolean result = browser.execute("alert('Hello SWT!')"); 
if (result) { 
    System.out.println("script executed"); 
} else { 
    System.err.println("script failed to execute"); 
} 

Bien sûr, vous pouvez envoyer des données à partir du navigateur vers SWT; dans ce cas, vous pourriez finir dans le pire des cas devoir analyser browser.getText(). Je ne suis pas sûr s'il y a une meilleure façon de faire cela.

+0

Merci pour le compliment et encore plus merci pour la réponse !!! Il semble que le bon moment pour apprendre c/C++ ... Avec ces langues, il devrait être beaucoup plus approprié pour de telles choses ... – Arnon

1

Ceci est bien documenté et vous pouvez l'intégrer dans presque n'importe quel code existant car il a une belle interface et beaucoup de plugins.