--- /dev/null
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Glib qw(TRUE FALSE);
+use Gtk2 -init;
+
+my ($where,$taskdir,$home)=('/mo/public/templater/','/mo/templates/',$ENV{'HOME'});
+my @tasks = map { s#.*/##; $_ } (glob "$taskdir/*");
+my $contestName = "MO-P";
+
+sub create_template($$$$) {
+ my ($path,$task,$name,$ext)=@_;
+ return "Project cannot be created!" unless -d $path;
+ return "Specified project already exist!" if -d "$path/$name";
+ mkdir "$path/$name" or return "Can not create project directory!";
+ my %files = (
+ c => {
+ "$where/template-c.cbp" => "$task.cbp",
+ "$where/template.layout" => "$task.layout",
+ "$taskdir/$task/$task.c" => "$task.c",
+ "$taskdir/$task/$task-main.c" => "$task-main.c",
+ "$taskdir/$task/$task.h" => "$task.h",
+ },
+ cpp => {
+ "$where/template-cpp.cbp" => "$task.cbp",
+ "$where/template.layout" => "$task.layout",
+ "$taskdir/$task/$task.cpp" => "$task.cpp",
+ "$taskdir/$task/$task-main.cpp" => "$task-main.cpp",
+ "$taskdir/$task/$task.h" => "$task.h",
+ },
+ pas => {
+ "$where/template-pas.lpi" => "${task}_main.lpi",
+ "$taskdir/$task/$task.pas" => "$task.pas",
+ "$taskdir/$task/${task}_main.pas" => "${task}_main.lpr",
+ }
+ );
+ my $files = $files{$ext} // die "Unknown ext $ext\n";
+ while (my ($file, $target) = each %$files) {
+ $target="$path/$name/$target";
+ # FUJ! S tímhle by se něco mělo dělat.
+ system("sed 's#fILENAMe#$name#;
+ s#fILENAMEEXt#$name.$ext#;
+ s#tASk#$task#;
+ s#tASKEXt#$task.$ext#;
+ s#pATHFILENAMe#$path/$name/$name#;
+ s#pATHFILENAMEEXt#$path/$name/$name.$ext#;
+ ' < '$file' > '$target'");
+ }
+ return "";
+}
+
+sub open_project($) {
+ my ($p)=@_;
+ my $cmd;
+ my @files = glob "$home/$p/*.cbp";
+ if (@files) {
+ $cmd = 'codeblocks';
+ } else {
+ $cmd = 'lazarus-ide';
+ @files = ((glob "$home/$p/*.lpi"), (glob "$home/$p/*.pas"));
+ }
+ print("@files\n");
+ system("$cmd @files &");
+}
+
+sub existing_projects($) {
+ my ($lopen_data,$lang)=@_;
+ foreach ((glob "$home/*/*.cbp"), (glob "$home/*/*.lpr")) {
+ my ($name, $task) = m#.*/(.*?)/(.*)(_main\.lpr|\.cbp)#;
+ print "$name $task\n";
+ $lang=-f "$home/$name/$task.c" ? 'C' : -f "$home/$name/$task.cpp" ? 'C++' : -f "$home/$name/$task.pas" ? 'Pascal' : '';
+ $lopen_data->set($lopen_data->append, 0, "$1", 1, $lang);
+ }
+}
+
+sub main_window() {
+ my $retcode='';
+
+ my $w=Gtk2::Window->new('toplevel');
+ $w->signal_connect('destroy' => sub { $retcode='quit' unless length $retcode; Gtk2->main_quit; });
+ $w->set_default_icon_from_file("$where/templater.xpm");
+ $w->set_position('center');
+ $w->set_default_size(600,-1);
+ $w->set_title("$contestName project management");
+ my $b=Gtk2::VBox->new(FALSE,0);
+ $b->set_border_width(10);
+ $w->add($b);
+
+ my $fnew=Gtk2::Frame->new("Create new $contestName contest project");
+ my $xnew=Gtk2::HBox->new(FALSE,0);
+ $xnew->set_border_width(10);
+ my $inew=Gtk2::Image->new_from_file("$where/templater.xpm");
+ my $bnew=Gtk2::Button->new_with_label("Create new $contestName contest project");
+ $bnew->signal_connect('clicked' => sub { $retcode='new'; $w->destroy; });
+ $xnew->pack_start($inew,FALSE,TRUE,10);
+ $xnew->pack_start($bnew,TRUE,TRUE,10);
+ $fnew->add($xnew);
+ $b->pack_start($fnew,FALSE,TRUE,10);
+
+ my $fopen=Gtk2::Frame->new("Open existing $contestName contest project");
+ my $yopen=Gtk2::VBox->new(FALSE,0); $yopen->set_border_width(5);
+ my $xopen=Gtk2::HBox->new(FALSE,0); $xopen->set_border_width(5);
+ my $lopen_data=Gtk2::ListStore->new(('Glib::String','Glib::String'));
+ existing_projects($lopen_data);
+ my $lopen=Gtk2::TreeView->new_with_model($lopen_data);
+ my $lopen_c1=Gtk2::TreeViewColumn->new_with_attributes('Project name',Gtk2::CellRendererText->new, text=>0);
+ my $lopen_c2=Gtk2::TreeViewColumn->new_with_attributes('Language',Gtk2::CellRendererText->new, text=>1);
+ $lopen_c1->set_expand(TRUE); $lopen->append_column($lopen_c1); $lopen->append_column($lopen_c2);
+ my $iopen=Gtk2::Image->new_from_file("$where/templater.xpm");
+ my $bopen=Gtk2::Button->new_with_label("Open existing $contestName contest project");
+ $bopen->signal_connect('clicked' => sub { open_project $lopen_data->get(scalar($lopen->get_selection->get_selected),0),
+ $w->destroy; });
+ $bopen->set_sensitive(FALSE);
+ $lopen->signal_connect('row-activated' => sub { $bopen->clicked });
+ $lopen->get_selection->set_mode('single');
+ $lopen->get_selection->signal_connect('changed' => sub { $bopen->set_sensitive(TRUE) } );
+ $xopen->pack_start($iopen,FALSE,TRUE,10);
+ $xopen->pack_start($bopen,TRUE,TRUE,10);
+ $yopen->pack_start($lopen,TRUE,TRUE,5);
+ $yopen->pack_start($xopen,FALSE,TRUE,5);
+ $fopen->add($yopen);
+ $b->pack_start($fopen,TRUE,TRUE,10);
+
+ my $bquit=Gtk2::Button->new_from_stock('gtk-quit');
+ $bquit->signal_connect('clicked' => sub { $w->destroy; });
+ $b->pack_start($bquit,FALSE,TRUE,5);
+
+ $w->show_all;
+ Gtk2->main;
+ $retcode;
+}
+
+sub message($$$) {
+ my $m=Gtk2::MessageDialog->new($_[0], 'modal', $_[2], 'ok', $_[1]);
+ $m->run;
+ $m->destroy;
+ 1
+}
+
+sub new_window() {
+ my $retcode='';
+
+ my $w=Gtk2::Window->new('toplevel');
+ $w->signal_connect('destroy' => sub { $retcode='quit' unless length $retcode; Gtk2->main_quit; });
+ $w->set_default_icon_from_file("$where/templater.xpm");
+ $w->set_position('center');
+ $w->set_default_size(500,-1);
+ $w->set_title("Create new $contestName project");
+
+ my $b=Gtk2::VBox->new(FALSE,0);
+ $b->set_border_width(10);
+ $w->add($b);
+
+ my $flang=Gtk2::Frame->new('Choose project language');
+ my $xlang=Gtk2::HBox->new(FALSE,0);
+ $xlang->set_border_width(10);
+ my $r_c=Gtk2::RadioButton->new_with_label(undef, 'C');
+ my $r_cpp=Gtk2::RadioButton->new_with_label($r_c->get_group(), 'C++');
+ my $r_pas=Gtk2::RadioButton->new_with_label($r_c->get_group(), 'Pascal');
+ $r_c->set_active(TRUE);
+ $xlang->pack_start($r_c,TRUE,TRUE,5);
+ $xlang->pack_start($r_cpp,TRUE,TRUE,5);
+ $xlang->pack_start($r_pas,TRUE,TRUE,5);
+ $flang->add($xlang);
+ $b->pack_start($flang,FALSE,TRUE,10);
+
+ my $ftask=Gtk2::Frame->new('Choose task');
+ my $xtask=Gtk2::HBox->new(FALSE,0);
+ $xtask->set_border_width(10);
+ my $group;
+ my $task = $tasks[0];
+ for my $t (@tasks) {
+ my $rb=Gtk2::RadioButton->new_with_label($group, $t);
+ $rb->signal_connect(clicked => sub {
+ $task = $t;
+ });
+ unless ($group) {
+ $rb->set_active(TRUE);
+ $group=$rb->get_group();
+ }
+ $xtask->pack_start($rb,TRUE,TRUE,5);
+ }
+ $ftask->add($xtask);
+ $b->pack_start($ftask,FALSE,TRUE,10);
+
+ my $fprj=Gtk2::Frame->new('Enter project name');
+ my $eprj=Gtk2::Entry->new;
+ $fprj->add($eprj);
+ $b->pack_start(Gtk2::HBox->new(),TRUE,TRUE,0);
+ $b->pack_start($fprj,FALSE,TRUE,10);
+
+ my $xcreate=Gtk2::HBox->new(FALSE,0);
+ $xcreate->set_border_width(10);
+ my $icreate=Gtk2::Image->new_from_file("$where/templater.xpm");
+ my $bcreate=Gtk2::Button->new_from_stock('gtk-new');
+ my $qcreate=Gtk2::Button->new_from_stock('gtk-cancel');
+ $bcreate->signal_connect('clicked' => sub {
+ my $p=$eprj->get_text; $p =~ s/^\s*//; $p =~ s/\s*$//;
+ if ($p =~ /\W/) {
+ message($w, 'Sorry, but be nice with the project name!', 'error');
+ return;
+ }
+ if (not length $p) {
+ message($w, 'No project name specified!', 'error');
+ return;
+ }
+ my $ret=create_template $home, $task, $p, ($r_c->get_active ? 'c' : $r_cpp->get_active ? 'cpp' : 'pas');
+ length $ret and message($w,$ret,'error') and return;
+ open_project $p;
+ $retcode='new';
+ $w->destroy;
+ });
+ $qcreate->signal_connect('clicked' => sub { $w->destroy; });
+ $xcreate->pack_start($icreate,FALSE,TRUE,10);
+ $xcreate->pack_start($bcreate,TRUE,TRUE,10);
+ $xcreate->pack_start($qcreate,TRUE,TRUE,10);
+ $b->pack_start(Gtk2::HBox->new(),TRUE,TRUE,0);
+ $b->pack_start($xcreate,FALSE,TRUE,10);
+
+ $w->show_all;
+ Gtk2->main;
+ $retcode;
+}
+
+while (main_window eq 'new') {
+ new_window eq 'quit' or exit 0;
+}
--- /dev/null
+/* XPM */
+static char *kdevelop[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c #000000",
+". c #04040C",
+"X c #000D00",
+"o c #0B0B0E",
+"O c #0D0D10",
+"+ c #071700",
+"@ c #001A00",
+"# c #131316",
+"$ c #14141A",
+"% c #19191D",
+"& c #1B1B24",
+"* c #1F1F2C",
+"= c #15152A",
+"- c #002B00",
+"; c #003E00",
+": c #0A3000",
+"> c #153D03",
+", c #212126",
+"< c #22222C",
+"1 c #2C2C35",
+"2 c #2D2D3B",
+"3 c #34343F",
+"4 c #373748",
+"5 c #383844",
+"6 c #004F00",
+"7 c #005600",
+"8 c #015900",
+"9 c #095C00",
+"0 c #164A02",
+"q c #195502",
+"w c #006500",
+"e c #006C00",
+"r c #404047",
+"t c #40404A",
+"y c gray29",
+"u c #424252",
+"i c #484852",
+"p c #4A4A5C",
+"a c #535355",
+"s c #54545C",
+"d c #5C5C5D",
+"f c #5C5C6B",
+"g c #5B5B71",
+"h c #636363",
+"j c #63636C",
+"k c #6B6B6B",
+"l c #686776",
+"z c #70707C",
+"x c #7C7C7C",
+"c c #747474",
+"v c #727283",
+"b c #7D7C8C",
+"n c #79778C",
+"m c #7B7B93",
+"M c #7F7FBF",
+"N c #0A8A04",
+"B c #029B00",
+"V c #079906",
+"C c #108F0A",
+"Z c #118D00",
+"A c #189207",
+"S c #1F9C1C",
+"D c #0DA400",
+"F c #07A300",
+"G c #14A301",
+"H c #1DAD01",
+"J c #1DA91B",
+"K c #29911F",
+"L c #298E28",
+"P c #309A29",
+"I c #20AD00",
+"U c #23A716",
+"Y c #2AB300",
+"T c #2EB802",
+"R c #27B601",
+"E c #39AC01",
+"W c #33B902",
+"Q c #3CB200",
+"! c #37B716",
+"~ c #2AA920",
+"^ c #30AA2C",
+"/ c #30A828",
+"( c #34B027",
+") c #3BC102",
+"_ c #439A3E",
+"` c #40A71D",
+"' c #42BC05",
+"] c #5ABB0E",
+"[ c #47A726",
+"{ c #4EBD35",
+"} c #46B63C",
+"| c #58A82C",
+" . c #78B93D",
+".. c #69B42A",
+"X. c #49B449",
+"o. c #50BB4C",
+"O. c #5BBF54",
+"+. c #5FBE58",
+"@. c #55BB51",
+"#. c #61AF4E",
+"$. c #64B440",
+"%. c #62BD5C",
+"&. c #72B544",
+"*. c #77B46F",
+"=. c #4DCA01",
+"-. c #48C408",
+";. c #4BC31C",
+":. c #54CE07",
+">. c #54CB1C",
+",. c #5ED700",
+"<. c #68D800",
+"1. c #75C91A",
+"2. c #7DD610",
+"3. c #6AC714",
+"4. c #6CD233",
+"5. c #71D634",
+"6. c #7AE200",
+"7. c #61C252",
+"8. c #72C35C",
+"9. c #7BD541",
+"0. c #6DC46B",
+"q. c #65C463",
+"w. c #75C96C",
+"e. c #73C76F",
+"r. c #73C672",
+"t. c #7CC878",
+"y. c #84CD27",
+"u. c #89CB36",
+"i. c #81EA15",
+"p. c #87F000",
+"a. c #90EC18",
+"s. c #98F90D",
+"d. c #80E136",
+"f. c GreenYellow",
+"g. c #ABFF24",
+"h. c #A6F832",
+"j. c #8DC949",
+"k. c #8ADF4D",
+"l. c #95C85B",
+"z. c #83C47F",
+"x. c #91C577",
+"c. c #8CE245",
+"v. c #9BEF43",
+"b. c #9FE960",
+"n. c #A3CB7B",
+"m. c #A3E276",
+"M. c #B0F263",
+"N. c #BCF678",
+"B. c #838383",
+"V. c #83838B",
+"C. c #8A8A8A",
+"Z. c #8A8A9D",
+"A. c #848497",
+"S. c #90909E",
+"D. c #9A9A9B",
+"F. c #929293",
+"G. c #8E8DA4",
+"H. c #9494A3",
+"J. c #9A9AAC",
+"K. c #9594A7",
+"L. c #9E9EB2",
+"P. c #A9A8AD",
+"I. c #A5A3B9",
+"U. c #AEABB3",
+"Y. c #ABABBB",
+"T. c #A6A5BA",
+"R. c #B2AEBE",
+"E. c #B1B1B1",
+"W. c #ACAAC0",
+"Q. c #AAA5C1",
+"!. c #B2B2C4",
+"~. c #B6B4CA",
+"^. c #BCBBCB",
+"/. c #BEBCD1",
+"(. c #85CE85",
+"). c #89CF89",
+"_. c #8CCD85",
+"`. c #89D086",
+"'. c #8AD089",
+"]. c #87D082",
+"[. c #96C588",
+"{. c #97C295",
+"}. c #92D293",
+"|. c #A8C596",
+" X c #A7DE93",
+".X c #AACFA1",
+"XX c #A6D0A0",
+"oX c #A7D1A8",
+"OX c #A4DAA4",
+"+X c #A7DDA8",
+"@X c #AAD3A5",
+"#X c #A8DBA8",
+"$X c #B3D0A1",
+"%X c #B3DEB2",
+"&X c #B0D5B0",
+"*X c #BDF288",
+"=X c #AFE2AE",
+"-X c #B4E5B4",
+";X c #C3BFD6",
+":X c #C7F2A5",
+">X c #D6FBB1",
+",X c #C3C2C5",
+"<X c #C0C0CD",
+"1X c #C4C9CA",
+"2X c #C8C8C9",
+"3X c #C4C4D2",
+"4X c #CBCAD6",
+"5X c #CBCBD9",
+"6X c #C8C4D6",
+"7X c #C2D9C5",
+"8X c #CCDCC6",
+"9X c #CBDCCE",
+"0X c #CED4D6",
+"qX c #CFDBD0",
+"wX c #D0CDDE",
+"eX c #D1DDCD",
+"rX c #D2D1D5",
+"tX c #D3D3DD",
+"yX c #D8D8DB",
+"uX c #D5D3E4",
+"iX c #D9D4E6",
+"pX c #DBDBE4",
+"aX c #DDDBEB",
+"sX c #C0E6C0",
+"dX c #CCE9C8",
+"fX c #DAE2DC",
+"gX c #D5E1D5",
+"hX c #D6F1D6",
+"jX c #DEF2DE",
+"kX c #DEE0E3",
+"lX c #E4DEEE",
+"zX c #E1DFE4",
+"xX c #E6FFC8",
+"cX c #E3FDC0",
+"vX c #E9F6DD",
+"bX c #E2E2E5",
+"nX c #E4E2EA",
+"mX c #E8E5ED",
+"MX c #EAEAEE",
+"NX c #E0EAE0",
+"BX c #EAE3F2",
+"VX c #ECEBF1",
+"CX c #EEECF8",
+"ZX c #E4F4E4",
+"AX c #EBF5EB",
+"SX c #EAF8EA",
+"DX c #F2EDF8",
+"FX c #F9FFEF",
+"GX c #F5FDEA",
+"HX c #F2F2F5",
+"JX c #F6F6F9",
+"KX c #F4FAF3",
+"LX c #F7FDF8",
+"PX c #F9F5FC",
+"IX c #FAFCF7",
+"UX c #FDFCFD",
+"YX c None",
+/* pixels */
+"YXYXYX# B. YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYX A.UXV.v z YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX1 Y.pXpXpXb & YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYXk nXUXUXMXJ.4 = S.b YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYXf MXUXUXUXUX!.J.BXK.- e e w 8 9 - YXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYX. H.JXUXUXMXnXJX{.L C ^ X.X.( K N 8 @ YXYXYXYXYXYXYXYXYX",
+"YXYXYXYXYX1 <XUXMXBXfX_ P `.hXSXLXLXKXSX-Xq.C ; YXYXYXYXYXYXYX",
+"YXYXYXYXYX f 5XnXgXK %.hXSXZXjXjXjXjXjXAXSX=X^ 6 YXYXYXYXYXYX",
+"YXYXYXYXYXYX$ ~.AXP %.dXsXsXsXsXsXsXsXsXsXsXdX=XU ; YXYXYXYXYXYX",
+"YXYXYXYXYXYXa PX*.U #X#XOXOXOXOXOXOXOXOXOXOXOX%Xt.C @ YXYXYXYXYX",
+"YXYXYXYXYXYXP.kXA @.}.).].].`.).`.].`.`.'.'.).).].J 9 YXYXYXYX",
+"YXM I.J.J.G.lX[.B X.r.0.z.oX7X9X7X&X`.w.w.r.e.r.0.J Z + YXYXYXYX",
+"f <X<X4XyXtXVX#.B ^ @.[.pXJXUXUXUXUXMXoX7.7.7.+.@.V G : YXYXYXYX",
+"s JXUXUXUXnXbX[ B V (.mXPXJXJXUXUXHXmXlXXX{ { } ( B H 0 YXYXYXYX",
+"s UXUXUXUXnXkX` D ~ rXDXJXHXMXyX,XE.P.zXBX8.! ! H D I q YXYXYX",
+"a aXHXUXUXnXbX[ D z.VXMXrXU.F.B.B.x D.mXBX.XW Y I G R 0 YXYXYX",
+"$ i l A.Y.~.aX .I $XU.k h h h k k h E.MXlXeX' W Y I T > YXYXYXYX",
+"YX . $ u aXx.Y %X6Xa y d d h d h rXMXMXfX-.W W W E + YXYXYXYX",
+"YXYXYXYXYX R.dXQ XUXrXc d k c k F.HXMXDX8X=.-.;.) | n * YXYXYX",
+"YXYXYXYXYXYXs DX&.9.UXUXbXC.c x x 2XIXHXPXm.:.5.>.' |.~.$ YXYXYX",
+"YXYXYXYXYXYX1 6XeX] :XUXUXMXD.C.D.HXUXUXvXc.k.5.=.&.wXv YXYXYX",
+"YXYXYXYXYX J.<XpX$X3.>XUXUXUX,XrXIXUXGX*Xb.5.<...1XT.L.t YXYXYX",
+"YXYXYXYXYXk tXJX5XiX$X1.M.xXIXLXKXFXcXN.v.i.<. .1XQ.<XtXA.. YXYX",
+"YXYXYXYX3 ~.HXUXJX5XuXeXj.2.a.h.f.g.s.p.6.1.[.rXQ.^.VXnX~.p YX",
+"YXYXYX H.MXUXJXUXnXK.I.aX9Xn.j.y.y.u.l.|.0X/.G.!.bXmXkXpXG.& YX",
+"YXYXYX z nXUXJX5Xb 2 o 5 G.;X5X6X3X6X3XQ.l & % v W.tXnXpXJ.* YX",
+"YXYXYXYX f tXY.p o YX b ^.3X^.^.G.< YX 3 A./.L.3XH.o ",
+"YXYXYXYXYX 4 < YXYXYXYXj iXHXHXnXA.. YXYXYXYXYXo u 2 H.aX1 ",
+"YXYXYXYXYXYX YXYXYXYXYXYX5 3XMXMXwXg YXYXYXYXYXYX # 3 ",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX< Y.HXHX3X4 YXYXYXYXYXYXYXYXYX YX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX. Z.3X<XK.& YXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX & , & & . YXYXYXYXYXYXYXYXYXYXYXYX"
+};