Monthly Archives: June 2010

SHORYUKEN! 😀

Well, this 1.5.4 is mainly a bug-fix release, but Tabbles speaks Japanese now!!! Thanks to Hiroki “Rocky” for this 🙂

This is what it looks like:

Tabbles in Japanese - I've no clue what's written here but it looks really cool to me! :-D

Tabbles in Japanese - v. 1.5.4

Anyone who knows anything about the Japanese software press? Please drop us a line if you do, we’d love to be featured on a Japanese magazine!!!

As I’m here, I’ll write about a couple of other things.

Cool improvements on the forum:

– RSS of topic: After  months of wandering looking for phpbb mod to have RSS feeds of a single topic, I just realized that the feature is built in it already :O (Yes, I’m such a dope, I know… ). So now you can subscribe to a topic using your favourite reader, or just using the functions built in each browser:

RSS per topic on Tabbles forum

RSS per topic on Tabbles forum

As I’m here, let me suggest you the RSS tool that made me finally love RSS: RSS live links for google Chrome. It’s VERY tiny, VERY unintrusive and plays a sound each time there is a new feed! Dunno if there is something similar for Firefox and IE7/8… this is what it looks like:

RSS live links for Google Chrome

RSS live links for Google Chrome

If you want to follow the development of Tabbles, I suggest you have a look to our topic “what we’re working on” (RSS here) which is currently syndicated on the right side of this page.

OpenID: something else I’ve been craving to have on our forum for a long time… finally found the openid-phpbb mod from Masterz. I had to fight a bit with the installation and the configuration – dunno if it was my fault or the developer’s fault, but I wrote to him and he wrote back promptly – and now there is a minor bug with displaying text, but the OpenID login works just fine! 🙂

Shared-tabbles are coming…

To thos who follow the forum this is nothing new… to everyone else: this is the most crucial set of features for us. It allows (it’s working already) to several user to share their tagging, and works on a local network, on the internet (as long as there is a shared drive) and also using syncronizing software which have desktop client… I won’t write more about this, but the progresses will be posted on this topic on our forum (you can subscribe to it here).

Something that didn’t work too well: the phpbb3 to bbpress converter.

Well, it does indeed work, it deliver what it promises, and it’s easy to use, but it lacks core functionalities such as converting BBCode and attachments, therefore all the links and the pics in the forum will be lost… nope, not acceptable. Hopefully this will be fixed soon! 🙂

Well, that was it for this week…

Andrea

Tagged with: , , , ,

Und wieder ist ein kleiner Schritt gemacht auf dem Weg zum DMS der Zukunft! Shared Tabbles ist in aller Tabbleros Munde.

Einige Auserwählte, erhielten heute Nacht eine Email mit einem Download Link zur Beta 1.5.4 â?? Shared-tabbles private beta. Die kleine unscheinbare Vier birgt nun hier das groÜe Geheimnis. Die Magie zwei Datenbanken zusammen zu führen – Informationen zu teilen – Aus Zwei mach Eins – Wir wachsen zusammen â?? Schatz, unser gemeinsames Kind ist aber dick

Anscheinend darf ich mich zu diesem Kreis zählen, denn ich erhielt den Link und installierte heute morgen gleich.

Der Einfachheit halber habe ich auf einen zweiten Rechner verzichten und (nach einem Backup meiner DB) eine portable Version auf einem Stick installiert. Danach auf meinem Rechner. Nachdem ich dann in beiden Installationen den gleichen Pfad zur gemeinsamen Datenbank eingetragen hatte sah ich sie.

Die Tabbles der USB Datenbank in meiner PC Version.

Momentan unterscheiden sie sich nicht und man kann nicht im einzelnen bestimmen welche Tabbles man dem anderen Nutzer zugänglich machen will. Es werden einfach beide Verzeichnisse zusammengeführt, aber! Es ist ein riesen Schritt wenn man sich überlegt wie man diese Technik in naher Zukunft nutzen werden kann wenn es um das Thema Datei Management geht.
Es ist auch schon möglich eine Datenbank  über einen gemeinsamen Dropbox Ordner (oder auch Powerfolder) zu teilen.

