Statistics
| Branch: | Tag: | Revision:

root / Classes / NameAndStatusTitleView.m @ 72744ed1

History | View | Annotate | Download (9.3 kB)

1 700184fb Miltiadis Vasilakis
//
2 700184fb Miltiadis Vasilakis
//  NameAndStatusTitleView.m
3 700184fb Miltiadis Vasilakis
//  OpenStack
4 700184fb Miltiadis Vasilakis
//
5 700184fb Miltiadis Vasilakis
//  Created by Michael Mayo on 3/22/11.
6 700184fb Miltiadis Vasilakis
//  Copyright 2011 __MyCompanyName__. All rights reserved.
7 700184fb Miltiadis Vasilakis
//
8 700184fb Miltiadis Vasilakis
9 700184fb Miltiadis Vasilakis
#import "NameAndStatusTitleView.h"
10 700184fb Miltiadis Vasilakis
#import "Server.h"
11 700184fb Miltiadis Vasilakis
#import "Image.h"
12 700184fb Miltiadis Vasilakis
#import "DDProgressView.h"
13 700184fb Miltiadis Vasilakis
#import <QuartzCore/QuartzCore.h>
14 700184fb Miltiadis Vasilakis
15 700184fb Miltiadis Vasilakis
static CGFloat iPadXOffset;
16 700184fb Miltiadis Vasilakis
static CGFloat logoXOffset;
17 700184fb Miltiadis Vasilakis
18 700184fb Miltiadis Vasilakis
@implementation NameAndStatusTitleView
19 700184fb Miltiadis Vasilakis
20 700184fb Miltiadis Vasilakis
@synthesize entity, statusTint, nameLabel, statusLabel, logoView, logoFilename, progressView;
21 700184fb Miltiadis Vasilakis
22 700184fb Miltiadis Vasilakis
static UIFont *nameFont = nil;
23 700184fb Miltiadis Vasilakis
static UIFont *statusFont = nil;
24 700184fb Miltiadis Vasilakis
25 700184fb Miltiadis Vasilakis
+ (void)initialize {
26 700184fb Miltiadis Vasilakis
    nameFont = [[UIFont boldSystemFontOfSize:17.0] retain];
27 700184fb Miltiadis Vasilakis
    statusFont = [[UIFont boldSystemFontOfSize:13.0] retain];
28 700184fb Miltiadis Vasilakis
}
29 700184fb Miltiadis Vasilakis
30 700184fb Miltiadis Vasilakis
- (id)initWithEntity:(id)e logoFilename:(NSString *)filename {
31 700184fb Miltiadis Vasilakis
    
32 700184fb Miltiadis Vasilakis
    self = [self initWithFrame:CGRectMake(0, 0, 1320, 64)];
33 700184fb Miltiadis Vasilakis
    if (self) {
34 700184fb Miltiadis Vasilakis
        self.entity = e;
35 700184fb Miltiadis Vasilakis
        self.logoFilename = filename;
36 700184fb Miltiadis Vasilakis
        
37 700184fb Miltiadis Vasilakis
        logoXOffset = self.logoFilename ? 44 : 0;
38 700184fb Miltiadis Vasilakis
        iPadXOffset = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 29 : 0;
39 700184fb Miltiadis Vasilakis
        
40 700184fb Miltiadis Vasilakis
        if (!([self.entity respondsToSelector:@selector(name)] && [self.entity respondsToSelector:@selector(status)] && [self.entity respondsToSelector:@selector(progress)] && [self.entity respondsToSelector:@selector(shouldBePolled)])) {
41 700184fb Miltiadis Vasilakis
            @throw [NSException exceptionWithName:@"NameAndStatusEntityInvalidException" reason:@"entity for NameAndStatusTitleView should respond to name, status, progress, shouldBePolled" userInfo:nil];
42 700184fb Miltiadis Vasilakis
        }
43 700184fb Miltiadis Vasilakis
44 700184fb Miltiadis Vasilakis
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
45 700184fb Miltiadis Vasilakis
            self.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
46 700184fb Miltiadis Vasilakis
        } else {
47 700184fb Miltiadis Vasilakis
            self.backgroundColor = [UIColor groupTableViewBackgroundColor];
48 700184fb Miltiadis Vasilakis
        }
49 700184fb Miltiadis Vasilakis
50 700184fb Miltiadis Vasilakis
        self.autoresizingMask = UIViewAutoresizingFlexibleWidth;
51 700184fb Miltiadis Vasilakis
        
52 700184fb Miltiadis Vasilakis
        // shadow
53 700184fb Miltiadis Vasilakis
        self.clipsToBounds = NO;
54 700184fb Miltiadis Vasilakis
        [self.layer setShadowColor:[[UIColor blackColor] CGColor]];
55 700184fb Miltiadis Vasilakis
        [self.layer setShadowRadius:2.0f];
56 700184fb Miltiadis Vasilakis
        [self.layer setShadowOffset:CGSizeMake(1, 1)];
57 700184fb Miltiadis Vasilakis
        [self.layer setShadowOpacity:0.8f];    
58 700184fb Miltiadis Vasilakis
        
59 700184fb Miltiadis Vasilakis
        nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(12.0 + logoXOffset + iPadXOffset, 12.0, 654, 22)];
