<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://aspadvice.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">matthias .NET Blog</title><subtitle type="html">.NET and sharepoint development</subtitle><id>http://aspadvice.com/blogs/matthias/atom.aspx</id><link rel="alternate" type="text/html" href="http://aspadvice.com/blogs/matthias/default.aspx" /><link rel="self" type="application/atom+xml" href="http://aspadvice.com/blogs/matthias/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.60809.935">Community Server</generator><updated>2005-10-19T13:18:00Z</updated><entry><title>Custom drop down menu like SharePoint does</title><link rel="alternate" type="text/html" href="http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx" /><id>http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx</id><published>2005-12-16T12:57:00Z</published><updated>2005-12-16T12:57:00Z</updated><content type="html">In Windows Sharepoint Service sites a special drop down menu is used
for context menus of document library items. You can reuse the
javascript code for your own drop down menus. One example for such a
drop down menu is a custom 'create new document' combobox which lets
you choose a template for the new document from a list of registered
document templates. (In SharePoint you can select only one template per
document library which is not very useful in practice)&lt;br&gt;
&lt;br&gt;
Here is what you have to do for it. &lt;br&gt;
&lt;br&gt;

&lt;ol&gt;

&lt;li&gt;Create a webpart that renders a hidden table with all elements
for your new 'magicmagic' combobox. The webpart registers the
javascript for displaying the combobox a la SharePoint&lt;/li&gt;
&lt;br&gt;
&lt;code&gt;&lt;font color="#008000"&gt;public MyWebPart()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; this.PreRender += new EventHandler(PreRenderScript);&lt;br&gt;
}&lt;br&gt;
  &lt;br&gt;
private void PreRenderScript(object sender , System.EventArgs e)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!Page.IsClientScriptBlockRegistered("MYSPDDScript")) &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page.RegisterClientScriptBlock("MYSPDDScript", "&amp;lt;script
language=""javascript""
src=""/_layouts/1031/t-myspdd.js""&amp;gt;&amp;lt;/script&amp;gt;");&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;br&gt;
  &lt;br&gt;
protected override void RenderWebPart(HtmlTextWriter output)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; output.RenderBeginTag(HtmlTextWriterTag.Table);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; output.RenderBeginTag(HtmlTextWriterTag.Tr);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; output.RenderBeginTag(HtmlTextWriterTag.Td);&lt;br&gt;
  &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(Item contextMenuItem in Items)&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // add your data for the context menu item instead of ... !&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output.Write("&amp;lt;a name=\"MyData\" ... /&amp;gt;\n"); &lt;br&gt;
  &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; output.RenderEndTag();&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; output.RenderEndTag();&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; output.RenderEndTag();&lt;br&gt;
}
  &lt;/font&gt;


&lt;br&gt;
&lt;/code&gt;
&lt;br&gt;

&lt;li&gt;Add a combobox to the xml file of a site and register mouse
events wich call the onMyItem-Method of your registered Javascript code
(step 1). The xml will look something like this.&lt;/li&gt;
&lt;br&gt;
  &lt;font color="#008000"&gt;&lt;code&gt;&amp;lt;!-- MyButton --&amp;gt;&lt;br&gt;
