1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-08 04:58:40 +03:00

r20924: Change the way searches are performed, also change a bit the layouts

Derrel I am experimenting, let me know if you see anything really disgusting :)
(This used to be commit 702048f618d625c53201cd16a161b706435c44c2)
This commit is contained in:
Simo Sorce 2007-01-20 18:38:37 +00:00 committed by Gerald (Jerry) Carter
parent bf86c27440
commit 00f77d9faf
3 changed files with 178 additions and 186 deletions

View File

@ -29,7 +29,7 @@ qx.Proto.buildFsm = function(module)
* - if returning from RPC, display the result
*
* Transition on:
* "execute" on find button
* "execute" on search button
* "treeopenwhileempty" on tree
* "changeselection" on tree
*/
@ -78,11 +78,11 @@ qx.Proto.buildFsm = function(module)
"events" :
{
// If the find button is activated, issue a find request
// If the search button is activated, issue a seacrh request
"execute" :
{
"find" :
"Transition_Idle_to_AwaitRpcResult_via_find"
"search" :
"Transition_Idle_to_AwaitRpcResult_via_search"
},
// If a previously unexpanded tree node is expanded, issue a request
@ -112,13 +112,13 @@ qx.Proto.buildFsm = function(module)
/*
* Transition: Idle to AwaitRpcResult
*
* Cause: "execute" on find button
* Cause: "execute" on search button
*
* Action:
* Issue a search request
*/
var trans = new qx.util.fsm.Transition(
"Transition_Idle_to_AwaitRpcResult_via_find",
"Transition_Idle_to_AwaitRpcResult_via_search",
{
"nextState" :
"State_AwaitRpcResult",
@ -139,7 +139,7 @@ qx.Proto.buildFsm = function(module)
var baseDN = fsm.getObject("baseDN").getValue();
// Retrieve the selected scope
var scope = fsm.getObject("scope").getSelected().getValue();
var scope = fsm.getObject("scope").getValue();
// We want all attributes
var attributes = [ "*" ];
@ -158,7 +158,7 @@ qx.Proto.buildFsm = function(module)
// When we get the result, we'll need to know what type of request
// we made.
request.setUserData("requestType", "find");
request.setUserData("requestType", "search");
}
});
state.addTransition(trans);

View File