60 700184fb Miltiadis Vasilakis
        
61 700184fb Miltiadis Vasilakis
        nameLabel.backgroundColor = [UIColor clearColor];
62 700184fb Miltiadis Vasilakis
        nameLabel.textColor = [UIColor whiteColor];
63 700184fb Miltiadis Vasilakis
        nameLabel.font = nameFont;
64 700184fb Miltiadis Vasilakis
        nameLabel.text = [self.entity name];
65 700184fb Miltiadis Vasilakis
        nameLabel.adjustsFontSizeToFitWidth = YES;
66 700184fb Miltiadis Vasilakis
        [nameLabel.layer setShadowColor:[[UIColor blackColor] CGColor]];        
67 700184fb Miltiadis Vasilakis
        [nameLabel.layer setShadowRadius:1.0f];
68 700184fb Miltiadis Vasilakis
        [nameLabel.layer setShadowOffset:CGSizeMake(1, 1)];
69 700184fb Miltiadis Vasilakis
        [nameLabel.layer setShadowOpacity:1.0f];
70 700184fb Miltiadis Vasilakis
        
71 700184fb Miltiadis Vasilakis
        [self addSubview:nameLabel];
72 700184fb Miltiadis Vasilakis
        
73 700184fb Miltiadis Vasilakis
        CGSize statusSize = [[self.entity status] sizeWithFont:statusFont forWidth:300 lineBreakMode:UILineBreakModeCharacterWrap];
74 700184fb Miltiadis Vasilakis
        statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(12.0 + logoXOffset + iPadXOffset, 34.0, 200, statusSize.height)];
75 700184fb Miltiadis Vasilakis
        statusLabel.backgroundColor = [UIColor clearColor];
76 700184fb Miltiadis Vasilakis
        statusLabel.textColor = [UIColor whiteColor];
77 700184fb Miltiadis Vasilakis
        statusLabel.font = statusFont;
78 700184fb Miltiadis Vasilakis
        statusLabel.text = [self.entity status];
79 700184fb Miltiadis Vasilakis
        statusLabel.lineBreakMode = UILineBreakModeCharacterWrap;
80 700184fb Miltiadis Vasilakis
        statusLabel.numberOfLines = 0;
81 700184fb Miltiadis Vasilakis
//        statusLabel.shadowOffset = CGSizeMake(0, 1.0);
82 700184fb Miltiadis Vasilakis
//        statusLabel.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.4];    
83 700184fb Miltiadis Vasilakis
        [statusLabel.layer setShadowColor:[[UIColor blackColor] CGColor]];        
