Hehe Text Editor: so it begins

July 31, 2008

So, today I will start telling you about a very simple text editor I am making just for the fun of it. The thought appeared to me while I was extremely bored just “stumbling” sites. I thought – “Hey, instead of wasting your time doing nthing why don’t you make a simple text editor and log the whole proccess in your blog?”. And that is basically it. I wrote up some code. The main window and stuff and that was it.

Anyway, some thing I want to achieve during this “session”:

  1. Tabbed documents
  2. Support for large documents
  3. Windows context integration (like Noepad++ does)
  4. Code highlighting
  5. Code folding
  6. Code structure
  7. Autocomplete for functions and variables

And maybe something will be added later. This is a very minimalistic feature list for me right now. Next time I’ll show you what I’ve done so far.

Advertisements

Visual Studio 2005 not showing data sources sometimes…

January 9, 2008

For quite a long time I have been bugged by this bug (;)). I have a solution with several projects in it and some of the projects have data sources. The problem is that sometimes when you switch to another project (e.g. by opening this project’s file in the editor) the data sources are empty. Now, there is a simple trick which can help resolving this problem (restarting VS doesn’t help). Open up the .xsd file from your project tree and rename anything there. Save it. Rename it back and save it again. Now your data sources should be once again visible in the data sources view.

Hope this helps someone.


HOW-TO: Creating a simple UserControl for displaying a FlowDocument

September 12, 2007

Hello. This is my first post about WPF.

This how-to will show you how to create a UserControl in which you can show a FlowDocument by passing a string containing the FlowDocument. It also allows Data Binding.

Lets start.

1. Create a UserControl called FlowDocumentViewer in Expression Blend (you can also do this in Visual Studio if you want) and add a FlowDocumentScrollViewer to LayoutRoot. Name it flowDocument (you can name it like you want, but I will be using this name in this guide). Your structure should be as follows:

Structure

2. Now, open the project in Visual Studio and add the following code to your FlowDocumentViewer.xaml.cs:

        public static readonly DependencyProperty ContentFlowDocumentStringProperty = DependencyProperty.Register(
            "ContentFlowDocumentString",
            typeof(string),
            typeof(FlowDocumentViewer),
            new FrameworkPropertyMetadata(null,
                FrameworkPropertyMetadataOptions.AffectsRender,
                new PropertyChangedCallback(DescriptionFlowDocumentUI.OnContentChanged)
            )
        );

        private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            FlowDocumentViewer control = (FlowDocumentViewer)d;
            control.flowDocument.Document =
                (System.Windows.Documents.FlowDocument)System.Windows.Markup.XamlReader.Load(
                    new MemoryStream(System.Text.UTF8Encoding.Default.GetBytes((string)e.NewValue))
                );
        }

        public string ContentFlowDocumentString
        {
            get { return (string)GetValue(ContentFlowDocumentStringProperty); }
            set { SetValue(ContentFlowDocumentStringProperty, value); }
        }

Lets see what this code does.

a) We added a DependencyProperty called ContentFlowDocumentStringProperty to our class. This DependencyProperty “points” at ContentFlowDocumentString property, as well as it tells, that this property of type string and we registered a callback function (OnContentChanged), which will be triggered when ContentFlowDocumentString is changed. Note that FrameworkPropertyMetadataOptions.AffectsRender piece of code. This tells WPF, that when this property is changed it affects the UI looks, so that WPF knows he has to render something.

b) The OnContentChanged function is called whenever our DependencyProperty is changed. Here we do the actual work of changing the FlowDocument in our control. We get the instance as an argument (DependencyObject d, which we cast to FlowDocumentViewer explicilty) and we create a new FlowDocument from the newly assigned string ((string)e.newValue).

c) Finally we added the actual property – ContentFlowDocumentString. See those GetValue and SetValue? Don’t be surprized, it is how DependencyProperties work. You don’t have a special (private) field in your class for them. WPF does all the work for you.

Well, that is pretty much it.

The usage is simple:

FlowDocumentViewer fdv = new FlowDocumentViewer();
fdv.ContentFlowDocumentString = stringContainingFlowDocumentXAML;

Or if you want to use data binding, it is absolutely similar to casual binding in WPF:

Binding b = new Binding();
b.Source = myBindingSource;
b.Path = new PropertyPath("PathToProperty");
FlowDocumentViewer fdv = new FlowDocumentViewer();
fdv.SetBinding(FlowDocumentViewer.ContentFlowDocumentStringProperty, b);

If you have questions / remarks / etc. feel free to post them. I will try to answer.


Microsoft Entertainment

January 18, 2007

Кстати, уже давно вопрос появился – что это за подкол у M$? В меню Start -> All Programs -> Accessories -> Entertainment есть два пункта – Sound Recorder и Volume Control. Ну вот скажите – какие же это к чёрту развлечения? Запись звука и регулирование громкости. Неужели по мнению M$ есть на свете кретины, которые развлекаются увеличением громкости?!


Microsoft Internship 2007

January 11, 2007

