Bei JFace gibt es strukturierte Viewer, z.B. den TreeViewer. Dieser wird durch einen ViewContentProvider mit Objekten gefüllt. Die einfachste Form wird hier vorgestellt http://www-128.ibm.com/developerworks/lotus/library/notes-plugin-eclipse/.
Ich suche nun aber eine elegante Möglichkeit, um z.B. alle Dokumente einer View bereitzustellen und dabei möglichst viel Code wiederverwerten zu können.
Ein interessanter allgemeiner Ansatz ist bereits im RCP Mail Template von Eclipse enthalten. Ich habe aber Schwierigkeiten die allgemeinen TreeObjekte dort mit den konkreten Notes-Objekten zu verknüpfen.
Ein gutes Anwendungsbeispiel wäre z.B., einen Eclipse RCP zu bauen, der über CORBA die HELP!-Datenbank anspricht.
Noch ein paar Details zum tieferen Verständnis:
Der ViewContentProvider arbeitet nur mit Objekten (java.lang.Object). Dadurch könnte man nun ganz einfach ein Objekt vom Typ Document (lotus.domino.Document) übergeben und als Element das Subjekt einer Mail ausgeben
((Document)Object).getItemValueString("Subject")
Das ist noch recht unspektakulär. Das Schöne am Treeviewer ist ja nun, dass er auch Parent/Child-Beziehungen abdeckt. Nun ist in Notes aber Parent eine View, Child ein Dokument und das Kind vom Dokument wieder ein Dokument. Da nur Objekte übergeben werden kann man das natürlich alles abbilden, aber wie das konkret geht weiß ich nicht so genau. Vielleicht hat ja jemand konstruktive Vorschläge dazu?
Dank des eben erwähnten Artikels habe ich nun einen Ansatz gefunden:
Ich habe jeweils ein Node pro Hierarchie, d.h. ein DatabaseNode, ViewNode, DocumentNode.
Als Beispiel öffne ich die HELP-DB über CORBA und lasse mir alle Ansichten anzeigen, deren Name mit "N" beginnt. In den Views lasse ich mir dann alle Dokumente anzeigen. Pro Dokument zeige ich ReqNumber + ": " + Problem.
Hier die Nodes:
public class DatabaseNode extends TreeNode {
private Database fDatabase; /* actual data object */
public DatabaseNode(Database database) {
this(null, database);
}
public DatabaseNode(ITreeNode parent, Database database) {
super(parent);
fDatabase = database;
}
public String getName() {
String databasename = null;
try {
databasename = fDatabase.getTitle();
} catch (NotesException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "Database: " + databasename;
}
public Image getImage() {
return null; /* TODO: Return View image */
}
protected void createChildren(List children) {
Object[] views = null;
try {
views = fDatabase.getViews().toArray();
} catch (NotesException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i=0;i<views.length;i++) {
View v = (View)views[i];
try {
if (v.getName().startsWith("N")) {
children.add(new ViewNode(this, v));
}
} catch (NotesException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class ViewNode extends TreeNode {
private View fView; /* actual data object */
public ViewNode(View view) {
this(null, view);
}
public ViewNode(ITreeNode parent, View view) {
super(parent);
fView = view;
}
public String getName() {
String viewname = null;
try {
viewname = fView.getName();
} catch (NotesException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "VIEW: " + viewname;
}
public Image getImage() {
return null; /* TODO: Return View image */
}
protected void createChildren(List children) {
Document doc = null;
try {
doc = fView.getFirstDocument();
while (doc != null) {
children.add(new DocumentNode(this, doc));
doc = fView.getNextDocument(doc);
}
} catch (NotesException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class DocumentNode extends TreeNode {
private Document fDocument; /* actual data object */
public DocumentNode(ITreeNode parent, Document document)
{
super(parent);
fDocument = document;
}
public String getName() {
String text = null;
try {
text = fDocument.getItemValueString("ReqNumber") + ": " + fDocument.getItemValueString("Problem");
} catch (NotesException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return text;
}
public Image getImage() {
return null; /* TODO: Return File image */
}
protected void createChildren(List children) {
}
public boolean hasChildren() {
return false;
}
}
Es fehlen noch die Ikonen in der richtigen Größe...Aufgerufen wird so eine View einfach mit
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
viewer.setContentProvider(new TreeContentProvider());
viewer.setLabelProvider(new TreeLabelProvider());
Database db = HelpclientPlugin.getSession().getDatabase(null,"HELPDESK15.nsf");
viewer.setInput(new DatabaseNode(db));