Rund um eine feine Sache und wieder haben wir ein Etappenziel in Sicht. Für Maurizio ist damit sicher schon eines erreicht, aber der Mann ist auch ein Marathonläufer. Persönlich bin ich schon sehr gespannt wie das Endprodukt aussehen wird und natürlich auf den ersten Release Candidate der diese Technik mit sich bringt. 

Wer übrigens nicht zu der â??Eliteâ? gehört der Zugang zur Sneak Peek erhalten hat aber auch gerne so cool wäre, der kann einfach mit einer PN an Andrea in den Adelsstand erhoben werden. 😀

Tagged with: , , , , ,

HELLO WORLD,

A super-fast post here, for those of you who are geeky, blogs/sites, but don’t know too much about html/javascript. I’m writing this as even if the problem is trivial, I googled a bit and couldn’t find any “copy’n’paste” kind of solution, so here you are.

The problem:  the tweetmeme and facebook share horizontal buttons are disaligned

“This kinda sucks” you’d think “since they’re the 2 most populare sharing button, why didn’t they make an effort to make them aligned by default?”. Good question. But still, wait to see what the “Google buzz” button looks like! :-O

Anyway, before finding this solution I created a table around the 2 buttons,  tried using  inline CSS (vertical-align and margin) to get them aligned and none worked. What did work was usign a div tag, just copy’n’paste the following code into your webpage and it should work fine:


<table>
<tbody>
<tr>
<td>
<div style=�float: left; margin-left: 0px; padding: 6px 0px 0pt;�>
<script type=â?text/javascriptâ?> tweetmeme_style = â??compactâ??;</script> <script type=â?text/javascriptâ? src=â?http://tweetmeme.com/i/scripts/button.jsâ?> </script>
</div>
</td>
<td>
<div style=�float: left; margin-right: 12px; padding: 4px 10px 0pt;�>
<a name=�fb_share� type=�button_count� href=�http://www.facebook.com/sharer.php�>Share</a><script src=�http://static.ak.fbcdn.net/connect.php/js/FB.Share� type=�text/javascript�></script>
</div>
</td>
</tr>
</tbody>
</table>


You can see the result on our forum.

Notes: always get the latest scripts from tweetmeme and facebook. As the buttons change, you may need to play around with the values a bit…


Edit: on this blog we’re currently using the amazing Digg Digg plugin and the wibiya toolbar (we’re still using the 2 buttons on our forum).

Tagged with: , , , , , , , ,

HELLO WORLD

What is going on:

Maurizio has been working on shared-tabbles: document management p2p technology (more info here and here).
Basically, instead of loading only one database, Tabbles would load several databases, one for each user, have them all in memory at the same time, and whenever a query was done (e.g.: showing the content of a tabble or a combination), Tabbles would query all the databases and merge the output of the queries.
The great question lying behind this approach was: will this merge badly slow down Tabbles? And based on our first test we believe that the answer is a BIG FAT “NO”!

Real-time database merge for p2p document management solution

First databases merged - no visible slowdown

…read (and discuss) the whole story on our forum!  😀

Tagged with: , , , ,

HELLO WORLD,

for a long while people have been complaining about our icons being unsharp and “pixelated”… indeed they were, and the reason was we were using SHGetFileInfo (a Windows Shell API function) to obtain the file icon from the file path. This function can only cannot return the high definition icons we see in Windows Vista and Windows, such as the following:

How to get large icons in C#

Tabbles with large icons

So we started to investigate how to obtain the hi-res icons (called “jumbo” and “extralarge”) and found this article on how to get large icons using C++. The problem was to convert this code to C#. This is not easy, at least for me, because it requires, among other things, to write a wrapper for a COM interface, and I had no experience with this. Finally, with the help of this article, I made it. You can find the code below. (Remember that the interesting function is icon_of_path_large, whereas icon_of_path is the old function which can only return a low-res icon.)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Diagnostics;

namespace WpfControlLibrary1
{
    public class c_icon_of_path
    {
        // Constants that we need in the function call

        private const int SHGFI_ICON = 0x100;

        private const int SHGFI_SMALLICON = 0x1;

        private const int SHGFI_LARGEICON = 0x0;

        private const int SHIL_JUMBO = 0x4;
        private const int SHIL_EXTRALARGE = 0x2;

        // This structure will contain information about the file

        public struct SHFILEINFO
        {

            // Handle to the icon representing the file

            public IntPtr hIcon;