Ну вот значит пришло мне письмо по рассылке университетской о такой штуке как Microsoft Internship 2007. Смысл прост – проходишь парочку собеседований и тебя посылают работать в Редмонд на 3 месяца летом. Мой мозг немного подумал и сказал – “дайте две”. Вы поняли к чему я это всё? Нет, я туда пока что не еду :), но подал заявку в универ, что хочу. Система отбора примерно следующая:

  1. Пишешь что-то вроде мемуаров программиста и отправляешь всё это дело заведующему практикой в универе (у нас – Марика Тамм).
  2. В универе комиссия выбирает тех, кто по их мнению достоин пройти дальше и отправляет мемуары счастливчиков в местный офим MS (Microsoft Eesti).
  3. Microsoft Eesti приглашает всех на собеседование и по результатам отсылает документы лучших в главный офис MS.
  4. Финалисты едут на собеседование в педставителями MS предположительно в Мюнхен и там проходят ещё одно собеседование. По результатам этого собеседования отбирают тех, кто поедет работать в Редмонд.

Собственно говоря, я сейчас на второй ступени. Универ отослал мою кандидатуру в MS Eesti (честно говоря, мне так кажется, что кроме меня заявки никто не подавал – на полном серьёзе говорю). Теперь вот жду какой-нибудь весточки от местных мелкомягких. Пожелайте мне удачи!

PS Да, кстати, я подавал на Software Design Engineer. Это так – может кому интересно.


External Enclosure (for CD/DVD/HD etc.) in Linux vs. in Windows

January 7, 2007

Ok, here’s the story. My laptop DVD+-RW is not working very good, so I decided to get an external DVDR. Well, I already had an external enclosure thingy I didn’t use, so I had to get only a DVD to put inside the box. Ok, as usual, I opened up hv.ee and found a dvdr (no ‘w’) for a small price (just what I need). Bought it and stuffed it into the external box. “Ok”, – thought I – “what could be easier – just plug the USB connector and voila – it’s working!”. Well, not exactly. Turns out that Windows does not know what an external enclosure is. It sees the freaking device (I mean, he sees that there IS SOME device) but does nothing to install it. Ok, apparently I just need to install the drivers. Oh! What a surprise! Drivers are on a CD (yeah, I know, this is the easiest method to distribute drivers – USB sticks are too expencive and floppies are too old)! Well, ok, not a problem. I google for drivers. Good lord, there they are! I download them, extract and run the setup.exe. Ok, the setup doesn’t ask me anything (ok with me if he knows what he’s doin’). Countless error messages appear on the screen (I didn’t count, but believe me – there were many of ’em). And after that “installation” process Windows finally starts seeing the CD in the external enclosure (considering all these error messages that was really a shock for me!). Well, that went nice.

Now, lets try Linux (Ubuntu Edgy Eft). I boot up, enable the external enclosure (with the CD already inside). Ok, it works. Ubuntu automatically mounted it. Yay!


Windows Media Player 11 – "умная” инсталляция

July 14, 2006

Здрассте. Сегодня я пришёл в восторг от инсталляции WMP11. Собственно, один мой знакомый захотел сие себе на вынь, который, есстесственно не совсем легальный. “Ну что ж”, – подумали мы, – “надо качать”… И с серьёзными намерениями потопали в секцию файлов на мягком сайте. Там никакого валидэйшна не спросили, а сразу же дали скачать. 23 Мб, однако. Запускаем – и тут, о ужас (!!) – инсталлер говорит, что у нас не валидная винда. “Всё”, – подумали мы. Но вот дёрнул чёрт вспомнить, что там ВинРАР рвался этот инсталлер распаковать. Дай думаю, попробую. Может и получится чего? Ну ВинРАР вежливо спросил – “куды фигачить?” и я показал куды. Распаковал. Оказалось, что там внутрях 23 файла и 4 из них – исполняемые. Ну что ж, тем лучше для нас. Итак какой же запустить – umdf, wmdbexport, wmfdist11 или wmp11? Ну ясно, что umdf – это явно не то что надо. Ничего из имени не понятно. Проехали, попутно повесив на этот файл ф-цию проверки валидности винды. wmdbexport – ну это и ежу понятно, что нам не сюда. Экспорт WM базы нам не нужен. wmfdist11 – вот оно. Добрались, должно быть это и есть святая святых – великий инсталлер WMP11. Но есть ведь ещё и wmp11 – может это он инсталлер? “Ну и черт с вами”, – подумали мы и запустили wmfdist11. В точку с первой попытки – начинается инсталлер. Что ж прекрасно. В конце нам предложили перезапустить комп (это для медиа-плеера-то!!!), но мы отказались твёрдо решив, что для полноты картины надо ещё и wmp11 заюзать. Зачем-то он ведь нужен? Не зря же у него такое гордое название? В общем запустили – и это тоже инсталлер. Но мы же ничего не читаем, а жмём Next постоянно, опэтому сказать чем первый отличался от второго невозможно 😉 В общем этот тоже не ругался, а всё сделал хорошо и тоже предложил ребут. Ну ладно, мы согласились. И вот, ребут сделан. Наступает момент истины. Жмём на WMP11 и … … он запускается! Та-дааа! Работает нормально, т.е. инсталл прошёл успешно.

Вот такая вот у мелких защита на WMP11… а может они просто дали нам поблажку?..