&amp;lt;td class="ms-toolbar" id="]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;GetVar Name="WPQ"/&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[buttonMy"&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;table cellpadding=1 cellspacing=0 border=0&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td class="ms-toolbar" nowrap&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;img
src="/_layouts/images/newdoc.gif" ID="tbbutton1N"
alt=]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;"MyDropdown"&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[
border=0 width=16 height=16&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td nowrap&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table
class="ms-unselectedtitle" onmouseover="OnMyItem(this,
']]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;GetVar
Name="MyParameter"/&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[')" CTXName="ctx1"
ItemId="1" &amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td class="ms-vb" nowrap&amp;gt;MySomething&amp;lt;/td&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;td&amp;gt;&amp;lt;img src="/_layouts/images/blank.gif" width=13
style="visibility: hidden" alt=""&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/table&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/table&amp;gt;&lt;br&gt;
&amp;lt;/td&amp;gt;&lt;br&gt;
  &lt;/code&gt;&lt;/font&gt;
&lt;br&gt;

&lt;li&gt;Write your own javascript with the help of the sharepoint
javascript for displaying the drop down menu. The code reads the table
items (created by the webpart in step 1) and fills the object
structures for the Sharepoint methods with it.&lt;/li&gt;
&lt;br&gt;
&lt;code&gt;&lt;font color="#008000"&gt;
// triggered by onmouseover&lt;br&gt;

// creates the contexmenu similar to OnItem in ows.js&lt;br&gt;

function OnMyItem(elm, libUrl)&lt;br&gt;

{&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; if(IsMenuOn())&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StartDeferItem(elm);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; if (itemTable != null)&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OutItem();&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; itemTable = elm;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; currentItemID = itemTable.ItemId;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; var createCtx = new Function("setupMyMenuContext(" + itemTable.CTXName + ");");&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; createCtx();&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; var ctx = currentCtx;&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; itemTable.className="ms-selectedtitle";&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; itemTable.onclick = CreateMyMenu;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; itemTable.oncontextmenu = CreateMyMenu;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; itemTable.onmouseout = OutItem;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; itemTable.libUrl = libUrl;&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; titleRow = itemTable.children[0].children[0];&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; i = 0;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; while (titleRow.children[i] != null)&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageCell = titleRow.children[i++];&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; downArrowText = "MyCombo";&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; imageCell.children[0].src = ctx.imagesPath + "downarrw.gif";&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; imageCell.children[0].alt = downArrowText;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; imageCell.children[0].style.visibility = "visible";&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; imageCell.style.visibility="visible";&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; imageCell.className="ms-menuimagecell";&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;br&gt;

}&lt;br&gt;
  &lt;br&gt;

function setupMyMenuContext(ctx)&lt;br&gt;

{&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; currentCtx = ctx;&lt;br&gt;

}&lt;br&gt;
  &lt;br&gt;

// creates the contextmenu-object similar to CreateMenu in ows.js&lt;br&gt;

function CreateMyMenu()&lt;br&gt;

{&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; if (! IsContextSet()) &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; var ctx = currentCtx;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; if (itemTable == null || imageCell == null ||&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (onKeyPress == false &amp;amp;&amp;amp;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (event.srcElement.tagName=="A" ||&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; event.srcElement.parentNode.tagName == "A")))&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; IsMenuShown = true;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; window.document.body.onclick="";&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; m = CMenu(currentItemID + "_menu");&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; currenMenu = m;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; AddMyMenuItems(m, itemTable.libUrl, ctx);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; OMenu(m, itemTable, null, null, -1);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; document.body.onclick=HideSelectedRow;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br&gt;

}&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;

// adds the menu entries for every a-element rendered in RenderWebPart&lt;br&gt;

function AddMyMenuItems(m, libUrl, ctx)&lt;br&gt;

{&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; setupMenuContext(ctx);&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; if(document.getElementsByName("MyDat") != null)&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 0; i &amp;lt; document.getElementsByName("MyDat").length; i++)&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var myData = document.getElementsByName("MyData")[i];&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var optionEntry = document.createElement("option");&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
strTitle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ""; // add your menu item text here
(i.e. myData.Title)&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
strAction&amp;nbsp;&amp;nbsp;&amp;nbsp; = ""; // add your menu item selection
action here&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
// i.e. call createNewDocumentWithProgID to launch an office app with a
new document&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strImagePath = ""; // add the path to the menu item icon here&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // CAMSep(m); // adds a separator in the menu item list&lt;br&gt;
  &lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // add the next item to the drop down menu&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mi = CAMOpt(m, strTitle, strAction, strImagePath);&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;

}
  &lt;/font&gt;
















&lt;br&gt;
&lt;/code&gt;
&lt;br&gt;

&lt;/ol&gt;

The code is a little bit
cumbersome but works in the current versions of Sharepoint Portal
Server and Windows Sharepoint Services. As the previous code relies
heavily on the internal script structure of SharePoint it can not be
guaranteed, that this method will work in the next versions.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx&amp;amp;;subject=Custom+drop+down+menu+like+SharePoint+does" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx&amp;amp;;title=Custom+drop+down+menu+like+SharePoint+does" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx&amp;amp;title=Custom+drop+down+menu+like+SharePoint+does" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx&amp;amp;;title=Custom+drop+down+menu+like+SharePoint+does" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx&amp;amp;;title=Custom+drop+down+menu+like+SharePoint+does&amp;amp;;top=1" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/12/16/14350.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://aspadvice.com/aggbug.aspx?PostID=14350" width="1" height="1"&gt;</content><author><name>matthias</name><uri>http://aspadvice.com/members/matthias.aspx</uri></author><category term="Sharepoint" scheme="http://aspadvice.com/blogs/matthias/archive/tags/Sharepoint/default.aspx" /></entry><entry><title>Mindmanager IFilter</title><link rel="alternate" type="text/html" href="http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx" /><id>http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx</id><published>2005-10-19T12:18:00Z</published><updated>2005-10-19T12:18:00Z</updated><content type="html">&lt;br&gt;
SharePoint Portal Server brings along document filters mostly for office
documents. But you can also save and full text search your mindmaps in SharePoint.&lt;br&gt;
If you are using Mindmanager X5 or the current version 6 then you are
lucky and just have to look at ifiltershop.com. They've got a solution
for indexing Mindmanager documents.&lt;br&gt;
Sadly for Mindmanager 2002 there is
no such IFilter available. But you can easily write your own!
Mindmanager has an OLE automation interface where you can traverse the
mindmap tree structure and extract all label texts from it. Then you
have to tell the indexing service the texts. For that purpose
Microsoft has defined the IFilter-COM-Interface, which you have to
implement. The coding is pretty straight forward:&lt;br&gt;

&lt;code&gt;&lt;font color="#008000"&gt;#import "MindMan.tlb"&lt;br&gt;
&lt;br&gt;
// Init-Call from index service&lt;br&gt;
HRESULT IFilter::Init(ULONG grfFlags, ULONG cAttributes, const FULLPROPSPEC* aAttributes, ULONG* pFlags)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ImjApplicationPtr pMindManager(__uuidof(Application));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pMindManager-&amp;gt;Visible = VARIANT_FALSE; // hide GUI&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ImjDocumentPtr pMindManagerDoc = pMindManager-&amp;gt;Documents-&amp;gt;Add(_bstr_t("Mindmap.mmp")); // open mindmap&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; do&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // remember texts for every ImjBranchPtr pBranch &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PushText(pBranch-&amp;gt;Text);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PushText(pBranch-&amp;gt;TextNotes);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } while(...);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pMindManager-&amp;gt;Close(VARIANT_FALSE);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
// index service calls this method and GetChunk() for every text until FILTER_S_LAST_TEXT is returned&lt;br&gt;
HRESULT IFilter::GetText(ULONG* pcwcBuffer, WCHAR* awcBuffer)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR* pwcNextText = PopText(); // get next text for indexer from memory&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(pwcNextText != NULL)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pcwcBuffer = wcslen(pwcNextText);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wcsncpy(awcBuffer, pwcNextText, *pcwcBuffer);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FILTER_S_LAST_TEXT; // no more texts available&lt;br&gt;
}&lt;br&gt;
&lt;/font&gt;
&lt;/code&gt;
&lt;br&gt;
There is only one problem with this approach - you have to install the
Mindmanager product on your indexing server. Argh, this brings in most
of the problems you have, if you run any Office product on a server.
But the guys at Mindjet promised me, that it's ok and until now no
strange effects happend on the server where i run it (as opposed to a
braindead instable excel server i was replacing last year). So maybe
your
admins won't rip your heart out ;)&lt;br&gt;
&lt;br&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx&amp;amp;;subject=Mindmanager+IFilter" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx&amp;amp;;title=Mindmanager+IFilter" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx&amp;amp;title=Mindmanager+IFilter" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx&amp;amp;;title=Mindmanager+IFilter" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx&amp;amp;;title=Mindmanager+IFilter&amp;amp;;top=1" target="_blank" title = "Post http://aspadvice.com/blogs/matthias/archive/2005/10/19/13289.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://aspadvice.com/aggbug.aspx?PostID=13289" width="1" height="1"&gt;</content><author><name>matthias</name><uri>http://aspadvice.com/members/matthias.aspx</uri></author><category term="Sharepoint" scheme="http://aspadvice.com/blogs/matthias/archive/tags/Sharepoint/default.aspx" /></entry></feed>