示例#1
0
        /// <summary>
        /// Converts list of missing callbacks to readable string
        /// </summary>
        /// <param name="callbacks">Operator Callbacks</param>
        /// <returns>String of missing callbacks</returns>
        private string ConvertMissingCallbacksToString(OperatorCallbacks callbacks)
        {
            string[] missingCallbacks;
            NativeOperatorCallbacks noc = callbacks as NativeOperatorCallbacks;

            if (noc != null)
            {
                missingCallbacks = noc.MissingCallbacks;
            }
            else
            {
                NativeOperatorRemotingCallbacks norc = callbacks as NativeOperatorRemotingCallbacks;
                if (norc != null)
                {
                    missingCallbacks = norc.MissingCallbacks;
                }
                else
                {
                    return(null);
                }
            }

            StringBuilder text = new StringBuilder();

            for (int i = 0; i < missingCallbacks.Length; i++)
            {
                if (i > 0)
                {
                    text.Append(", ");
                }

                string current = missingCallbacks[i];
                if (current.StartsWith("constant_", StringComparison.Ordinal))
                {
                    text.Append(current, 9, current.Length - 9);
                }
                else if (current.StartsWith("operator_", StringComparison.Ordinal))
                {
                    text.Append(current, 9, current.Length - 9);
                }
                else
                {
                    text.Append(current);
                }
            }
            return(text.ToString());
        }
