summaryrefslogtreecommitdiffstats
path: root/kontact/Thoughts
blob: 32a62758478cc0ac7eb8ae480cb79acad73914f7 (plain)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
* Note: Lines starting with a d are my comments - Daniel
* Note: Lines starting with a # are my comments - Cornelius
* Note: Lines starting with a "z" are my comments - Zack :)
* Note: Lines starting with a "s" are my comments - Simon
* Note: Lines starting with a "Don:" are my comments - Don
* Note: Lines starting with a "g" are my comments - Guenter
* Note: Lines starting with a "m" are my comments - Matthias Kretz
* Note: Lines starting with a "MiB:" are my comments - Michael
* Note: Lines starting with a "h" are my comments - Holger

Misc:
=====

Configuration Merge
-------------------

d Idea: The KOffice way of life: Offer a method that adds a given wiget of a
d predefined type as page in a KDialogBase or offer a pointer to a KDialogBase
d -> requires a Kontact part or an external lib per part

m I believe this is a more general problem. Please take a look at
m kdegraphics/kview/kpreferences{dialog,module}.{h,cpp}. I'd like to generalize
m these classes and include them into kdelibs (the same configuration merge is
m being done in Kate, Noatun, Kopete, KView and probably more).

# The problem is even more generic. We also have to merge about boxes, tips of
# the day and maybe more.


Merged Foldertree View
----------------------

d Idea: Let the part send a description of their folders and reaction to calls
d as XML, similar to XMLGUI

# Is a folder tree really the right tool to represent events, todos or
# contacts?

MiB: On the one hand, Notes can be hierarchic, so a folder tree would be the
MiB: nearest solution...

z I think so. Applications could send the root of their tree to
z Kontact so that the interface looks like

- Mail
  |    \
  |     - Local Folders
  |                    \
  |                     Inbox
  |                     |
  |                     Thrash
  |                     |
  |                     Sent
- Notes
  |    \
  |     Notes 1
  |     |
  |     Notes 2
  |
- Events
        \
         Event 1
         |
         Event 2

z which is not that bad. The question would be how to render the tree
z on the Kontact side while keeping the items on the parts side ( because
z e.g. KMails hold custom pixmaps for the folders which had to be
z displayed in the Kontact tree).

g I'm currently having 248 events. A tree is a very bad solution to visualize
g them. selecting "Events" in the tree should just only start the korganizer
g part.

MiB: ...OTOH... yes, /me agrees with g, a folder tree becomes complex quite fast.

Don: The folder tree makes sense for advanced users, but I think
Don: the simplicity of the current navigator widget has advantages for
Don: non power users.
Don:
Don: Actually instead of the navigator widget I think it makes sense
Don: to consider reusing the widget choosing widget in the latest
Don: version of the Qt designer, which in a sense can be
Don: considered a generalization of the navigator widget. And could
Don: make the folder tree in kmail unnecessary.
Don:
Don: I might investigate the Qt designer widget further but if someone
Don: else wants to look at a folder tree widget that's cool with me.

# I had a look at the Qt designer widget choosing widget. I think it has a
# severe usability problem, because the buttons (or kind of tabs) which are used
# to access the widget subgroups are not always at the same place but move
# around when you click on them. Dependening on which group is shown, the button
# is at the top or at the bottom of the widget. In my opinion this solution is
# unacceptable.

# But Daniel had a good idea how to improve that. It looks similar to the Qt
# designer widget, but it opens the current group always at the top of the
# widget and only highlights the current group in the list at the bottom, but
# doesn't move it. This seems to also be the way Outlook does it.

Don: Guenter, agree.
Don: Wouldn't the idea to be to show calendars in the tree or
Don: navigator widget, rather than individual events?

# Yes, that makes sense. Calendars are much more similar to mail folders than
# single events. You wouldn't integrate individual mails in the folder tree,
# would you?

d That raises an interesting point: The KNotes plugin would not need an own
d canvas in the WidgetStack then. It's sufficient to have the notes in the
d folder view, an RMB menu on them and a "New Note" action.
d So the new design must be able to catch that case (the current one does not).

# I think notes are on the same level as mails or events. They should be listed
# in the view. KNotes would probably just create a single entry in the folder
# tree.


KNotes integration
------------------

MiB: Which reminds me of my own concern about the 'how' of integrating KNotes:
MiB: * the current solution is to start KNotes extern, it is not embedded in Kontact
MiB:   at all. Thus opening a note that is on another desktop either leaves the Kontact
MiB:   window or moves the note. Either not perfect. Also, Kontact is likely to cover
MiB:   notes that reside on the desktop, easy working is impossible. Which is the reason
MiB:   I don't like the current approach too much.
MiB: * but there's always hope---my idea would be to show the notes in Kontact itself.
MiB:   Now I tend to say it's a bit intrusive to not allow starting KNotes and
MiB:   Kontact/KNotes at the same time which raises the following issues:
MiB:     - if KNotes and Kontact are running at the same time, changes to the notes have
MiB:       to be synchronized (not much of a problem). Changes to be synced are the
MiB:       text/contents itself, the text color/style..., the note color. Not sure about
MiB:       the note size. Not to be synced is the position.
MiB:     - so the position in Kontact has to be saved individually and independently
MiB:       of the real desktop position (realized by attaching two display config
MiB:       files, works in make_it_cool branch mostly). Kontact's size is generally
MiB:       smaller than the desktop.
MiB:     - normally notes are on a specific desktop, now they have to be displayed on one
MiB:       area---how to do this best?