            // Index of the icon within the image list

            public int iIcon;

            // Various attributes of the file

            public uint dwAttributes;

            // Path to the file

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public string szDisplayName;

            // File type

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]

            public string szTypeName;

        };

        [System.Runtime.InteropServices.DllImport("Kernel32.dll")]
        public static extern Boolean CloseHandle(IntPtr handle);

        private struct IMAGELISTDRAWPARAMS
        {
            public int cbSize;
            public IntPtr himl;
            public int i;
            public IntPtr hdcDst;
            public int x;
            public int y;
            public int cx;
            public int cy;
            public int xBitmap;        // x offest from the upperleft of bitmap
            public int yBitmap;        // y offset from the upperleft of bitmap
            public int rgbBk;
            public int rgbFg;
            public int fStyle;
            public int dwRop;
            public int fState;
            public int Frame;
            public int crEffect;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct IMAGEINFO
        {
            public IntPtr hbmImage;
            public IntPtr hbmMask;
            public int Unused1;
            public int Unused2;
            public RECT rcImage;
        }

        #region Private ImageList COM Interop (XP)
        [ComImportAttribute()]
        [GuidAttribute("46EB5926-582E-4017-9FDF-E8998DAA0950")]
        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
        //helpstring("Image List"),
        interface IImageList
        {
            [PreserveSig]
            int Add(
                IntPtr hbmImage,
                IntPtr hbmMask,
                ref int pi);

            [PreserveSig]
            int ReplaceIcon(
                int i,
                IntPtr hicon,
                ref int pi);

            [PreserveSig]
            int SetOverlayImage(
                int iImage,
                int iOverlay);

            [PreserveSig]
            int Replace(
                int i,
                IntPtr hbmImage,
                IntPtr hbmMask);

            [PreserveSig]
            int AddMasked(
                IntPtr hbmImage,
                int crMask,
                ref int pi);

            [PreserveSig]
            int Draw(
                ref IMAGELISTDRAWPARAMS pimldp);

            [PreserveSig]
            int Remove(
            int i);

            [PreserveSig]
            int GetIcon(
                int i,
                int flags,
                ref IntPtr picon);

            [PreserveSig]
            int GetImageInfo(
                int i,
                ref IMAGEINFO pImageInfo);

            [PreserveSig]
            int Copy(
                int iDst,
                IImageList punkSrc,
                int iSrc,
                int uFlags);

            [PreserveSig]
            int Merge(
                int i1,
                IImageList punk2,
                int i2,
                int dx,
                int dy,
                ref Guid riid,
                ref IntPtr ppv);

            [PreserveSig]
            int Clone(
                ref Guid riid,
                ref IntPtr ppv);

            [PreserveSig]
            int GetImageRect(
                int i,
                ref RECT prc);

            [PreserveSig]
            int GetIconSize(
                ref int cx,
                ref int cy);

            [PreserveSig]
            int SetIconSize(
                int cx,
                int cy);

            [PreserveSig]
            int GetImageCount(
            ref int pi);

            [PreserveSig]
            int SetImageCount(
                int uNewCount);

            [PreserveSig]
            int SetBkColor(
                int clrBk,
                ref int pclr);

            [PreserveSig]
            int GetBkColor(
                ref int pclr);

            [PreserveSig]
            int BeginDrag(
                int iTrack,
                int dxHotspot,
                int dyHotspot);

            [PreserveSig]
            int EndDrag();

            [PreserveSig]
            int DragEnter(
                IntPtr hwndLock,
                int x,
                int y);

            [PreserveSig]
            int DragLeave(
                IntPtr hwndLock);

            [PreserveSig]
            int DragMove(
                int x,
                int y);

            [PreserveSig]
            int SetDragCursorImage(
                ref IImageList punk,
                int iDrag,
                int dxHotspot,
                int dyHotspot);

            [PreserveSig]
            int DragShowNolock(
                int fShow);

            [PreserveSig]
            int GetDragImage(
                ref POINT ppt,
                ref POINT pptHotspot,
                ref Guid riid,
                ref IntPtr ppv);

            [PreserveSig]
            int GetItemFlags(
                int i,
                ref int dwFlags);

            [PreserveSig]
            int GetOverlayImage(
                int iOverlay,
                ref int piIndex);
        };
        #endregion