84 700184fb Miltiadis Vasilakis
        [statusLabel.layer setShadowRadius:1.0f];
85 700184fb Miltiadis Vasilakis
        [statusLabel.layer setShadowOffset:CGSizeMake(1, 1)];
86 700184fb Miltiadis Vasilakis
        [statusLabel.layer setShadowOpacity:1.0f];
87 700184fb Miltiadis Vasilakis
        [self addSubview:statusLabel];
88 700184fb Miltiadis Vasilakis
        
89 700184fb Miltiadis Vasilakis
        self.statusTint = [[[UIView alloc] initWithFrame:self.frame] autorelease];
90 700184fb Miltiadis Vasilakis
        self.statusTint.autoresizesSubviews = YES;
91 700184fb Miltiadis Vasilakis
        self.statusTint.autoresizingMask = UIViewAutoresizingFlexibleWidth;
92 700184fb Miltiadis Vasilakis
        self.statusTint.alpha = 0.7;
93 700184fb Miltiadis Vasilakis
        
94 700184fb Miltiadis Vasilakis
        if ([@"ACTIVE" isEqualToString:[self.entity status]]) {
95 700184fb Miltiadis Vasilakis
            self.statusTint.backgroundColor = [UIColor colorWithRed:0.314 green:0.588 blue:0.086 alpha:1.0];
96 700184fb Miltiadis Vasilakis
        } else if ([self.entity shouldBePolled]) {
97 700184fb Miltiadis Vasilakis
            self.statusTint.backgroundColor = [UIColor orangeColor];
98 700184fb Miltiadis Vasilakis
        } else {
99 700184fb Miltiadis Vasilakis
            self.statusTint.backgroundColor = [UIColor redColor];
100 700184fb Miltiadis Vasilakis
        }
101 700184fb Miltiadis Vasilakis
        
102 700184fb Miltiadis Vasilakis
        [self addSubview:self.statusTint];
103 700184fb Miltiadis Vasilakis
        [self sendSubviewToBack:self.statusTint];
104 700184fb Miltiadis Vasilakis
        
105 700184fb Miltiadis Vasilakis
        if (self.logoFilename) {
106 700184fb Miltiadis Vasilakis
            logoView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.logoFilename]];
107 700184fb Miltiadis Vasilakis
            logoView.frame = CGRectMake(12.0 + iPadXOffset, 14.0, logoView.frame.size.width, logoView.frame.size.height);
108 700184fb Miltiadis Vasilakis
            logoView.clipsToBounds = NO;
109 700184fb Miltiadis Vasilakis
            [logoView.layer setShadowColor:[[UIColor blackColor] CGColor]];
110 700184fb Miltiadis Vasilakis
            [logoView.layer setShadowRadius:1.0f];
111 700184fb Miltiadis Vasilakis
            [logoView.layer setShadowOffset:CGSizeMake(1, 1)];
112 700184fb Miltiadis Vasilakis
            [logoView.layer setShadowOpacity:0.8f];
113 700184fb Miltiadis Vasilakis
            [self addSubview:logoView];    
114 700184fb Miltiadis Vasilakis
        }
115 700184fb Miltiadis Vasilakis
116 700184fb Miltiadis Vasilakis
        self.progressView = [[[DDProgressView alloc] initWithFrame:CGRectMake(70 + logoXOffset + iPadXOffset, 37, 100, 20)] autorelease];
117 700184fb Miltiadis Vasilakis
        self.progressView.progress = 0.0;
118 700184fb Miltiadis Vasilakis
        [self.progressView.layer setShadowColor:[[UIColor blackColor] CGColor]];        
119 700184fb Miltiadis Vasilakis
        [self.progressView.layer setShadowRadius:1.0f];
120 700184fb Miltiadis Vasilakis
        [self.progressView.layer setShadowOffset:CGSizeMake(1, 1)];
