Source code for LogoPlugin

"""
:filename:     LogoPlugin.py
:author:       roar@tordivel.no
:requirements: Scorpion 9.0.0.494 or higher

Scorpion sample plugin for hosting controls inside a PluginManager
hosted panel/page

::

  1.0.0.3, 11nov2015, RL: modified for autodoc
  1.0.0.2, 19mar2011: Converted to new Plugin Architecture
  1.0.0.1, 02feb2011: Initial version

"""

__version__ = '1.0.0.3'

[docs]def CreatePlugin(hWnd,name=''): ''' standard plugin creation ''' import os import types import SPB import dotNetUtils try: import clr as CLR except: import CLR import CLR.System.Windows.Forms as WinForms from CLR.System.Reflection import Assembly Assembly.LoadFrom(os.path.join(os.path.dirname(os.path.realpath(__file__)), "DynamicPropertyClass.dll")) from CLR.PythonHelpers import DynamicPropertyClass from CLR.PythonHelpers import CustomProperty from Scorpion import GetStringValue from Scorpion import GetBoolValue from Scorpion import PluginChanged class LogoPanel(WinForms.Panel): ''' LogoPanel 1.1 - .net plugin panel showing an image - typically logo TORDIVEL AS, 18mar2011, roar@tordivel.no ''' class PropertiesDialog(WinForms.Form): ''' configuration dialog for LogonPanel ''' def __init__(self): self.dataObject = None self.okButton = WinForms.Button() self.cancelButton = WinForms.Button() self.propertyGrid = WinForms.PropertyGrid() self._initializeControls() def _initializeControls(self): self.SuspendLayout() # okButton self.okButton.Anchor = WinForms.AnchorStyles.Top + WinForms.AnchorStyles.Right self.okButton.Location = CLR.System.Drawing.Point(205, 12) self.okButton.Name = "okButton" self.okButton.Size = CLR.System.Drawing.Size(75, 23) self.okButton.TabIndex = 0 self.okButton.Text = "OK" self.okButton.UseVisualStyleBackColor = True self.okButton.DialogResult = WinForms.DialogResult.OK; # cancelButton self.cancelButton.Anchor = WinForms.AnchorStyles.Top + WinForms.AnchorStyles.Right self.cancelButton.DialogResult = WinForms.DialogResult.Cancel self.cancelButton.Location = CLR.System.Drawing.Point(205, 42) self.cancelButton.Name = "cancelButton" self.cancelButton.Size = CLR.System.Drawing.Size(75, 23) self.cancelButton.TabIndex = 1 self.cancelButton.Text = "Cancel" self.cancelButton.UseVisualStyleBackColor = True # propertyGrid self.propertyGrid.Anchor = WinForms.AnchorStyles.Top + WinForms.AnchorStyles.Bottom + WinForms.AnchorStyles.Left + WinForms.AnchorStyles.Right self.propertyGrid.Location = CLR.System.Drawing.Point(13, 12) self.propertyGrid.Name = "propertyGrid" self.propertyGrid.Size = CLR.System.Drawing.Size(186, 249) self.propertyGrid.TabIndex = 2 self.propertyGrid.PropertyValueChanged += self._onPropertyValueChanged # SettingsForm self.AcceptButton = self.okButton self.AutoScaleMode = WinForms.AutoScaleMode.Font self.CancelButton = self.cancelButton self.ClientSize = CLR.System.Drawing.Size(292, 273) self.Controls.Add(self.propertyGrid) self.Controls.Add(self.cancelButton) self.Controls.Add(self.okButton) self.Name = "SettingsForm" self.StartPosition = WinForms.FormStartPosition.CenterParent self.Text = "Settings" self.ResumeLayout(False) self.Size = CLR.System.Drawing.Size(640, 480) def _onPropertyValueChanged(self, sender, propertyValueChangedEventArgs): if isinstance(self.dataObject, types.DictionaryType): if self.dataObject.has_key(propertyValueChangedEventArgs.ChangedItem.Label): newValue = propertyValueChangedEventArgs.ChangedItem.Value oldValue = self.dataObject[propertyValueChangedEventArgs.ChangedItem.Label] try: if isinstance(oldValue, str): newValue = str(newValue) elif isinstance(oldValue, int): newValue = int(newValue) elif isinstance(oldValue, float): newValue = float(newValue) elif isinstance(oldValue, bool): newValue = bool(newValue) elif isinstance(oldValue, list): newValue = [newValue] newValue.extend(oldValue[1:]) except Exception, msg: print str(msg) if newValue != None: self.dataObject[propertyValueChangedEventArgs.ChangedItem.Label] = newValue sender.Refresh() def SetDataObject(self, dataObject, readOnly = True, categories={}): # Transform dictionary for quick access tmp = {} for categoryName, propNameList in categories.iteritems(): for propertyName in propNameList: tmp[propertyName] = categoryName categories = tmp self.dataObject = dataObject properties = DynamicPropertyClass() if isinstance(self.dataObject, types.DictionaryType): for key, value in self.dataObject.iteritems(): prop = CustomProperty(key, value, readOnly, True) if hasattr(value, "Category"): prop.Category = str(getattr(value, "Category")) elif categories.has_key(key): prop.Category = str(categories[key]) if isinstance(value, types.ListType): if len(value) > 0: prop.Value = value[0] prop.IsList = True; for item in value[1:]: prop.AddListItem(str(item)) properties.Add(prop) else: pass self.propertyGrid.SelectedObject = properties class Settings(object): def __init__(self): self.FileName = "tordivel_colour_RGB_sidestilt.gif" self.Alignment = "CenterImage" self.BackColor = CLR.System.Drawing.SystemColors.Control def GetAlignmentEnum(self): return CLR.System.Enum.Parse(CLR.System.Windows.Forms.PictureBoxSizeMode, self.Alignment) def GetDataObject(self): return { "FileName" : self.FileName, "Alignment" : [self.Alignment, "AutoSize", "CenterImage", "Normal", "StretchImage", "Zoom" ], "BackColor" : self.BackColor } def UpdateDataObject(self, dataObject): self.FileName = dataObject["FileName"] self.Alignment = dataObject["Alignment"][0] self.BackColor = dataObject["BackColor"] def GetCategories(self): return { "Image" : [ "FileName", "Alignment", "BackColor" ] } def __init__(self,name): self.name=name self.settings = LogoPanel.Settings() self.Dock = WinForms.DockStyle.Fill self.DockPadding.All = 0 self.profilePath = GetStringValue("System.Profile") # Create picture box self._pictureBox = WinForms.PictureBox() self._pictureBox.Location = CLR.System.Drawing.Point(0, 0) self._pictureBox.Name = "pictureBox" self._pictureBox.Dock = WinForms.DockStyle.Fill self.Controls.Add(self._pictureBox) self._load() # Create context menu self.components = CLR.System.ComponentModel.Container() self.contextMenuStrip = WinForms.ContextMenuStrip(self.components) self.settingsToolStripMenuItem = WinForms.ToolStripMenuItem() # contextMenuStrip self.contextMenuStrip.Items.Add(self.settingsToolStripMenuItem) self.contextMenuStrip.Name = "contextMenuStrip" self.contextMenuStrip.Size = CLR.System.Drawing.Size(153, 48) self.contextMenuStrip.Opening += CLR.System.ComponentModel.CancelEventHandler(self.contextMenuStrip_Opening) # settingsToolStripMenuItem self.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem" self.settingsToolStripMenuItem.Size = CLR.System.Drawing.Size(152, 22) self.settingsToolStripMenuItem.Text = "Settings" self.settingsToolStripMenuItem.Click += self.settingsToolStripMenuItem_Click self.ContextMenuStrip = self.contextMenuStrip; def _loadImage(self, path, folder, imageName): fullPath = os.path.join(path, folder, imageName) altPath = os.path.join(path, imageName) if os.path.isfile(fullPath): return CLR.System.Drawing.Image.FromFile(fullPath) elif os.path.isfile(altPath): return CLR.System.Drawing.Image.FromFile(altPath) elif os.path.isfile(imageName): return CLR.System.Drawing.Image.FromFile(imageName) def _load(self): self._pictureBox.Image = self._loadImage(self.profilePath, "Python", self.settings.FileName) self._pictureBox.SizeMode = self.settings.GetAlignmentEnum() self._pictureBox.BackColor = self.settings.BackColor def contextMenuStrip_Opening(self, sender, args): if not GetBoolValue("System.Service"): args.Cancel = True def settingsToolStripMenuItem_Click(self, sender, args): self.configure() def __str__(self): ''' return unique plugin instance name ''' return '%s_%s'%(self.__class__.__name__,self.name) def getConfig(self): ''' return plugin configuration as string ''' import SPB spb=SPB.CreateSpb() spb.setText('Filename',self.settings.FileName) spb.setText('Alignment',self.settings.Alignment) spb.setInt('BackColor',self.settings.BackColor.ToArgb()) return spb.xml def setConfig(self,value): ''' set plugin configuration from string ''' import SPB spb=SPB.CreateSpb(value) try: if spb.isEntry('Filename'):self.settings.FileName=spb.getText('Filename') if spb.isEntry('Alignment'):self.settings.Alignment=spb.getText('Alignment') if spb.isEntry('BackColor'):self.settings.BackColor=self.settings.BackColor.FromArgb(spb.getInt('BackColor')) self._load() except: print self,': invalid configuration' def configure(self): ''' launch the plugin configuration dialog ''' dlg = LogoPanel.PropertiesDialog() dlg.SetDataObject(self.settings.GetDataObject(), False, self.settings.GetCategories()) if dlg.ShowDialog() == WinForms.DialogResult.OK: self.settings.UpdateDataObject(dlg.dataObject) self._load(); PluginChanged(self) #notify host changed backPanel = dotNetUtils.GetDotNetPanel(hWnd) panel = LogoPanel(name) panel.Parent = backPanel return panel