Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. Don't kill MFC

Don't kill MFC

Scheduled Pinned Locked Moved The Lounge
c++
18 Posts 10 Posters 2 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    Lost User
    wrote on last edited by
    #1

    Hi.. Sure there is many isues about MFC that don't make it perfect. But MFC is nice and easy to work with, and most important its what we have used for may years. So if I was to use some new kind of classes it had to support the old MFC. I can't just start to rewrite 10 years of prjects or stop to maintain them, becaurse something new and probably better comes along. Just my thought ;) John Achfeld

    D N 2 Replies Last reply
    0
    • L Lost User

      Hi.. Sure there is many isues about MFC that don't make it perfect. But MFC is nice and easy to work with, and most important its what we have used for may years. So if I was to use some new kind of classes it had to support the old MFC. I can't just start to rewrite 10 years of prjects or stop to maintain them, becaurse something new and probably better comes along. Just my thought ;) John Achfeld

      D Offline
      D Offline
      David Cunningham
      wrote on last edited by
      #2

      Hi John, The VS.Net guys have gone to great lengths to allow you to intermix .Net functionality into your existing code. I'm not here to make a Microsoft advertisement, but I can assure you that this issue is top-of-mind with them. The intermixing works both ways too, you can write a C# app that allows you to call into your existing code, and your existing code can call new .Net code seamlessly. Without question there will be some issues involved with this, but from what I've seen and used so far, it seems to work very well. Listen, I don't think anyone on CodeProject has more of a vested interest in keeping MFC alive and well than I do, but as we've discussed in the lounge a few times taking MFC to the next level is way more difficult than it should be (COM, binary reuse, etc). Microsoft for all intents and purposes has developed an OO operating system in .Net, as they've been planning to for years. The OO-OS (if you will) greatly simplifies the implementation of an OO language to sit on top of it.

      1 Reply Last reply
      0
      • L Lost User

        Hi.. Sure there is many isues about MFC that don't make it perfect. But MFC is nice and easy to work with, and most important its what we have used for may years. So if I was to use some new kind of classes it had to support the old MFC. I can't just start to rewrite 10 years of prjects or stop to maintain them, becaurse something new and probably better comes along. Just my thought ;) John Achfeld

        N Offline
        N Offline
        NormDroid
        wrote on last edited by
        #3

        I certainly don't think MFC will be killed overnight. Depending on how well VS .Net performs and meets developers requirements and I really think MFC will be around for a long time yet (finger X'ed). Norm

        W 1 Reply Last reply
        0
        • N NormDroid

          I certainly don't think MFC will be killed overnight. Depending on how well VS .Net performs and meets developers requirements and I really think MFC will be around for a long time yet (finger X'ed). Norm

          W Offline
          W Offline
          Walter Sullivan
          wrote on last edited by
          #4

          The .NET Platform and Frameworks take the API to another level. It is what the majority of Windows developer should and will use. There will be new tools, languages, libraries, books, magazines, and all the other supporting activities necessary to make it a very productive and exciting environment to program in. Must more than we've disclosed so far. I'm here to tell you that alongside the .NET Platform, Microsoft will be actively and aggressively developing an unmanaged operating system API and platform including C++ class libraries exposing the underlying operating system to you for a long time to come. This includes MFC, ATL, ATL Server, DirectX, Kernel, User, GDI, Comctl, and all the other API you've come to know and love. We have a lot of new tools, API, etc, in store for the unmanaged developer as well. You should learn about and try out the .NET stuff, you'll find that it can do much of what you want very easily. The existing stuff only gets better from here as well. Walter Sullivan Lead Program Manager, ATL/MFC

          C realJSOPR 2 Replies Last reply
          0
          • W Walter Sullivan

            The .NET Platform and Frameworks take the API to another level. It is what the majority of Windows developer should and will use. There will be new tools, languages, libraries, books, magazines, and all the other supporting activities necessary to make it a very productive and exciting environment to program in. Must more than we've disclosed so far. I'm here to tell you that alongside the .NET Platform, Microsoft will be actively and aggressively developing an unmanaged operating system API and platform including C++ class libraries exposing the underlying operating system to you for a long time to come. This includes MFC, ATL, ATL Server, DirectX, Kernel, User, GDI, Comctl, and all the other API you've come to know and love. We have a lot of new tools, API, etc, in store for the unmanaged developer as well. You should learn about and try out the .NET stuff, you'll find that it can do much of what you want very easily. The existing stuff only gets better from here as well. Walter Sullivan Lead Program Manager, ATL/MFC

            C Offline
            C Offline
            Christian Graus
            wrote on last edited by
            #5

            Hey Walter, I have a question. Is WTL doing to become officially supported ? Is it going to continue growing ? Christian The content of this post is not necessarily the opinion of my yadda yadda yadda. To understand recursion, we must first understand recursion.

            J W 2 Replies Last reply
            0
            • C Christian Graus

              Hey Walter, I have a question. Is WTL doing to become officially supported ? Is it going to continue growing ? Christian The content of this post is not necessarily the opinion of my yadda yadda yadda. To understand recursion, we must first understand recursion.

              J Offline
              J Offline
              Jim Howard
              wrote on last edited by
              #6

              I'm not Walter, but I did read this quote in an interview with some MS managers: "WTL is code that was released unsupported and we have no intention of updating it. We have no intention of continuing its availability. Frankly, it should never have been released and it will be removed from the platform SDK at the time of the next SDK revision" -- Tony Goodhew http://windows.oreilly.com/news/visualc\_0500.html

              W 1 Reply Last reply
              0
              • C Christian Graus

                Hey Walter, I have a question. Is WTL doing to become officially supported ? Is it going to continue growing ? Christian The content of this post is not necessarily the opinion of my yadda yadda yadda. To understand recursion, we must first understand recursion.

                W Offline
                W Offline
                Walter Sullivan
                wrote on last edited by
                #7

                Right now the plan for WTL is to leave it in the Platform SDK. Bugs, features and other maintenance on WTL is officially not supported. However, in reality, it will be enhanced a bit and serious bugs will be fixed. It will not be part of Visual Studio.NET. However, for releases beyond Visual Studio.NET we will be listening to the feedback of our users and could incorporate it into a future release. Thanks for your question, Walter Sullivan Lead Program Manager, ATL/MFC

                1 Reply Last reply
                0
                • J Jim Howard

                  I'm not Walter, but I did read this quote in an interview with some MS managers: "WTL is code that was released unsupported and we have no intention of updating it. We have no intention of continuing its availability. Frankly, it should never have been released and it will be removed from the platform SDK at the time of the next SDK revision" -- Tony Goodhew http://windows.oreilly.com/news/visualc\_0500.html

                  W Offline
                  W Offline
                  Walter Sullivan
                  wrote on last edited by
                  #8

                  See my other post in this thread. Tony's quote was a little aggresive. It won't be removed from the SDK and may in fact be incorporated into future VC releases. When had WTL as a working concept of things we could do to ATL. It turned out rather well but unfortunately we couldn't properly incorporate it into VC. We had commited to ATL Server, the C++ Attributes stuff, updates to MFC and frankly we just didn't have enough people on my team to "productize" WTL as well. Its the kind of decision we, and many of you, have to make every day about your product. It was good enough that I felt releasing it in the SDK "as-is" would provide a lot of value to Windows C++ Developers. I knew there was going to be a lot of flack about lack of documentation, Wizards, and other "official" support but decided that even lacking that many would find it very useful. It was an experiment, releasing unsupported code. So I have to say that for those folks who think MS shouldn't have released it if we weren't going to "support" it, don't use it. For those who find it useful and are getting work done with WTL, I hope you are glad we put it in the SDK. And for those who wish MS would fully incorporate it into Visual C++, thanks! We appreciate the feedback, we'll strongly consider that in our future product plans, and I apologize that I couldn't deliver it in VS.NET. Later, Walter Sullivan Lead Program Manager, ATL/MFC

                  L 1 Reply Last reply
                  0
                  • W Walter Sullivan

                    See my other post in this thread. Tony's quote was a little aggresive. It won't be removed from the SDK and may in fact be incorporated into future VC releases. When had WTL as a working concept of things we could do to ATL. It turned out rather well but unfortunately we couldn't properly incorporate it into VC. We had commited to ATL Server, the C++ Attributes stuff, updates to MFC and frankly we just didn't have enough people on my team to "productize" WTL as well. Its the kind of decision we, and many of you, have to make every day about your product. It was good enough that I felt releasing it in the SDK "as-is" would provide a lot of value to Windows C++ Developers. I knew there was going to be a lot of flack about lack of documentation, Wizards, and other "official" support but decided that even lacking that many would find it very useful. It was an experiment, releasing unsupported code. So I have to say that for those folks who think MS shouldn't have released it if we weren't going to "support" it, don't use it. For those who find it useful and are getting work done with WTL, I hope you are glad we put it in the SDK. And for those who wish MS would fully incorporate it into Visual C++, thanks! We appreciate the feedback, we'll strongly consider that in our future product plans, and I apologize that I couldn't deliver it in VS.NET. Later, Walter Sullivan Lead Program Manager, ATL/MFC

                    L Offline
                    L Offline
                    Ludvig A Norin
                    wrote on last edited by
                    #9

                    I for one is happy you put it in the SDK. WTL greatly helped me learn how to write leaner client code, and provided a set of classes that greatly simplifies the serverside coding as well. The insight in what templates can do for code reuse that I've learned from ATL/WTL has been invaluable to me. Opinions expressed do not neccecarily reflect those of my employer; I do think for myself. Resisting temptation is easier when you think you'll maybe get another chance later on.

                    P 1 Reply Last reply
                    0
                    • L Ludvig A Norin

                      I for one is happy you put it in the SDK. WTL greatly helped me learn how to write leaner client code, and provided a set of classes that greatly simplifies the serverside coding as well. The insight in what templates can do for code reuse that I've learned from ATL/WTL has been invaluable to me. Opinions expressed do not neccecarily reflect those of my employer; I do think for myself. Resisting temptation is easier when you think you'll maybe get another chance later on.

                      P Offline
                      P Offline
                      Paul Wolfensberger
                      wrote on last edited by
                      #10

                      My experience with templates has been "The less the better"! Not only are they complex and obscure the solution in many cases, but they are difficult to develop, and unless you are a library provider, they rarely solve enough problems to warrent their usage. That said....I'm a bit worried about C# not having template support. Using templates for container classes as one does in STL is very nifty. I'm frequenctly using std::vector and std::map. I know that arrays are supported in C#, but haven't discovered if maps are....and since I use maps about as often as vectors, that has me a bit worried.

                      L 1 Reply Last reply
                      0
                      • P Paul Wolfensberger

                        My experience with templates has been "The less the better"! Not only are they complex and obscure the solution in many cases, but they are difficult to develop, and unless you are a library provider, they rarely solve enough problems to warrent their usage. That said....I'm a bit worried about C# not having template support. Using templates for container classes as one does in STL is very nifty. I'm frequenctly using std::vector and std::map. I know that arrays are supported in C#, but haven't discovered if maps are....and since I use maps about as often as vectors, that has me a bit worried.

                        L Offline
                        L Offline
                        Ludvig A Norin
                        wrote on last edited by
                        #11

                        I'd say templates is a design and compiletime feature, and as such it is of most use to me when developing class libraries - which is what I do. Complexity and obscurity are two different things, the former can be handled by providing well-written documentation and tutorials, the latter by simply knowing what you are doing, and keeping in mind that others probably will want to look at the code when using it. Using templates in C# may or may not be a non-issue, depending on who you are listening to. Regarding the .NET runtime capabilities however, template support is irrelevant (to .NET), if we are talking about C++ templates (which really do not change any runtime behaviour). There is of course some thought to be made about the concepts of runtime templates, but if that's a relevant discussion or not is way above my line of skills to make an opinion about. To reconnect the subject; WTL is complex, but not obscure. It helps me solve the problems I need solved in a way that fits my goals (smallest code possible, while still being maintainable to a sufficent degree). Opinions expressed do not neccecarily reflect those of my employer; I do think for myself. Resisting temptation is easier when you think you'll maybe get another chance later on.

                        P 1 Reply Last reply
                        0
                        • W Walter Sullivan

                          The .NET Platform and Frameworks take the API to another level. It is what the majority of Windows developer should and will use. There will be new tools, languages, libraries, books, magazines, and all the other supporting activities necessary to make it a very productive and exciting environment to program in. Must more than we've disclosed so far. I'm here to tell you that alongside the .NET Platform, Microsoft will be actively and aggressively developing an unmanaged operating system API and platform including C++ class libraries exposing the underlying operating system to you for a long time to come. This includes MFC, ATL, ATL Server, DirectX, Kernel, User, GDI, Comctl, and all the other API you've come to know and love. We have a lot of new tools, API, etc, in store for the unmanaged developer as well. You should learn about and try out the .NET stuff, you'll find that it can do much of what you want very easily. The existing stuff only gets better from here as well. Walter Sullivan Lead Program Manager, ATL/MFC

                          realJSOPR Offline
                          realJSOPR Offline
                          realJSOP
                          wrote on last edited by
                          #12

                          All this is real nice and all, but those of us who've been involved with development in Visual C++ and MFC from the beginning been bitten by forced obsolesence imposed by Microsoft in the past, and we're not a very trusting bunch. No amount of corporate rhetoric is going to asuade our trepidation - we'll have to see it to believe it. I've got ten years invested in VC/MFC and while I'm honestly eager to see what .NET and VS7 are all about, I'd hate to think I'm about to lose that time investment and be reduced to the status of a rank beginner once again. I'm too old to have to start over.

                          E 1 Reply Last reply
                          0
                          • L Ludvig A Norin

                            I'd say templates is a design and compiletime feature, and as such it is of most use to me when developing class libraries - which is what I do. Complexity and obscurity are two different things, the former can be handled by providing well-written documentation and tutorials, the latter by simply knowing what you are doing, and keeping in mind that others probably will want to look at the code when using it. Using templates in C# may or may not be a non-issue, depending on who you are listening to. Regarding the .NET runtime capabilities however, template support is irrelevant (to .NET), if we are talking about C++ templates (which really do not change any runtime behaviour). There is of course some thought to be made about the concepts of runtime templates, but if that's a relevant discussion or not is way above my line of skills to make an opinion about. To reconnect the subject; WTL is complex, but not obscure. It helps me solve the problems I need solved in a way that fits my goals (smallest code possible, while still being maintainable to a sufficent degree). Opinions expressed do not neccecarily reflect those of my employer; I do think for myself. Resisting temptation is easier when you think you'll maybe get another chance later on.

                            P Offline
                            P Offline
                            Paul Wolfensberger
                            wrote on last edited by
                            #13

                            Well.....WTL (like ATL) lacks good documenation. Sure....since its open source, if you're willing to dig around you'll be able to uncover the feature or functionality you need. As for complexity being "handled" with documentation....well there isn't enough written about MFC to make it "simple"....I prefer something that is simple to begin with, and which can be enhanced to make something more complex so that the learning curve is something that can be managed while I develop a product -- hey new stuff is great, but I've got new stuff pouring out of my ears!

                            L 1 Reply Last reply
                            0
                            • P Paul Wolfensberger

                              Well.....WTL (like ATL) lacks good documenation. Sure....since its open source, if you're willing to dig around you'll be able to uncover the feature or functionality you need. As for complexity being "handled" with documentation....well there isn't enough written about MFC to make it "simple"....I prefer something that is simple to begin with, and which can be enhanced to make something more complex so that the learning curve is something that can be managed while I develop a product -- hey new stuff is great, but I've got new stuff pouring out of my ears!

                              L Offline
                              L Offline
                              Ludvig A Norin
                              wrote on last edited by
                              #14

                              I strongly disagree on WTL being poorly documented. Sure, there are no documentation of the specific classes included in WTL, but most classes expose the same interface as its corresponding MFC class. What really differs between MFC and ATL is the way classes can interact with each other, like the way CWindow, CContainedWindow and CAxWindow is actually implemented. Using the CListBox is really not that different in WTL from MFC, but making it custom drawn is another whole story. Reusing the code that makes it customdrawn is easier by leaps and bounds in WTL compared to MFC. But then again, that is true only for a specific set of problems; there are a lot of problems that is best solved with MFC (although I'm not working with that kind). WTL specifics may be poorly documented, but ATL is not. If one learns ATL, one will surely understand WTL also, provided that he/she also understands the Win32 API (which, I've noticed, is usually not the case with the in-/mid- experienced MFC programmer). To me, simple is not in contradiction to complex. A lot of complex code is simple to reuse, or to modify, or replace entirely. It may still be complex in the way it is constructed, but that does not put implications on the code that depends on it - the interface is of course defined before the logic problem is actually solved and implemented; thus, any dependant code really is bound to the interface, leaving the implementation to be either complex or straightforward. Opinions expressed do not neccecarily reflect those of my employer; I do think for myself.

                              P 1 Reply Last reply
                              0
                              • realJSOPR realJSOP

                                All this is real nice and all, but those of us who've been involved with development in Visual C++ and MFC from the beginning been bitten by forced obsolesence imposed by Microsoft in the past, and we're not a very trusting bunch. No amount of corporate rhetoric is going to asuade our trepidation - we'll have to see it to believe it. I've got ten years invested in VC/MFC and while I'm honestly eager to see what .NET and VS7 are all about, I'd hate to think I'm about to lose that time investment and be reduced to the status of a rank beginner once again. I'm too old to have to start over.

                                E Offline
                                E Offline
                                Erik Funkenbusch
                                wrote on last edited by
                                #15

                                I can't quite figure out what you are saying here. On the one hand you say "but those of us who've been involved with development in Visual C++ and MFC from the beginning been bitten by forced obsolesence imposed by Microsoft in the past", and then you go on to say how you've been using MFC for 10 years and don't want to lose your investement in it. Which is it? Has MS made MFC incompatible and "bitten" you, or hasn't it?

                                realJSOPR 1 Reply Last reply
                                0
                                • E Erik Funkenbusch

                                  I can't quite figure out what you are saying here. On the one hand you say "but those of us who've been involved with development in Visual C++ and MFC from the beginning been bitten by forced obsolesence imposed by Microsoft in the past", and then you go on to say how you've been using MFC for 10 years and don't want to lose your investement in it. Which is it? Has MS made MFC incompatible and "bitten" you, or hasn't it?

                                  realJSOPR Offline
                                  realJSOPR Offline
                                  realJSOP
                                  wrote on last edited by
                                  #16

                                  I wasn't referring to the language/framework, I was referring to Microsoft's propensity for just abandoning developers with no real notice - case in point - Win32s. They just stopped supporting it with no prior notice to MSDN subscribers, and we had users we had to support. I understand the need to eventually drop support for Win32s (and other antique or work-around technologies), but they pretty much left everyone else high and dry. Further, we were stuck using VC++ 4.1 whgen the rest of the world was free to proceed merily along using newer/better versions of the compiler/framework because MS didn't include support for Win32s in later versions (again understandable, but a pain in the ass, nonetheless). Programmers that have been in the entrenched in the biz for a while have watched MS's development support erode to a mere glimmer of what it was in the not-too-distant past, so I'm probably just a bit jaded. "That was then and this is now" doesn't pass muster with me because it has never worked out in the past. Why should I assume everything is gonna be peachy-f*ckin-keen just because Microsoft says it's gonna be? I certainly don't see a reason to slurp on MS's sphincter simnply because they claim it smells all rosey down there, and I want proof that things have improved. Will I learn C# and .NET? Sure, if I wanna be able to find work. Is C# and .NET everything MS says it's gonna be? Who can tell for sure at this point? Do I have to like and welcome nebulous changes like this? No. I don't mean to sound so bitter/angry/upset or any of that, but i'm not gonna sit back and bite my tongue simply because someone else might not agree with me. :-)

                                  E 1 Reply Last reply
                                  0
                                  • L Ludvig A Norin

                                    I strongly disagree on WTL being poorly documented. Sure, there are no documentation of the specific classes included in WTL, but most classes expose the same interface as its corresponding MFC class. What really differs between MFC and ATL is the way classes can interact with each other, like the way CWindow, CContainedWindow and CAxWindow is actually implemented. Using the CListBox is really not that different in WTL from MFC, but making it custom drawn is another whole story. Reusing the code that makes it customdrawn is easier by leaps and bounds in WTL compared to MFC. But then again, that is true only for a specific set of problems; there are a lot of problems that is best solved with MFC (although I'm not working with that kind). WTL specifics may be poorly documented, but ATL is not. If one learns ATL, one will surely understand WTL also, provided that he/she also understands the Win32 API (which, I've noticed, is usually not the case with the in-/mid- experienced MFC programmer). To me, simple is not in contradiction to complex. A lot of complex code is simple to reuse, or to modify, or replace entirely. It may still be complex in the way it is constructed, but that does not put implications on the code that depends on it - the interface is of course defined before the logic problem is actually solved and implemented; thus, any dependant code really is bound to the interface, leaving the implementation to be either complex or straightforward. Opinions expressed do not neccecarily reflect those of my employer; I do think for myself.

                                    P Offline
                                    P Offline
                                    Paul Wolfensberger
                                    wrote on last edited by
                                    #17

                                    If ATL is not poorly documented, do you mean to say it is well documented????? I sure don't think so, and I've been using it for over three years! Its not awful, and it can be decoded, but it is not well documented. As for being ATL complex but simple, I think you're forgetting that there is a lot to manage WHENEVER you use MI and whenever you use templates....let alone use the two together!! Sometimes a typo in an ATL class header can cause the most confounding error messages!! Don't get me wrong....I love ATL -- I use it a lot when I want to write a COM object that doesn't have any UI support....but for UI I find there is a lot more MFC code out there to work with, and that it is easier to work with. That doesn't mean its "better", but at the same time, MFC more than does the job for my apps.

                                    1 Reply Last reply
                                    0
                                    • realJSOPR realJSOP

                                      I wasn't referring to the language/framework, I was referring to Microsoft's propensity for just abandoning developers with no real notice - case in point - Win32s. They just stopped supporting it with no prior notice to MSDN subscribers, and we had users we had to support. I understand the need to eventually drop support for Win32s (and other antique or work-around technologies), but they pretty much left everyone else high and dry. Further, we were stuck using VC++ 4.1 whgen the rest of the world was free to proceed merily along using newer/better versions of the compiler/framework because MS didn't include support for Win32s in later versions (again understandable, but a pain in the ass, nonetheless). Programmers that have been in the entrenched in the biz for a while have watched MS's development support erode to a mere glimmer of what it was in the not-too-distant past, so I'm probably just a bit jaded. "That was then and this is now" doesn't pass muster with me because it has never worked out in the past. Why should I assume everything is gonna be peachy-f*ckin-keen just because Microsoft says it's gonna be? I certainly don't see a reason to slurp on MS's sphincter simnply because they claim it smells all rosey down there, and I want proof that things have improved. Will I learn C# and .NET? Sure, if I wanna be able to find work. Is C# and .NET everything MS says it's gonna be? Who can tell for sure at this point? Do I have to like and welcome nebulous changes like this? No. I don't mean to sound so bitter/angry/upset or any of that, but i'm not gonna sit back and bite my tongue simply because someone else might not agree with me. :-)

                                      E Offline
                                      E Offline
                                      Erik Funkenbusch
                                      wrote on last edited by
                                      #18

                                      If anything, MS maintains backwards compatibility *TOO* long. Take the for scope of VC6 for instance, or the crappy CObject type identification. Win32s was an abomination. It needed to die, as it was holding back the framework from progressing. If you want to talk abandonment, look at Borland. They simply abandoned OWL completely. They broke all their old users code in the name of chasing after a moving draft standard. BTW, while you were limited to using MFC 4.1, you weren't limited to using VC4.1. You could use MFC 4.1 up to most recent VC6 if you wanted to.

                                      1 Reply Last reply
                                      0
                                      Reply
                                      • Reply as topic
                                      Log in to reply
                                      • Oldest to Newest
                                      • Newest to Oldest
                                      • Most Votes


                                      • Login

                                      • Don't have an account? Register

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • World
                                      • Users
                                      • Groups