@ -73,31 +73,31 @@ qx.Proto.buildGui = function(module)
});
// Create each of the tabs
var tabView_Search =
new qx.ui.pageview.tabview.Button("Search");
var tabView_Browse =
new qx.ui.pageview.tabview.Button("Browse");
var tabView_Search =
new qx.ui.pageview.tabview.Button("Search");
// Specify the initially-selected tab
tabView_Search.setChecked(true);
tabView_Browse.setChecked(true);
// Add each of the tabs to the tabview
tabView_.getBar().add(tabView_Search, tabView_Browse);
tabView_.getBar().add(tabView_Browse, tabView_Search);
// Create the pages to display when each tab is selected
var tabViewPage_Search =
new qx.ui.pageview.tabview.Page(tabView_Search);
var tabViewPage_Browse =
new qx.ui.pageview.tabview.Page(tabView_Browse);
// Build the search page
this._buildPageSearch(module, tabViewPage_Search);
var tabViewPage_Search =
new qx.ui.pageview.tabview.Page(tabView_Search);
// Build the browse page
this._buildPageBrowse(module, tabViewPage_Browse);
// Build the search page
this._buildPageSearch(module, tabViewPage_Search);
// Add the pages to the tabview
tabView_.getPane().add(tabViewPage_Search, tabViewPage_Browse);
tabView_.getPane().add(tabViewPage_Browse, tabViewPage_Search);
// Add the tabview to our canvas
module.canvas.add(tabView_);
@ -132,8 +132,8 @@ qx.Proto.displayData = function(module, rpcRequest)
// Dispatch to the appropriate handler, depending on the request type
switch(requestType)
{
case "find":
this._displayFindResults(module, rpcRequest);
case "search":
this._displaySearchResults(module, rpcRequest);
break;
case "tree_open":
@ -199,147 +199,105 @@ qx.Proto._buildPageSearch = function(module, page)
// We need a vertical box layout for the various input fields
var vlayout = new qx.ui.layout.VerticalBoxLayout();
vlayout.setWidth("100%");
// We need a horizontal box layout for the search combo box and its label
var hlayout = new qx.ui.layout.HorizontalBoxLayout();
hlayout.setWidth("100%");
hlayout.setHeight(25);
vlayout.set({
overflow: "hidden",
height: 120,
top: 10,
left: 0,
right: 0,
bottom: 10
});
// Create a label for the list of required attributes
var label = new qx.ui.basic.Atom("Search Expression:");
label.setWidth(100);
label.setHorizontalChildrenAlign("right");
var label = new qx.ui.basic.Atom("Search Expression");
label.setHorizontalChildrenAlign("left");
// Add the label to the horizontal layout
hlayout.add(label);
vlayout.add(label);
// Create a combo box for entry of the search expression
var search = new qx.ui.form.ComboBox();
search.getField().setWidth("100%");
search.setEditable(true);
fsm.addObject("searchExpr", search);
var filter = new qx.ui.form.TextField();
filter.set({ width:300 });
fsm.addObject("searchExpr", filter);
// Add the combo box to the horizontal layout
hlayout.add(search);
// Add the horizontal layout to the vertical layout
vlayout.add(hlayout);
// We need a horizontal box layout for the base combo box and its label
hlayout = new qx.ui.layout.HorizontalBoxLayout();
hlayout.setWidth("100%");
hlayout.setHeight(25);
vlayout.add(filter);
// Create a label for the list of required attributes
var label = new qx.ui.basic.Atom("Base:");
label.setWidth(100);
label.setHorizontalChildrenAlign("right");
var label = new qx.ui.basic.Atom("Base");
label.setHorizontalChildrenAlign("left");
// Add the label to the horizontal layout
hlayout.add(label);
vlayout.add(label);
// Create a combo box for entry of the search expression
var base = new qx.ui.form.ComboBox();
base.getField().setWidth("100%");
base.setEditable(true);
var base = new qx.ui.form.TextField();
base.set({ width:300 });
fsm.addObject("baseDN", base);
// Add the combo box to the horizontal layout
hlayout.add(base);
// Add the horizontal layout to the vertical layout
vlayout.add(hlayout);
// We need a horizontal box layout for scope radio buttons
hlayout = new qx.ui.layout.HorizontalBoxLayout();
hlayout.setWidth("100%");
hlayout.setHeight(25);
vlayout.add(base);
// Create a label for the list of required attributes
var label = new qx.ui.basic.Atom("Scope:");
var label = new qx.ui.basic.Atom("Scope");
label.setWidth(100);
label.setHorizontalChildrenAlign("right");
label.setHorizontalChildrenAlign("left");
// Add the label to the horizontal layout
hlayout.add(label);
// Add the label to the scope vertical layout
vlayout.add(label);
// Create a radio button for each scope
var rbDefault = new qx.ui.form.RadioButton("Default", "default");
var rbBase = new qx.ui.form.RadioButton("Base", "base");
var rbOne = new qx.ui.form.RadioButton("One Level", "one");
var rbSubtree = new qx.ui.form.RadioButton("Subtree", "subtree");
// Use a horizontal box layout to keep the search button aligned
var hlayout = new qx.ui.layout.HorizontalBoxLayout();
hlayout.setWidth(300);
hlayout.setHeight(30);
// Use a default of "Default"
rbBase.setChecked(true);
var cbScope = new qx.ui.form.ComboBoxEx();
cbScope.setSelection([ ["subtree", "Subtree"], ["one", "One Level"], ["base", "Base"]]);
cbScope.setSelectedIndex(0);
// Add the radio buttons to the horizontal layout
hlayout.add(rbDefault, rbBase, rbOne, rbSubtree);
fsm.addObject("scope", cbScope);
// Group the radio buttons so only one in the group may be selected
var scope = new qx.manager.selection.RadioManager("scope",
[
rbDefault,
rbBase,
rbOne,
rbSubtree
]);
fsm.addObject("scope", scope);
// Right-justify the 'Find' button
var spacer = new qx.ui.basic.HorizontalSpacer;
hlayout.add(spacer);
hlayout.add(cbScope);
// Create the 'Find' button
var find = new qx.ui.form.Button('Find');
find.setWidth(100);
find.addEventListener("execute", fsm.eventListener, fsm);
// Add a sapcer
hlayout.add(new qx.ui.basic.HorizontalSpacer());
// We'll be receiving events on the find object, so save its friendly name
fsm.addObject("find", find, "swat.main.fsmUtils.disable_during_rpc");
// Create the 'Search' button
var search = new qx.ui.form.Button('Search');
search.setWidth(100);
search.addEventListener("execute", fsm.eventListener, fsm);
hlayout.add(find);
// We'll be receiving events on the search object, so save its friendly name
fsm.addObject("search", search, "swat.main.fsmUtils.disable_during_rpc");
// Add the search button to the vertical layout
hlayout.add(search);
// Add the Find button line to the vertical layout
vlayout.add(hlayout);
// Add the horizontal box layout to the page
// Add the vlayout to the page
page.add(vlayout);
// Create a simple table model
var tableModel = new qx.ui.table.SimpleTableModel();
tableModel.setColumns([ "Distinguished Name", "Attribute", "Value" ]);
var ldifView = new swat.module.ldbbrowse.ldifViewer();
ldifView.set({
top: 130,
left: 10,
right: 10,
bottom: 10
});
tableModel.setColumnEditable(0, false);
tableModel.setColumnEditable(1, false);
tableModel.setColumnEditable(2, false);
fsm.addObject("tableModel:search", tableModel);
fsm.addObject("ldifView", ldifView);
// Create a table
var table = new qx.ui.table.Table(tableModel);
table.set({
top: 80,
left: 0,
right: 0,
bottom: 10,
statusBarVisible: false,
columnVisibilityButtonVisible: false
});
table.setColumnWidth(0, 300);
table.setColumnWidth(1, 180);
table.setColumnWidth(2, 240);
table.setMetaColumnCounts([ 1, -1 ]);// h-scroll attribute and value together
fsm.addObject("table:search", table);
page.add(table);
// Add the output area to the page
page.add(ldifView);
};
qx.Proto._buildPageBrowse = function(module, page)
{
var fsm = module.fsm;
// Create a vertical splitpane for tree (top) and table (bottom)
var splitpane = new qx.ui.splitpane.VerticalSplitPane("1*", "2*");
// Create a horizontal splitpane for tree (left) and table (right)
var splitpane = new qx.ui.splitpane.HorizontalSplitPane("1*", "2*");
splitpane.setEdge(0);
// Create a tree row structure for the tree root
@ -376,7 +334,7 @@ qx.Proto._buildPageBrowse = function(module, page)
fsm.addObject("tree:manager", tree.getManager());
// Add the tree to the page.
splitpane.addTop(tree);
splitpane.addLeft(tree);
// Create a simple table model
var tableModel = new qx.ui.table.SimpleTableModel();
@ -396,26 +354,27 @@ qx.Proto._buildPageBrowse = function(module, page)
statusBarVisible: false,
columnVisibilityButtonVisible: false
});
table.setColumnWidth(0, 200);
table.setColumnWidth(1, 440);
table.setColumnWidth(0, 180);
table.setColumnWidth(1, 320);
table.setMetaColumnCounts([1, -1]);
fsm.addObject("table:browse", table);
// Add the table to the bottom portion of the splitpane
splitpane.addBottom(table);
splitpane.addRight(table);
// Add the first splitpane to the page
page.add(splitpane);
};
qx.Proto._displayFindResults = function(module, rpcRequest)
qx.Proto._displaySearchResults = function(module, rpcRequest)
{
var rowData = [];
var fsm = module.fsm;
// Track the maximum length of the attribute values
var maxLen = 0;
// Obtain the table and tableModel objects
var ldifView = fsm.getObject("ldifView");
ldifView.reset();
// Obtain the result object
result = rpcRequest.getUserData("result").data;
@ -425,74 +384,22 @@ qx.Proto._displayFindResults = function(module, rpcRequest)
len = result["length"];
for (var i = 0; i < result["length"]; i++)
{
var o = result[i];
if (typeof(o) != "object")
var obj = result[i];
if (typeof(obj) != "object")
{
alert("Found unexpected result, type " +
typeof(o) +
typeof(obj) +
", " +
o +
obj +
"\n");
continue;
}
for (var field in o)
{
// skip dn and distinguishedName fields;
// they're shown in each row anyway.
if (field == "dn" || field == "distinguishedName")
{
continue;
}
// If it's multi-valued (type is an array)...
if (typeof(o[field]) == "object")
{
// ... then add each value with same name
var a = o[field];
for (var i = 0; i < a.length; i++)
{
if (a[i].length > maxLen)
{
maxLen = a[i].length;
}
rowData.push( [
o["dn"],
field,
a[i]
] );
}
}
else // single-valued
{
// ... add its name and value to the table
// dataset
if (o[field].length > maxLen)
{
maxLen = o[field].length;
}
rowData.push( [
o["dn"],
field,
o[field]
] );
}
}
// Obtain the table and tableModel objects
var table = fsm.getObject("table:search");
var tableModel = fsm.getObject("tableModel:search");
// Adjust the width of the value column based on
// maxLen
table.setColumnWidth(2, maxLen * 7);
// Tell the table to use the new data
tableModel.setData(rowData);
ldifView.appendObject(obj);
}
}
else
{
alert("No rows returned.");
alert("No results.");
}
};
@ -532,6 +439,7 @@ qx.Proto._displayTreeOpenResults = function(module, rpcRequest)
}
else
{
//FIXME: must check for escapes, as ',' is also a valid value, not only a separator
name = child["dn"].split(",")[0];
}