        ///
        /// SHGetImageList is not exported correctly in XP.  See KB316931
        /// http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316931
        /// Apparently (and hopefully) ordinal 727 isn't going to change.
        ///
        [DllImport("shell32.dll", EntryPoint = "#727")]
        private extern static int SHGetImageList(
            int iImageList,
            ref Guid riid,
            out IImageList ppv
            );

        // The signature of SHGetFileInfo (located in Shell32.dll)
        [DllImport("Shell32.dll")]
        public static extern int SHGetFileInfo(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);

        [DllImport("Shell32.dll")]
        public static extern int SHGetFileInfo(IntPtr pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);

        [DllImport("shell32.dll", SetLastError = true)]
        static extern int SHGetSpecialFolderLocation(IntPtr hwndOwner, Int32 nFolder,
                 ref IntPtr ppidl);

        [DllImport("user32")]
        public static extern int DestroyIcon(IntPtr hIcon);

        public struct pair
        {
            public System.Drawing.Icon icon {get;set;}
            public IntPtr iconHandleToDestroy{set;get;}

        }

        public static int DestroyIcon2(IntPtr hIcon)
        {
            return DestroyIcon(hIcon);
        }

        private static BitmapSource bitmap_source_of_icon  ( System.Drawing.Icon ic) {
                var ic2 = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(ic.Handle,
                                                        System.Windows.Int32Rect.Empty,
                                                        System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions( ) );
                ic2.Freeze();
                return ((BitmapSource) ic2 );
        }

        public static BitmapSource SystemIcon(bool small, ShellLib.ShellApi.CSIDL csidl)
        {

            IntPtr pidlTrash = IntPtr.Zero;
            int hr = SHGetSpecialFolderLocation(IntPtr.Zero, (int) csidl, ref pidlTrash);
            Debug.Assert(hr == 0);

            SHFILEINFO shinfo = new SHFILEINFO();

            uint SHGFI_USEFILEATTRIBUTES = 0x000000010;

            // Get a handle to the large icon
            uint flags;
            uint SHGFI_PIDL = 0x000000008;
            if (!small)
            {
                flags = SHGFI_PIDL | SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES;
            }
            else{
                flags = SHGFI_PIDL | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES;
            }

            var res = SHGetFileInfo(pidlTrash, 0, ref shinfo, Marshal.SizeOf(shinfo), flags);
            Debug.Assert(res != 0);

            var myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
            Marshal.FreeCoTaskMem(pidlTrash);
            var bs = bitmap_source_of_icon(myIcon);
            myIcon.Dispose();
            bs.Freeze(); // importantissimo se no fa memory leak
            DestroyIcon(shinfo.hIcon);
            CloseHandle(shinfo.hIcon);
            return bs;

        }

        public static BitmapSource icon_of_path(string FileName, bool small, bool checkDisk, bool addOverlay)
        {
            SHFILEINFO shinfo = new SHFILEINFO();

            uint SHGFI_USEFILEATTRIBUTES = 0x000000010;
            uint SHGFI_LINKOVERLAY = 0x000008000;

            uint flags;
            if (small)
            {
                flags = SHGFI_ICON | SHGFI_SMALLICON ;
            }
            else{
                flags = SHGFI_ICON | SHGFI_LARGEICON ;
            }
            if (!checkDisk)
                flags |= SHGFI_USEFILEATTRIBUTES;
            if (addOverlay)
                flags |= SHGFI_LINKOVERLAY;

            var res = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), flags);
            if (res == 0)
            {
                throw(new System.IO.FileNotFoundException());
            }