MiB: what does M$ do? How do they manage the notes in their PIM app? (I don't know
MiB: it, never seen that thing)


Toolbar Items
-------------

d The KParts Technology only provides actions for the current part. It might be
d desireable to have common actions that are always available.

Don: I agree that it is desireable to have common actions always
Don: available (and parts too like the todo list)
Don:
Don: But are you sure Kparts is limited in this way? KOrganizer can load
Don: multiple plugins simultaneously. And all of these plugins are kparts
Don: (eg. birthday import), and kactions for all loaded plugins are
Don: created and made available simultaneously.
Don:
Don: Yeah, I'm quite positive you can load multiple parts simultaneously.

# Certainly. Actions like "New Mail", "New Contact", "New Event" should be
# available independently of a selected part.

Don: This is a very important issue, I think we need a library with three
Don: methods:
Don: KAddressBookIface loadKAddressBook()
Don: KMailIface loadKMail()
Don: KOrganizerIface loadKOrganizer()
MiB: And don't forget KNotesIface loadKNotes() :-)

h: That doesn't sound extendable ;)
h: So if I would like to add a 'New ShortMessage' part we would have to extend
h: that library... better use KTrader and some sort of a common framework
h: and Mib's comments shows that problem!

d: That's what KDCOPServiceStarter is for :)

Don: Now if kontact is running then loadX will load the X part in kontact
Don: (if it is not already loaded) and return a dcop iface for that
Don: part.
Don:
Don: If kontact is not running but is the users preferred application
Don: then loadX will start kontact and then do the above.
Don:
Don: If kontact is not running and is not the users preferred application
Don: then a standalone version of X should be started, and an iface for
Don: that standalone app returned.
Don:
Don: I think this library should be in libtdepim ad all the kdepim apps
Don: should be moved into kdepim, so their iface files all be in one
Don: package. Or alternatively a new kdeinterfaces package be created
Don: and used as a general repository for interface files.
Don:
Don: Another important issue is invokeMailer and the fact that currently
Don: KDE just runs kmail with command line arguments by default. That has
Don: to be made smarter.
Don:
Don: I guess when kmail is run with command line arguments it could
Don: actually use loadKMail() and then use the resulting iface.
Don:
Don: And the same for all other loadX apps.


tqStatus Bar
----------

d We need a more sophisticated handling (progressbar, etc)

Don: Definitely.

# We now have kdelibs/kparts/statusbarextension. This is intended to solve these
# problems, right?

d: Right. Simply add it as childobject in your part and use it's API. Works even
d: for other KPart hosts than Kontact


Kontact plugin unification
-------------------------

# Currently all Kontact plugins look quite similar. It would be nice, if we
# could provide infratructure to reduce duplicated code as far as possible.

d I thouht of a KontactPart, similar to a KOPart, if that makes sense. I don't think
d a normal KPart is sufficient for us.

Don: I've spent quite a bit of time in all pim *_part files and IIRC
Don: the amount of duplicated code, is pretty much negligible.
Don:
Don: But a KontactPart could make sense for when the parts want to communicate with
Don: the container. Eg. if the parts want to add folders to the container
Don: apps folder tree (or navigator)
Don:
Don: And maybe for communicating with the status bar.
	

Communication/Interaction:
==========================

d Invoking parts when they are needed for the first time takes too long,
d starting all takes too long on startup
d Idea: Mark complex parts as basic parts that get loaded anyway

# parts could be loaded in the background based on usage patterns. Kontact could
# remember which parts were used at the last session and load them in the
# background after loading the initial part to be shown at startup.

z This idea seems to be similar to Microsoft's
z hide-unused-item-in-the-menu strategy. But it probably mess up
z kaddressbook integration. Although not used during every session
z this part is needed and should be always loaded. This strategy
z would be great for could-to-come parts, like a summary part.
z Background loading of parts is OK. The idea is simple : load the
z last used part on startup. Make sure its loading finishes and then
z load the rest once the user can already interact with the last used
z loaded part.

g why do we always need the addressbook? Is libkabc not sufficient?

Don: I guess my machine is too fast, starting parts is pretty quick here :-)

d DCOP is too slow, internal communication should be handled via a dedicated
d interface, communication with external applications (i.e. knotes) should be
d done via wrapper parts that communicate with their respective IPC method to
d their application using the native protocol (DCOP, Corba, etc).

