Page 1 of 1

Command line interface

PostPosted: Wed Dec 23, 2009 10:09 am
by IgorMilavec
Hi.

What is your opinion on supporting integration options from the command line, i.e.:
/paste (automatically paste from the clipboard upon starting)
/open <filename> (automatically open the specified file upon starting)

Also, it would be nice to integrate into Windows shell and provide "Open in Image Processing Lab" context menu for image files.

If you want to include this functionality I can provide the code for command line processing.

Regards, Igor

Re: Command line interface

PostPosted: Wed Dec 23, 2009 3:56 pm
by andrew.kirillov
Hello

Yes, these features seem to be nice. If you could send an SVS patch to speed up their integration, I would appreciate.

Re: Command line interface

PostPosted: Thu Dec 24, 2009 10:10 am
by IgorMilavec
Hi.

Here is the patch (sorry for pasting it here, it seems that .diff and .patch attachments are not permitted):
Code: Select all
Index: MainForm.cs
===================================================================
--- MainForm.cs   (revision 39)
+++ MainForm.cs   (working copy)
@@ -26,7 +26,17 @@
   /// </summary>
   public class MainForm : System.Windows.Forms.Form, IDocumentsHost
   {
-        private static string configFile = Path.Combine( System.Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ), "app.config" );
+        /// <summary>
+        /// Specifies the action the application performs upon starting.
+        /// </summary>
+        protected enum AutoOpenMode
+        {
+            None,
+            Clipboard,
+            File
+        }
+
+        private static string configFile = Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "app.config");
         private static string dockManagerConfigFile = Path.Combine( System.Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ), "DockManager.config" );

      private int unnamedNumber = 0;
@@ -121,8 +131,14 @@
      private System.Windows.Forms.MenuItem statisticsViewItem;
      private System.ComponentModel.IContainer components;

-      public MainForm()
+        private AutoOpenMode autoOpenMode;
+        private string autoOpenParam;
+
+        protected MainForm(AutoOpenMode autoOpenMode, string autoOpenParam)
      {
+            this.autoOpenMode = autoOpenMode;
+            this.autoOpenParam = autoOpenParam;
+
         //
         // Required for Windows Form Designer support
         //
@@ -870,9 +886,54 @@
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
-      static void Main()
+      static void Main(string[] args)
      {
-         Application.Run(new MainForm());
+            // Parse the command line
+            bool showUsage = false;
+            AutoOpenMode autoOpenMode = AutoOpenMode.None;
+            string autoOpenParam = string.Empty;
+            if (args.Length >= 1)
+            {
+                if (string.Compare(args[0], "/paste", true) == 0)
+                {
+                    autoOpenMode = AutoOpenMode.Clipboard;
+                    if (args.Length >= 2)
+                    {
+                        showUsage = true;
+                    }
+                }
+                else if (string.Compare(args[0], "/open", true) == 0)
+                {
+                    autoOpenMode = AutoOpenMode.File;
+                    if (args.Length == 2)
+                    {
+                        autoOpenParam = args[1];
+                    }
+                    else
+                    {
+                        showUsage = true;
+                    }
+                }
+                else if (File.Exists(args[0]))
+                {
+                    // Handle the case where somebody just drops the file on the application icon
+                    autoOpenMode = AutoOpenMode.File;
+                    autoOpenParam = args[0];
+                }
+                else
+                {
+                    showUsage = true;
+                }
+            }
+
+            if (showUsage)
+            {
+                MessageBox.Show("Usage:\tiplab.exe [/paste | /open <fileName>]\r\n\r\nOptions:\t/paste\tPaste the contents of the clipboard.\r\n\t/open\tOpen the specified file.\r\n", "Image Processing Lab", MessageBoxButtons.OK, MessageBoxIcon.Information);
+            }
+            else
+            {
+                Application.Run(new MainForm(autoOpenMode, autoOpenParam));
+            }
      }

      #region IDocumentsHost implementation
@@ -996,6 +1057,17 @@

         // show histogram
         ShowHistogram(config.histogramVisible);
+
+            switch (autoOpenMode)
+            {
+                case AutoOpenMode.Clipboard:
+                    PasteFromClipboard();
+                    break;
+
+                case AutoOpenMode.File:
+                    OpenFile(autoOpenParam);
+                    break;
+            }
      }

      // Callback for loading Dock Manager
@@ -1100,31 +1172,37 @@
      {
         if (ofd.ShowDialog() == DialogResult.OK)
         {
-            ImageDoc imgDoc = null;
-            
-            try
-            {
-               // create image document
-               imgDoc = new ImageDoc(ofd.FileName, (IDocumentsHost) this);
-               imgDoc.Text = Path.GetFileName(ofd.FileName);
+                OpenFile(ofd.FileName);
+         }      
+      }

-            }
-            catch (ApplicationException ex)
-            {
-               MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
-            }
+        // Open specified file
+        private void OpenFile(string fileName)
+        {
+            ImageDoc imgDoc = null;

-            if (imgDoc != null)
-            {
-               imgDoc.Show(dockManager);
-               imgDoc.Focus();
+            try
+            {
+                // create image document
+                imgDoc = new ImageDoc(fileName, (IDocumentsHost)this);
+                imgDoc.Text = Path.GetFileName(fileName);

-               // set events
-               SetupDocumentEvents(imgDoc);
-            }
-         }      
-      }
+            }
+            catch (ApplicationException ex)
+            {
+                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }

+            if (imgDoc != null)
+            {
+                imgDoc.Show(dockManager);
+                imgDoc.Focus();
+
+                // set events
+                SetupDocumentEvents(imgDoc);
+            }
+        }
+
      // Show/hide histogram
      private void ShowHistogram(bool show)
      {


Let me know if this is OK.

Regards, Igor

Re: Command line interface

PostPosted: Tue Dec 29, 2009 8:10 am
by andrew.kirillov
Hello,

Sorry for a bit late reply. Just was carried away by Christmas ;)

Could you, please, rename patch file to html and submit as attachment? HTML files are allowed. I tried patching but it looks like PHPBB changed a bit spacing/tabbing, so SVN is confused and can not patch.

Thank you.

Re: Command line interface

PostPosted: Sun Jan 03, 2010 5:52 pm
by IgorMilavec
Hi.

No problem, I was a little bit offline, too. :)

HTML also seems to be forbidden. Tried txt, exe ;), ... nothing worked. On a PM I cannot attach...
I have put the diff on http://cl1p.net/MainForm_diff/ , can you download it from there?

Regards, Igor

Re: Command line interface

PostPosted: Mon Jan 04, 2010 10:39 am
by andrew.kirillov
Hello,

IgorMilavec wrote:HTML also seems to be forbidden. Tried txt, exe , ... nothing worked. On a PM I cannot attach...

Hmm ... Maybe there is something with access rights. Need to take a look.

Anyway. Merged, committed, works fine. Will be available with next release. You are now listed as contributor!

Thank you for sharing the code.

Re: Command line interface

PostPosted: Mon Jan 04, 2010 10:09 pm
by IgorMilavec
Heh, not much of a contribution compared to the work you have done!

Thanks! Igor