121 700184fb Miltiadis Vasilakis
        [self.progressView.layer setShadowOpacity:1.0f];
122 700184fb Miltiadis Vasilakis
        
123 700184fb Miltiadis Vasilakis
        [self addSubview:progressView];
124 700184fb Miltiadis Vasilakis
    }
125 700184fb Miltiadis Vasilakis
    return self;
126 700184fb Miltiadis Vasilakis
}
127 700184fb Miltiadis Vasilakis
128 700184fb Miltiadis Vasilakis
- (id)initWithEntity:(id)e {
129 700184fb Miltiadis Vasilakis
    return [self initWithEntity:e logoFilename:nil];
130 700184fb Miltiadis Vasilakis
}
131 700184fb Miltiadis Vasilakis
132 700184fb Miltiadis Vasilakis
- (void)drawRect:(CGRect)rect {
133 700184fb Miltiadis Vasilakis
134 700184fb Miltiadis Vasilakis
    self.nameLabel.text = [self.entity name];
135 700184fb Miltiadis Vasilakis
136 700184fb Miltiadis Vasilakis
    if ([[self.entity status] isEqualToString:@"BUILD"]) {
137 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 1;
138 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Building";
139 700184fb Miltiadis Vasilakis
        self.progressView.frame = CGRectMake(70 + logoXOffset + iPadXOffset, 37, 100, 20);
140 700184fb Miltiadis Vasilakis
    } else if ([[self.entity status] isEqualToString:@"QUEUE_RESIZE"]) {
141 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 1;
142 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Resizing"; //@"Queueing";
143 700184fb Miltiadis Vasilakis
        self.progressView.frame = CGRectMake(70 + logoXOffset + iPadXOffset, 37, 100, 20);
144 700184fb Miltiadis Vasilakis
    } else if ([[self.entity status] isEqualToString:@"PREP_RESIZE"]) {
145 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 1;
146 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Resizing"; //@"Preparing";
147 700184fb Miltiadis Vasilakis
        self.progressView.frame = CGRectMake(70 + logoXOffset + iPadXOffset, 37, 100, 20);
148 700184fb Miltiadis Vasilakis
    } else if ([[self.entity status] isEqualToString:@"RESIZE"]) {
149 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 1;
150 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Resizing";
151 700184fb Miltiadis Vasilakis
        self.progressView.frame = CGRectMake(70 + logoXOffset + iPadXOffset, 37, 100, 20);
152 700184fb Miltiadis Vasilakis
    } else if ([[self.entity status] isEqualToString:@"VERIFY_RESIZE"]) {
153 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 0;
154 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Resize Complete";
155 700184fb Miltiadis Vasilakis
    } else if ([[self.entity status] isEqualToString:@"REBUILD"]) {
156 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 1;
157 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Rebuilding";
158 700184fb Miltiadis Vasilakis
        self.progressView.frame = CGRectMake(70 + logoXOffset + iPadXOffset, 37, 100, 20);
159 700184fb Miltiadis Vasilakis
    } else if ([[self.entity status] isEqualToString:@"REBOOT"]) {
160 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 0;
161 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Rebooting";        
162 700184fb Miltiadis Vasilakis
    } else if ([[self.entity status] isEqualToString:@"UNKNOWN"]) {
163 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 0;
164 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Unknown";
165 700184fb Miltiadis Vasilakis
    } else if ([[self.entity status] isEqualToString:@"ACTIVE"]) {
166 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 0;
167 700184fb Miltiadis Vasilakis
        self.statusLabel.text = @"Active";
168 700184fb Miltiadis Vasilakis
    } else {
169 700184fb Miltiadis Vasilakis
        self.progressView.alpha = 0;
170 700184fb Miltiadis Vasilakis
        self.statusLabel.text = [self.entity status];
171 700184fb Miltiadis Vasilakis
    }
172 700184fb Miltiadis Vasilakis
    
173 7db1712d Miltiadis Vasilakis
    [self.progressView setProgress:[(Server *)self.entity progress] / 100.0 animated:YES];
174 700184fb Miltiadis Vasilakis
    
175 700184fb Miltiadis Vasilakis
    if (![@"ACTIVE" isEqualToString:[self.entity status]]) {        
176 700184fb Miltiadis Vasilakis
177 700184fb Miltiadis Vasilakis
        if ([self.entity shouldBePolled]) {
178 700184fb Miltiadis Vasilakis
            self.statusTint.backgroundColor = [UIColor orangeColor];
179 700184fb Miltiadis Vasilakis
        } else {
180 700184fb Miltiadis Vasilakis
            self.statusTint.backgroundColor = [UIColor redColor];
181 700184fb Miltiadis Vasilakis
        }        
182 700184fb Miltiadis Vasilakis
        
183 700184fb Miltiadis Vasilakis
        if (![self.statusTint.layer animationForKey:@"animateOpacity"]) {
184 700184fb Miltiadis Vasilakis
            CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
185 700184fb Miltiadis Vasilakis
            animation.duration = 1.0;
186 700184fb Miltiadis Vasilakis
            animation.repeatCount = HUGE_VALF; // repeat forever      
187 700184fb Miltiadis Vasilakis
            animation.autoreverses = YES;	
188 700184fb Miltiadis Vasilakis
            animation.fromValue = [NSNumber numberWithFloat:1.0]; 
189 700184fb Miltiadis Vasilakis
            animation.toValue = [NSNumber numberWithFloat:0.5];
190 700184fb Miltiadis Vasilakis
            [self.statusTint.layer addAnimation:animation forKey:@"animateOpacity"];
191 700184fb Miltiadis Vasilakis
        }
192 700184fb Miltiadis Vasilakis
    } else {
193 700184fb Miltiadis Vasilakis
        [UIView animateWithDuration:1 animations:^{
194 700184fb Miltiadis Vasilakis
            if ([@"ACTIVE" isEqualToString:[self.entity status]]) {
195 700184fb Miltiadis Vasilakis
                [self.statusTint.layer removeAnimationForKey:@"animateOpacity"];
196 700184fb Miltiadis Vasilakis
                self.statusTint.backgroundColor = [UIColor colorWithRed:0.314 green:0.588 blue:0.086 alpha:1.0];
197 700184fb Miltiadis Vasilakis
            } else if ([self.entity shouldBePolled]) {
198 700184fb Miltiadis Vasilakis
                self.statusTint.backgroundColor = [UIColor orangeColor];
199 700184fb Miltiadis Vasilakis
            } else {
200 700184fb Miltiadis Vasilakis
                self.statusTint.backgroundColor = [UIColor redColor];
201 700184fb Miltiadis Vasilakis
            }
202 700184fb Miltiadis Vasilakis
        }];
203 700184fb Miltiadis Vasilakis
    }
204 700184fb Miltiadis Vasilakis
    [super drawRect:rect];
205 700184fb Miltiadis Vasilakis
}
206 700184fb Miltiadis Vasilakis
207 700184fb Miltiadis Vasilakis
- (void)dealloc {
208 700184fb Miltiadis Vasilakis
    [entity release];
209 700184fb Miltiadis Vasilakis
    [statusTint release];
210 700184fb Miltiadis Vasilakis
    [nameLabel release];
211 700184fb Miltiadis Vasilakis
    [statusLabel release];
212 700184fb Miltiadis Vasilakis
    [logoView release];
213 700184fb Miltiadis Vasilakis
    [logoFilename release];
214 700184fb Miltiadis Vasilakis
    [progressView release];
215 700184fb Miltiadis Vasilakis
    [super dealloc];
216 700184fb Miltiadis Vasilakis
}
217 700184fb Miltiadis Vasilakis
218 700184fb Miltiadis Vasilakis
@end