示例#2
0
        private void OnImplementationAddButtonClick(object sender, EventArgs e)
        {
            ListView.Item selected = listView.FocusedItem;
            if (selected == null)
            {
                return;
            }

            using (OpenFileDialog dialog = new OpenFileDialog()) {
                dialog.CheckFileExists  = true;
                dialog.Filter           = Tx.T("mathlib.filetype") + " (*.dll)|*.dll";
                dialog.FilterIndex      = 0;
                dialog.RestoreDirectory = true;
                dialog.Title            = Tx.T("mathlib.load");

                if (dialog.ShowDialog(this) != DialogResult.OK)
                {
                    return;
                }

                string filename = dialog.FileName;

                try {
                    NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks(filename);

                    ToolStripMenuItem item = new ToolStripMenuItem(callbacks.ImplementationName);
                    item.ShortcutKeyDisplayString = "(" + Path.GetFileName(filename) + ")";
                    item.Click += OnSetItemCallbacksButtonClick;
                    item.Tag    = callbacks;

                    string missingCallbacks = ConvertMissingCallbacksToString(callbacks);
                    if (!string.IsNullOrEmpty(missingCallbacks))
                    {
                        item.ToolTipText = Tx.T("mathlib.missing callbacks") + missingCallbacks;
                    }

                    implementationButton.DropDownItems.Add(item);

                    OnSetItemCallbacksButtonClick(item, EventArgs.Empty);
                } catch (BadImageFormatException) {
                    if (Environment.Is64BitProcess)
                    {
                        try {
                            NativeOperatorRemotingCallbacks callbacks = new NativeOperatorRemotingCallbacks(filename);

                            ToolStripMenuItem item = new ToolStripMenuItem(callbacks.ImplementationName);
                            item.ShortcutKeyDisplayString = "(x86, " + Path.GetFileName(filename) + ")";
                            item.Click += OnSetItemCallbacksButtonClick;
                            item.Tag    = callbacks;

                            string missingCallbacks = ConvertMissingCallbacksToString(callbacks);
                            if (!string.IsNullOrEmpty(missingCallbacks))
                            {
                                item.ToolTipText = Tx.T("mathlib.missing callbacks") + missingCallbacks;
                            }

                            implementationButton.DropDownItems.Add(item);

                            OnSetItemCallbacksButtonClick(item, EventArgs.Empty);
                        } catch (InvalidOperationException) {
                            MessageBox.Show(this, Tx.T("mathlib.errors.not valid"), Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        } catch (Exception ex) {
                            MessageBox.Show(this, ex.Message, Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        MessageBox.Show(this, Tx.T("mathlib.errors.platform mismatch"), Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                } catch (InvalidOperationException) {
                    MessageBox.Show(this, Tx.T("mathlib.errors.not valid"), Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                } catch (Exception ex) {
                    MessageBox.Show(this, ex.Message, Tx.T("mathlib.errors.title"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
示例#3
0
        /// <summary>
        /// Checks missing callbacks for given arithmetic expression
        /// </summary>
        /// <param name="item">Item to check</param>
        /// <param name="text">String builder to append warings to</param>
        private void CheckCallbacks(ListView.Item item, StringBuilder text)
        {
            if (item?.OperatorCallbacks == null)
            {
                return;
            }
            ArithmeticExpression ae = item.NumericValueSource as ArithmeticExpression;

            if (ae == null)
            {
                return;
            }

            bool isFirst      = true;
            bool iconAppended = false;

            string[] missingCallbacks = null;

            NativeOperatorCallbacks callbacks = item.OperatorCallbacks as NativeOperatorCallbacks;

            if (callbacks != null)
            {
                missingCallbacks = callbacks.MissingCallbacks;
                if (missingCallbacks.Length == 0)
                {
                    return;
                }
            }
            else
            {
                NativeOperatorRemotingCallbacks proxyCallbacks = item.OperatorCallbacks as NativeOperatorRemotingCallbacks;
                if (proxyCallbacks != null)
                {
                    iconAppended = true;
                    text.Append("      \f[-]\f[image:warning]  \f[0xaa6400]\f[I]" + Tx.T("mathlib.remoting"));

                    missingCallbacks = proxyCallbacks.MissingCallbacks;
                    if (missingCallbacks.Length == 0)
                    {
                        text.Append("\f[I]\f[Rc]");
                        return;
                    }
                }
            }

            if (missingCallbacks == null)
            {
                return;
            }

            for (int i = 0; i < missingCallbacks.Length; i++)
            {
                string current = missingCallbacks[i];
                if (!ae.IsCallbackUsed(current))
                {
                    continue;
                }

                if (isFirst)
                {
                    isFirst = false;
                    if (iconAppended)
                    {
                        text.Append(" \f[0x999999]|\f[0xaa6400] " + Tx.T("mathlib.missing callbacks"));
                    }
                    else
                    {
                        text.Append("      \f[-]\f[image:warning]  \f[0xaa6400]\f[I]" + Tx.T("mathlib.missing callbacks"));
                    }
                }
                else
                {
                    text.Append(", ");
                }

                if (current.StartsWith("constant_", StringComparison.Ordinal))
                {
                    text.Append("\f[I]");
                    text.Append(current, 9, current.Length - 9);
                    text.Append("\f[I]");
                }
                else if (current.StartsWith("operator_", StringComparison.Ordinal))
                {
                    text.Append(current, 9, current.Length - 9);
                }
                else
                {
                    text.Append(current);
                }
            }

            if (!isFirst)
            {
                text.Append("\f[I]\f[Rc]");
            }
        }
示例#4
0
        /// <summary>
        /// Loads all mathematical libraries from x86 and x64 folders
        /// </summary>
        /// <param name="items"></param>
        private void LoadAllExternalOperators(ToolStripItemCollection items)
        {
            string pathRoot    = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
            string pathBitness = Path.Combine(pathRoot, Environment.Is64BitProcess ? "x64" : "x86");

            if (Directory.Exists(pathBitness))
            {
                foreach (string filename in Directory.EnumerateFiles(pathBitness, "*.dll"))
                {
                    try {
                        NativeOperatorCallbacks callbacks = new NativeOperatorCallbacks(filename);

                        ToolStripMenuItem item = new ToolStripMenuItem(callbacks.ImplementationName);
                        item.Click += OnSetItemCallbacksButtonClick;
                        item.Tag    = callbacks;

                        string missingCallbacks = ConvertMissingCallbacksToString(callbacks);
                        if (!string.IsNullOrEmpty(missingCallbacks))
                        {
                            item.ToolTipText = Tx.T("mathlib.missing callbacks") + missingCallbacks;
                        }

                        items.Add(item);
                    } catch (Exception ex) {
                        Debug.WriteLine("Can't load operator callbacks from \"" + Path.GetFileName(filename) + "\": " + ex.Message);
                    }
                }
            }

            if (Environment.Is64BitProcess)
            {
                pathBitness = Path.Combine(pathRoot, "x86");

                if (Directory.Exists(pathBitness))
                {
                    items.Add(new ToolStripSeparator());

                    foreach (string filename in Directory.EnumerateFiles(pathBitness, "*.dll"))
                    {
                        try {
                            NativeOperatorRemotingCallbacks callbacks = new NativeOperatorRemotingCallbacks(filename);

                            ToolStripMenuItem item = new ToolStripMenuItem(callbacks.ImplementationName);
                            item.ShortcutKeyDisplayString = "(x86)";
                            item.Click += OnSetItemCallbacksButtonClick;
                            item.Tag    = callbacks;

                            string missingCallbacks = ConvertMissingCallbacksToString(callbacks);
                            if (!string.IsNullOrEmpty(missingCallbacks))
                            {
                                item.ToolTipText = Tx.T("mathlib.missing callbacks") + missingCallbacks;
                            }

                            items.Add(item);
                        } catch (Exception ex) {
                            Debug.WriteLine("Can't load operator callbacks from \"" + Path.GetFileName(filename) + "\": " + ex.Message);
                        }
                    }
                }
            }
        }