1# -*- coding: utf-8 -*-2# Copyright 2011 Takeshi KOMIYA3#4# Licensed under the Apache License, Version 2.0 (the "License");5# you may not use this file except in compliance with the License.6# You may obtain a copy of the License at7#8# http://www.apache.org/licenses/LICENSE-2.09#10# Unless required by applicable law or agreed to in writing, software11# distributed under the License is distributed on an "AS IS" BASIS,12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13# See the License for the specific language governing permissions and14# limitations under the License.1516import blockdiag.elements171819class DiagramNode(blockdiag.elements.DiagramNode):20 pass212223class FieldItem(blockdiag.elements.DiagramNode):24 shape = '_packet_node'25 desctable = ['number', 'label', 'description']26 attrname = dict(number='Seq', label='Name', description='Description')2728 def __init__(self, begin, end, label):29 super(FieldItem, self).__init__(None)30 self.label = label31 self.separated_right = False32 self.separated_left = False3334 if begin is None:35 self.number = None36 self.colwidth = 137 elif end is None:38 self.number = int(begin)39 self.colwidth = 140 else:41 self.number = int(begin)42 self.colwidth = int(end) - int(begin) + 14344 if self.colwidth <= 0:45 msg = ("Invalid field size definition: %d-%d: %s\n" %46 (begin, end, label))47 raise AttributeError(msg)4849 def set_height(self, value):50 self.colheight = int(value)5152 def set_len(self, value):53 self.colwidth = int(value)545556class Diagram(blockdiag.elements.Diagram):57 _DiagramNode = FieldItem5859 def __init__(self):60 super(Diagram, self).__init__()61 self.colwidth = 1662 self.scale_interval = None63 self.scale_direction = "left_to_right"6465 self.int_attrs.append('scale_interval')666768 def fields(self):69 return self.nodes7071 def set_scale_direction(self, value):72 value = value.lower()73 if value in ('ltr', 'left_to_right'):74 self.scale_direction = 'left_to_right'75 elif value in ('rtl', 'right_to_left'):76 self.scale_direction = 'right_to_left'77 else:78 msg = "unknown scale_direction: %s\n" % value79 raise AttributeError(msg)