# Are you sure that DCOP is too slow for in-process communications? I thought it
# would handle this special case efficiently.

s It is only efficient in the sense that it won't do a roundtrip to the server but
s dispatch locally. What remains is the datastream marshalling. Not necessarily
s ueberfast. But I think the point is a different one: It is simply not as intuitive
s to use as C++. Yes, DCOPRef already helps a lot for simple calls, but talking to
s remote components still requires one to do error checking after each method call.
s in addition the stub objects one deals with (AddressBookIface_stub for example)
s are no real references. To the programmer they look like a reference to a
s remote addressbook component, but it really isn't. there is no state involved.
s like if between two method calls on the stub the addressbook process gets restarted,
s the state is lost and the programmer on the client side has no way to find out
s about that. you'll end up with really complex code on the caller side to handle things
s like that.

d Yes, but of course one should always prefer in-process IPC if possible. DCOP
d currently _works_ for Kontact, but that's all about it. It isn't exactly elegant.
d The only advantange of the current approach is that we can allow the user to
d run one of the parts standalone. I am not really sure we want that. I used to find
d it desireable, but I am not sure anymore.

MiB: But that's the whole idea behind Kontact---to be able to integrate apps
MiB: _and_ to have standalone versions. Just think about KNotes... impossible
MiB: to have it limited to only Kontact!

Don: I love being able to run the apps inside or outside of the
Don: container, it's just really cool being able to choose I think it's a
Don: great feature and users will really love having the
Don: choice. Especially when they are migrating.

MiB: Definitely.

Don: I think if we use the loadX methods defined above then we can still
Don: support this. I'm PRO DCOP. And this way we don't have to special
Don: case of the code depending on whether the application is running in
Don: a container app or not.
Don:
Don: I find difficult to imagine a function that DCOP is not fast enough
Don: to support. It supports all our current PIM IPC needs fine.

MiB: yes, not too much against DCOP. But for KNotes I thought about turning
MiB: a note into a plugin that can be loaded by Kontact and KNotes independently.
MiB: like this, there's no DCOP necessary anymore and makes it much more flexible.
MiB: e.g. usage of different display configs, a note embedded somewhere and having
MiB: a parent or standalone on the desktop.

# Communication with external applications is something which doesn't fit too
# well with the 'integrated' approach of Kontact. Is this really necessary?

d We won't get around it, think knotes, maybe sync tools, think abstact 3rd party
d projects (not sure the latter is really that important, but we should consider it.
d it barely plays a role anyway).

MiB: hm. true. But not too important, IMHO. Just add a Kontact-DCOP interface :-)

h: Pretty much to talk about...
h: 1. the speed of DCOP is not that important. I worry more about the integration
h:    of all parts. So how would I cross reference an 'Event' with a 3rd party
h:    Kaplan Part? A common base class for all PIM records comes into my mind - again -
h:    Now with normal C++ you can pass a pointer through the framework
h:    Doing it with DCOP we need to marshall and demarshall it. This part can get really
h:    ugly if we want more tight integration of all KaplanParts. We could add
h:    a pure virtual method to marshall to a QDataStream. So now marshalling is done.
h:    For demarshalling we need to get the type of the QDataStream content and then we need
h:    to ask someone - a factory - to get a object for the type and then call another pure
h:    virtual.....
h:    The question is if this is really necessary
h: 2. stand a lone apps
h:    The 'stand a lone' app can always run in the same address space but be a top level widget
h:    itself. WIth some DCOP magic clicking on the KMAIL icon code make Kaplan detach the part...
h: 3. Integration!
h:    The goal of Kaplan should not be to merge some XML files an give a common Toolbar for
h:    X applications in one shell. I want true integration. Yes KMAIL can use KABC to show
h:    all emails for one contact but a generic way to do such things would be more than nice.
h:    It would be nice if I could relate the PIM objects in a common way. So I create an Event and
h:    relate some todos to it. So for KDE4 I want a common base class for all PIM classes including mail
h:    see Opies OPimRecord for a bit too huge base class

Security
--------

d If we use the kparts (ktrader) approach to find a parts by looking
d for an application with the correct mime type this might raise security
d problems. (Martin's concern)

# Looking up Kontact parts isn't based on mime types but on services of type
# "Kontact/Plugin". This is just as save as starting a program statically linking
# its parts. I really don't see any security concerns here.

d Ok, if we limit stuff to Kontact/Plugin and Kontact/Part that might be safe enough
d indeed. I (and Martin, who raise this concern initially) was just afraid of
d allowing "any" part.

h: hmm If somebody can install a Service into the global kde dir or the user kde home
h: there is something else broken IMHO


Summary View
------------
h: How would one best integrate a summary view into kontact?
h: a) add a virtual QWidget *summary(const QDateTime&, QWidget* parent );
h:    to get a summary widget for a day?
h: b) use some sort of XML to UI to represent the summary informations
h: c) have a stand a lone part which opens the PIM data seperately? ( How
h:    to synchronize access? )