            var myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);

            var bs = bitmap_source_of_icon(myIcon);
            myIcon.Dispose();
            bs.Freeze(); // importantissimo se no fa memory leak
            DestroyIcon(shinfo.hIcon);
            CloseHandle(shinfo.hIcon);
            return bs;

        }

        public static BitmapSource icon_of_path_large(string FileName, bool jumbo, bool checkDisk)
        {

            SHFILEINFO shinfo = new SHFILEINFO();

            uint SHGFI_USEFILEATTRIBUTES = 0x000000010;
            uint SHGFI_SYSICONINDEX = 0x4000;

            int FILE_ATTRIBUTE_NORMAL = 0x80;

            uint flags;
            flags = SHGFI_SYSICONINDEX;

            if (!checkDisk)  // This does not seem to work. If I try it, a folder icon is always returned.
                flags |= SHGFI_USEFILEATTRIBUTES ;

            var res = SHGetFileInfo(FileName, FILE_ATTRIBUTE_NORMAL, ref shinfo, Marshal.SizeOf(shinfo), flags);
            if (res == 0)
            {
                throw (new System.IO.FileNotFoundException());
            }
            var iconIndex = shinfo.iIcon;

            // Get the System IImageList object from the Shell:
            Guid iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");

            IImageList iml;
            int size = jumbo ? SHIL_JUMBO : SHIL_EXTRALARGE;
            var hres = SHGetImageList(size, ref iidImageList, out  iml); // writes iml
            //if (hres == 0)
            //{
            //    throw (new System.Exception("Error SHGetImageList"));
            //}

            IntPtr hIcon = IntPtr.Zero;
            int ILD_TRANSPARENT = 1;
            hres = iml.GetIcon(iconIndex, ILD_TRANSPARENT, ref hIcon);
            //if (hres == 0)
            //{
            //    throw (new System.Exception("Error iml.GetIcon"));
            //}

            var myIcon = System.Drawing.Icon.FromHandle(hIcon);
            var bs = bitmap_source_of_icon(myIcon);
            myIcon.Dispose();
            bs.Freeze(); // very important to avoid memory leak
            DestroyIcon(hIcon);
            CloseHandle(hIcon);

            return bs;

        }
    }
}

You can download Tabbles on our download page!

.

.

.

Tagged with: , , , , ,

HELLO WORLD!

This release is actually bigger then what we expected, it comes packed with new features and improvements, among them a new list-like view, moving to .net framework 4, hugely improved memory use,  Explorer and browser extension for the portable version and maaaaaany bug fixes

Tabbles153b1-file-tagging

Tabbles 1.5.3 b1 - grab it on our forum

Read the full story and grab the beta on our forum. Uh, our new homepage is online, cute, isn’t it? 😀

A+M

Tagged with: , , , , , ,

Here is an awesome trio of applications – and how they work nicely together – for all the Firefox users.

Gyazo

Let’s start from Gyazo:  a great screenshot capturing software that by simply right-clicking allows you to take a screenshot of a portion of your desktop and automatically uploads it on its own Gyazo server. As soon as you’ve done that a webpage will open in your browser showing the screenshot you’ve just taken – you can then send the link to anyone and they’ll be able to see your screenshot. 🙂

Bereich auf dem Bildschirm wird ausgewählt Markierte Adresszeile zeigt den Link zum Screen

This alone is awesome and everyone would find it handy. Let’s have a look at the Firefox addons ScrapBook and ScrapBook Plus from Gomita.

Scrapbook – Scrapbook Plus

Menü von Scrapbook What do they do? To those of you who don’t know (and love) them already, ScrapBook allows you to save a complete website, by just one right-click. The website will be saved along with all its content (as links and pics) and can later be opened or edited. There is also a hierarchical menu for the archived websites. As each archived website is shown in your browser with it’s own path, you can now tag (categorize) all your saved websites with the Tabbles-Bookmarklets as you would do for online websites.

…ok, but where is the catch?

When I take a screenshot with Gyazo and archive it using ScrapBook, I can then tag-it with Tabbles, (as I tag everything else), and find it quick and easily – and browse it along with bookmarks and files. 🙂 Therefore: you can use Tabbles to tag the online links to the Gyazo-screenshots (as regular websites) as well as the screenshot files or the archived websites you saved on your hard-disk, tag all of them with Tabbles and find/browse them all in the same way! Awesome trio!  😮 I love it <3

Tagged with: , , , , , ,

Scarica

Tabbles 4.1.9

(~ 9MB) Compatible with: Vista, 7, 8, 8.1, 10. For LAN mode, it requires Sql Server Express 2008 or above, or LocalDB

Write us!

Do you have questions about Tabbles, or just want to say hi? Drop us a line and we'll get back to you:

Your Name (required)

Please leave this field empty.

Your Email (required)

Please leave this field empty.

Your Message (required)

Please leave this field empty.

Type the 4 characters below and press Send
captcha

Please leave this field empty.

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close