Fellow Evolutionists,

time to report on my progress in the composer port. I'd appreciate any 
feedback and ideas.

Disclaimer: a long email, you have been warned. For diligent readers, reward 
at the end :)

When I was starting the port, I essentially just looked on the GtkhtmlEditor 
sources and tried to clone as much as possible. What I ended up with is a set 
of classes located in /widgets/editor (libeeditor), which at the end are not 
really a clone of GtkhtmlEditor...

EEditorWidget - WebKit subclass, provides API for configuring behavior of the
         editor

EEditorSelection - represents current selection in the editor widget and
        provides API to modify formatting of the selection. I keep asking 
myself 
        if this could be merged to EEditorWidget, the main reason I haven't done
        it yet is that e_editor_widget_set_bold() does not describe correctly   
        what the method does, unlike e_editor_selection_set_bold(). Also it 
makes
        the source files smaller. I hate long source files... :-) But if you 
would
        insist, I won't probably strictly object against merging it.

EEditor - a GtkGrid with toolbars and EEditorWidget. Can be subclassed to 
        something like ESimpleEditor to be used elsewhere in Evo with limited
        set of features.

EEditorDialog* - implementations of all the dialogs. I decided to throw away
        the Glade file and single .c with implementation of all the dialogs     
        because it  completely violates all principles of OOP and because I 
have 
        to provide my own implementation of most of the actions in the dialogs 
        anyway, so the single signals file would be huuuge and ugly.

EEditorWindow - a GtkWindow which contains EEditor and simple API to pack
        widgets above or below the editor. It's used by the signature editor and
        composer and it's there so that I just don't have to copy-paste that 
        much (and because it's the right thing to do ;-).

EColorChooserWidget - this is a "subclass" of GtkColorChooserWidget. 
        Unfortunately  API of the Gtk widget totally _SUCKS_, so it's more of a
        hack. It's point is to make the color chooser to accept color by single
        clicking it instead of double clicking. 

EImageChooserDialog - this is a cool GtkFileDialog subclass that displays 
        preview of selected image next to the file list. The contact editor
        does it too, but it does not provide the dialog as a separate class. 
        TODO: The contact editor could probably be ported to use this class

EEmoticon* - GtkhtmlEditor used to call this GtkhtmlFace, which is a silly and
        confusing name. This is one of the very few parts that are almost exact 
        clone of GtkhtmlEditor code.

EActionComboBox - I dragged this from /widgets/misc, because I need it in the
        Editor, but libeeditor can't link against libemiscwidgets (it links 
        against libeeditor).


I also tweaked some of the dialogs: for example the Find dialog now supports 
search wrapping (because WebKit supports it :), "Insert Link" dialog has a new 
"Remove Link" button and I also unified the buttons - all dialogs (except for 
the Link dialog) now have only "Close" button, because the changes are always 
applied immediately, so "OK" makes no sense there. This was slightly 
inconsistent across GtkhtmlEditor dialogs.

I also ended up with my "own" implementation of spell-checking, which are 
located in e-utils. 

ESpellChecker - can list all dictionaries and can be used as "storage" for
        currently active dictionaries. Also implements WebKitSpellChecker
        interface, so it can be (and is) used as implementation of spell 
checking 
        in EEditorWidget/WebKit.

ESpellDictionary - a thin wrapper around EnchantDict which provides
        reference counting and nice names (en_US -> "English (American)"). 

You can either e_spell_dictionary_{learn,ignore}_word() for specific dictionary 
or e_spell_checker_{learn,ignore}_word() for all active dictionaries in the 
spell checker. The ESpellChecker.

Behavior of the editor is almost identical to GtkhtmlEditor, except for HTML 
mode -> Plain text switching. GtkhtmlEditor is simply switching renderers on 
top of a single DOM document, but we can't do this with WebKit. I looked how 
others do it and ended up with a "Switching to plain text will lose all 
formatting, OK?" dialog. When user confirms, all formatting is removed and 
plain text version is inserted back to the editor. Switching from Plain text 
to HTML does not alter formatting in any way (because there is no formatting 
to alter :) The "Undo"/"Redo" actions might be slightly broken/inconsistent 
with Gtkhtml as well, because I don't have access to the action stack of 
WebKit, and WebKit records only some actions. I'm using these actions I know 
that WebKit records to do most of the formatting/DOM manipulation, but on some 
places it's just not possible to get the right result this way.

That's probably all about the editor. All the GtkhtmlEditor functionality 
should be there and I'm quite satisfied with the code, maybe some minor 
refactoring here and there, but in general I can call it beta stage.

I begun porting the actual composer code to the EEditor a few days ago, and 
it's progressing incredibly fast. I just need to hook in few actions and 
events here and there and port signature handling and it' done. GtkhtmlEditor 
had a set of commands for the signatures, but I'll have to handle it all by 
DOM manipulation.

During the port I've run into at least one "unportable" thing - WebKit does 
not provide any means to change color of the underline of misspelled words, so 
I'll probably have to remove this feature (I don't see much use in it anyway).

Finally, Milan had some objections against the "EEditor" prefix, feel free to 
discuss a better alternative.

I'll write a blog post when the port is merged to master. I'd like to do the 
merge as soon as possible, because my time to continue working on it will be 
more and more limited during the semester, so the sooner you can test and 
report back the better. Feel free to start testing already (you can use the e-
editor-test utility to test the editor itself). If you want to report bugs, 
please use evolution[composer] and evolution[webkit] whiteboards.

Sorry for the long mail, but now I can just point people here instead of 
explaining myself over and over. And it helped me to sort it all nicely in my 
head :)

*Promised reward* 
Screenshot!!! http://i45.tinypic.com/2uojg9g.png
Do you see the huge difference between Gtkhtml and WebKit? Me neither...:-D


Cheers,

Dan

-- 
dvra...@redhat.com | Associate Software Engineer / BaseOS / KDE, Qt
GPG Key: 0xC59D614F6F4AE348
Fingerprint: 4EC1 86E3 C54E 0B39 5FDD B5FB C59D 614F 6F4A E348

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
evolution-hackers mailing list
evolution-hackers@gnome.org
To change your list options or unsubscribe, visit ...
https://mail.gnome.org/mailman/listinfo/evolution-hackers

Reply via email to