View File

@ -0,0 +1,84 @@
/*
* Copyright::
* (C) 2006 by Simo Sorce
*
* License:
* GPL v2 or later
*/
/**
* Swat LDB Browser class graphical user interface
*/
qx.OO.defineClass("swat.module.ldbbrowse.ldifViewer", qx.ui.embed.HtmlEmbed,
function()
{
qx.ui.embed.HtmlEmbed.call(this, "");
this.setStyleProperty("whiteSpace", "nowrap");
this.setStyleProperty("textOverflow", "ellipsis");
this.setOverflow("auto");
this.setSelectable(true);
this.innerText = "";
});
//qx.OO.changeProperty({ name : "appearance", type : "string", defaultValue : "???" });
qx.OO.addProperty({ name : "innerText", type : "string" });
swat.module.ldbbrowse.ldifViewer.empty = {
html : "",
innerText : ""
}
qx.Proto.reset = function() {
this.innerText = "";
this.setHtml("");
}
qx.Proto._update = function() {
this.setHtml("<pre>" + this.innerText + "</pre>");
}
qx.Proto.appendComment = function(aText) {
this.innerText = this.innerText + "# " + a Text + "\n\n";
this._update();
}
qx.Proto.appendObject = function(o) {
// First print the Object name as comment
// TODO: Prettify it later
var ldifRecord = "# " + o["dn"] + "\n";
// Now the dn
ldifRecord = ldifRecord + "dn: " + o["dn"] + "\n";
// Now the attributes;
for (var field in o)
{
// If it's multi-valued (type is an array)...
if (typeof(o[field]) == "object")
{
// ... then add each value with same name
var a = o[field];
for (var i = 0; i < a.length; i++)
{
ldifRecord = ldifRecord + field + ": " + a[i] + "\n";
}
}
else // single-valued
{
ldifRecord = ldifRecord + field + ": " + o[field] + "\n";
}
}
// Terminate the record with an empty line
ldifRecord = ldifRecord + "\n";
this.innerText = this.innerText + ldifRecord;
this._update();
}